PHP 面向?qū)ο蠡A(chǔ)(接口,類),php面向_PHP教程
Jul 12, 2016 am 08:52 AMPHP 面向?qū)ο蠡A(chǔ)(接口,類),php面向
介紹PHP面向?qū)ο蟮幕A(chǔ)知識
1. 接口的定義interface ,類定義class,類支持abstract和final修飾符,abstract修飾為抽象類,抽象類
不支持直接實(shí)例化,final修飾的類/方法不能被繼承/方法重寫.
2. 接口的實(shí)現(xiàn)通過implements,類繼承extends
<span>interface</span><span> IShape{ </span><span>function</span><span> draw_core(); }; </span><span>class</span> PathShape <span>implements</span><span> IShape{ </span><span>public</span> <span>function</span><span> draw_core(){} } </span><span>class</span> Rectangle <span>extends</span><span> PathShape{ </span><span>public</span> <span>function</span><span> draw_core(){ </span><span>//</span><span>overide draw_core</span> <span> } }</span>
3.靜態(tài)變量和常量(static ,const )
a.常量聲明變量名前面不需要加美元修飾符$,靜態(tài)變量需要
b.兩者都通過類訪問,靜態(tài)變量方法時(shí)候需要在變量名前加$美元修飾符好
<span>class</span><span> MyClass{ </span><span>const</span><span> M_CONST_VALUE; </span><span>static</span> <span>$M_STATIC_VALUE</span><span>; } MyClass</span>::<span>M_CONST_VALUE ; MyClass</span>::<span>$M_STATIC_VALUE</span>;
c.常量聲明時(shí)候不支持訪問權(quán)限修飾符,不能在const前加public,常量默認(rèn)就是public。
<span>const</span> M_CONST ; <span>//</span><span>OK</span> <span>public</span> <span>const</span> M_CONST ; <span>//</span><span> throw exception</span>
4.類內(nèi)部訪問非靜態(tài)/常量變量和方法通過$this,訪問父類通過parent,在類內(nèi)部訪問靜態(tài)變量和方法可以通過
self,self本質(zhì)是指向該類也可以通過static訪問
parent::method(); <span>//</span><span>父類方法</span> <span>$this</span>->method() ; <span>//</span><span>方法實(shí)例方法</span> self::<span>$static_value</span> ;<span>//</span><span>訪問靜態(tài)變量</span> <span>static</span>::<span>$static_value</span>;<span>//</span><span>同上</span>
5.static和self的區(qū)別在于self指的是解析上下文,也是是作用與當(dāng)前類,static指的是被調(diào)用
的類而不是包含類,典型的例子就是單例
<span>abstract</span> <span>class</span><span> ParentClass{ </span><span>public</span> <span>static</span> <span>function</span><span> createInstance(){ </span><span>return</span> <span>new</span> <span>static</span><span>(); </span><span>//</span><span>這里不能使用self,因?yàn)閟elf本意其實(shí)指向parentclass的 //如果你使用了self,那么將拋出異常,提示抽象類無法實(shí)例化 //而static并不直接指向parentclass而是作用與包含類 //</span> <span> } } </span><span>class</span> ChildClass <span>extends</span><span> ParentClass{ </span><span>// </span> }
7.類中使用攔截器,PHP攔截器有__get,__set,__inset,__unset,__call,這里只關(guān)注geth和set攔截器
__get(<span>$property</span><span>) 當(dāng)訪問未定義的屬性時(shí)候該方法被調(diào)用 __set(</span><span>$property</span>,<span>$value</span><span>)當(dāng)給未定義的屬性賦值時(shí)被調(diào)用 </span><span>class</span><span> MyClass{ </span><span>public</span> <span>function</span> __get(<span>$property</span><span>){ </span><span>echo</span> "Access __get"<span>; </span><span>if</span>(property_exists(<span>$this</span>,<span>$property</span><span>)){ </span><span>return</span> <span>$this</span>-><span>$property</span><span>; }</span><span>else</span><span>{ </span><span>return</span> "unknown"<span>; } } </span><span>public</span> <span>function</span> __set(<span>$property</span>,<span>$value</span><span>){ </span><span>if</span>(!property_exists(<span>$this</span>,<span>$property</span><span>)){ </span><span>$this</span>->Name = <span>$value</span>; <span>//</span><span>變量不存在就直接給$Name賦值</span> <span> } } </span><span>public</span> <span>$Name</span> = "visonme"<span>; }; </span><span>//</span><span>訪問</span> <span>$obj</span> = <span>new</span><span> MyClass(); </span><span>$obj</span>->Name ; <span>//</span><span>直接訪問變量$Name</span> <span>$obj</span>->Password;<span>//</span><span>Password未定義,先訪問__get最后輸出unknown //-for __set</span> <span>$obj</span>->password = 'fz-visonme';<span>//</span><span>password不存在,那么將走_(dá)_setz最后給$Name賦值</span> <span>echo</span> <span>$obj</span>->Name ; <span>//</span><span> output: fz-visonme</span>
8.類構(gòu)造函數(shù)和析構(gòu)函數(shù):__construct, __destruct ,構(gòu)造函數(shù)實(shí)例化對象時(shí)候調(diào)用,多用于成員變量初始化工作,析構(gòu)在類銷毀時(shí)候調(diào)用,多用于收尾工作
<span>class</span><span> MyClass{ </span><span>function</span><span> __construct(){} </span><span>function</span><span> __destruct(){} }</span>
9.對象的復(fù)制通過clone,clone關(guān)鍵字使用“值復(fù)制"方式來產(chǎn)生一個(gè)新的對象,對于對象復(fù)制本身還是走引用復(fù)制的。
a.簡單類型賦值
<span>class</span><span> MyClass{ </span><span>public</span> <span>$ID</span><span>; }; </span><span>$a</span> = <span>new</span><span> MyClass; </span><span>$a</span>->ID = 199<span>; </span><span>$b</span> = <span>clone</span> <span>$a</span><span>; </span><span>echo</span> <span>$b</span>->ID; <span>//</span><span> output: 199</span>
b.包含對象的復(fù)制
<span>class</span><span> Account{ </span><span>public</span> <span>$RMB</span><span>; }; </span><span>class</span><span> MyClass{ </span><span>public</span> <span>$ID</span><span>; </span><span>public</span> <span>$AccountObj</span><span>; </span><span>public</span> <span>function</span> __construct(<span>$c</span><span>){ </span><span>$this</span>->AccountObj = <span>$c</span><span>; } }; </span><span>$a</span> = <span>new</span> MyClass(<span>new</span><span> Account()); </span><span>$a</span>->AccountObj->RMB= 199<span>; </span><span>$b</span> = <span>clone</span> <span>$a</span><span>; </span><span>echo</span> <span>$b</span>->AccountObj->RMB; <span>//</span><span>output: 199</span> <span>$a</span>->AccountObj->RMB = 100<span>; </span><span>echo</span> <span>$b</span>->AccountObj->RMB; <span>//</span><span>output: 100</span> <span> 在clone后,</span><span>$a的AccountObj改變時(shí)候</span>,同時(shí)會(huì)影響到<span>$b</span>
這種結(jié)果顯然不是我們所期望的,我們所期望的是ab是兩個(gè)不存在任何關(guān)聯(lián)的獨(dú)立對象.
為了解決這個(gè)問題我么可以在類內(nèi)部實(shí)現(xiàn)__clone,當(dāng)我們在外面調(diào)用clone時(shí)候其內(nèi)部會(huì)調(diào)用類的__clonef方法,所以我們可以通過重寫__clone來達(dá)到對clone的控制.例如針對b例子的改造
<span>class</span><span> MyClass{ </span><span>public</span> <span>$ID</span><span>; </span><span>public</span> <span>$AccountObj</span><span>; </span><span>public</span> <span>function</span> __construct(<span>$c</span><span>){ </span><span>$this</span>->AccountObj = <span>$c</span><span>; } </span><span>//</span><span>__clone實(shí)現(xiàn)clone的控制 //這里內(nèi)部同時(shí)對Account實(shí)現(xiàn)一次clone,這里就可以避免b例子中出現(xiàn)的問題</span> <span>public</span> <span>function</span><span> __clone(){ </span><span>$this</span>->ID = 0 ; <span>//</span><span>將ID置為0,如果你需要的話</span> <span>$this</span>->AccountObj = <span>clone</span> <span>$this</span>-><span>AccountObj; } };</span>
關(guān)于__clone方法我們需要知道,該方法是在被clone后的對象上調(diào)用,而不是在原始的對象上面運(yùn)行的,例如上b例子中
? $b = clone $a ; //執(zhí)行的過程: 基本復(fù)制對象$a ---> $b執(zhí)行__clone()?
?
?

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Schnittstellen und abstrakte Klassen werden in Entwurfsmustern zur Entkopplung und Erweiterbarkeit verwendet. Schnittstellen definieren Methodensignaturen, abstrakte Klassen stellen eine teilweise Implementierung bereit und Unterklassen müssen nicht implementierte Methoden implementieren. Im Strategiemuster wird die Schnittstelle zum Definieren des Algorithmus verwendet, und die abstrakte Klasse oder konkrete Klasse stellt die Implementierung bereit, wodurch ein dynamischer Wechsel von Algorithmen erm?glicht wird. Im Beobachtermuster werden Schnittstellen zum Definieren des Beobachterverhaltens verwendet, und abstrakte oder konkrete Klassen werden zum Abonnieren und Ver?ffentlichen von Benachrichtigungen verwendet. Im Adaptermuster werden Schnittstellen verwendet, um vorhandene Klassen anzupassen, oder konkrete Klassen k?nnen kompatible Schnittstellen implementieren und so eine Interaktion mit Originalcode erm?glichen.

Golang hat keine abstrakten Klassen. Golang ist keine objektorientierte (OOP) Sprache. Es gibt keine Konzepte für Klassen, Vererbung und abstrakte Klassen. Es gibt jedoch Strukturen (Strukturen) und Schnittstellen (Schnittstellen), die indirekt durch die Kombination von implementiert werden k?nnen Struktur und Schnittstelle. Abstrakte Klassen in Objektsprachen.

Schnittstellen und abstrakte Klassen werden verwendet, um erweiterbaren PHP-Code zu erstellen, und es gibt den folgenden Hauptunterschied zwischen ihnen: Schnittstellen erzwingen durch Implementierung, w?hrend abstrakte Klassen durch Vererbung erzwungen werden. Schnittstellen k?nnen keine konkreten Methoden enthalten, abstrakte Klassen hingegen schon. Eine Klasse kann mehrere Schnittstellen implementieren, aber nur von einer abstrakten Klasse erben. Schnittstellen k?nnen nicht instanziiert werden, abstrakte Klassen jedoch schon.

Der Hauptunterschied zwischen einer abstrakten Klasse und einer Schnittstelle besteht darin, dass eine abstrakte Klasse die Implementierung einer Methode enthalten kann, w?hrend eine Schnittstelle nur die Signatur einer Methode definieren kann. 1. Die abstrakte Klasse wird unter Verwendung eines abstrakten Schlüsselworts definiert, das abstrakte und konkrete Methoden enthalten kann, die für die Bereitstellung von Standardimplementierungen und zur gemeinsamen Code geeignet sind. 2. Die Schnittstelle wird mit dem Schlüsselwort der Schnittstelle definiert, das nur Methodensignaturen enth?lt, die zur Definition von Verhaltensnormen und zur Mehrfachvererbung geeignet sind.

Für die Wiederverwendbarkeit von Code werden sowohl funktionale Schnittstellen als auch abstrakte Klassen verwendet, sie werden jedoch auf unterschiedliche Weise implementiert: funktionale Schnittstellen durch Referenzfunktionen, abstrakte Klassen durch Vererbung. Funktionale Schnittstellen k?nnen nicht instanziiert werden, abstrakte Klassen jedoch schon. Funktionale Schnittstellen müssen alle deklarierten Methoden implementieren, w?hrend abstrakte Klassen nur einige Methoden implementieren k?nnen.

Java erm?glicht die Definition innerer Klassen innerhalb von Schnittstellen und abstrakten Klassen und bietet so Flexibilit?t für die Wiederverwendung und Modularisierung von Code. Innere Klassen in Schnittstellen k?nnen spezifische Funktionen implementieren, w?hrend innere Klassen in abstrakten Klassen allgemeine Funktionen definieren k?nnen und Unterklassen konkrete Implementierungen bereitstellen.

Schnittstelle: Eine implementierte Vertragsschnittstelle definiert eine Reihe von Methodensignaturen in Java, stellt jedoch keine konkrete Implementierung bereit. Es fungiert als Vertrag, der Klassen, die die Schnittstelle implementieren, dazu zwingt, ihre angegebenen Methoden zu implementieren. Die Methoden in der Schnittstelle sind abstrakte Methoden und haben keinen Methodenk?rper. Codebeispiel: publicinterfaceAnimal{voideat();voidsleep();} Abstrakte Klasse: Teilweise implementierter Entwurf Eine abstrakte Klasse ist eine übergeordnete Klasse, die eine teilweise Implementierung bereitstellt, die von ihren Unterklassen geerbt werden kann. Im Gegensatz zu Schnittstellen k?nnen abstrakte Klassen konkrete Implementierungen und abstrakte Methoden enthalten. Abstrakte Methoden werden mit dem Schlüsselwort abstract deklariert und müssen von Unterklassen überschrieben werden. Codebeispiel: publicabstractcla

Interface Interface definiert abstrakte Methoden und Konstanten in Java. Die Methoden in der Schnittstelle sind nicht implementiert, sondern werden von der Klasse bereitgestellt, die die Schnittstelle implementiert. Die Schnittstelle definiert einen Vertrag, der erfordert, dass die Implementierungsklasse bestimmte Methodenimplementierungen bereitstellt. Deklarieren Sie die Schnittstelle: publicinterfaceExampleInterface{voiddoSomething();intgetSomething();} Abstrakte Klasse Eine abstrakte Klasse ist eine Klasse, die nicht instanziiert werden kann. Es enth?lt eine Mischung aus abstrakten und nicht-abstrakten Methoden. ?hnlich wie Schnittstellen werden abstrakte Methoden in abstrakten Klassen durch Unterklassen implementiert. Abstrakte Klassen k?nnen jedoch auch konkrete Methoden enthalten, die Standardimplementierungen bereitstellen. Deklarieren Sie die abstrakte Klasse: publicabstractcl
