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修飾為抽象類,抽象類
不支持直接實例化,final修飾的類/方法不能被繼承/方法重寫.
2. 接口的實現(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)變量方法時候需要在變量名前加$美元修飾符好
<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.常量聲明時候不支持訪問權(quán)限修飾符,不能在const前加public,常量默認就是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>方法實例方法</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指的是解析上下文,也是是作用與當前類,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,因為self本意其實指向parentclass的 //如果你使用了self,那么將拋出異常,提示抽象類無法實例化 //而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>) 當訪問未定義的屬性時候該方法被調(diào)用 __set(</span><span>$property</span>,<span>$value</span><span>)當給未定義的屬性賦值時被調(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不存在,那么將走__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ù)實例化對象時候調(diào)用,多用于成員變量初始化工作,析構(gòu)在類銷毀時候調(diào)用,多用于收尾工作
<span>class</span><span> MyClass{ </span><span>function</span><span> __construct(){} </span><span>function</span><span> __destruct(){} }</span>
9.對象的復制通過clone,clone關(guān)鍵字使用“值復制"方式來產(chǎn)生一個新的對象,對于對象復制本身還是走引用復制的。
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.包含對象的復制
<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改變時候</span>,同時會影響到<span>$b</span>
這種結(jié)果顯然不是我們所期望的,我們所期望的是ab是兩個不存在任何關(guān)聯(lián)的獨立對象.
為了解決這個問題我么可以在類內(nèi)部實現(xiàn)__clone,當我們在外面調(diào)用clone時候其內(nèi)部會調(diào)用類的__clonef方法,所以我們可以通過重寫__clone來達到對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實現(xiàn)clone的控制 //這里內(nèi)部同時對Account實現(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)用,而不是在原始的對象上面運行的,例如上b例子中
? $b = clone $a ; //執(zhí)行的過程: 基本復制對象$a ---> $b執(zhí)行__clone()?
?
?

? AI ??

Undress AI Tool
??? ???? ??

Undresser.AI Undress
???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover
???? ?? ???? ??? AI ?????.

Clothoff.io
AI ? ???

Video Face Swap
??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

?? ??

??? ??

???++7.3.1
???? ?? ?? ?? ???

SublimeText3 ??? ??
??? ??, ???? ?? ????.

???? 13.0.1 ???
??? PHP ?? ?? ??

???? CS6
??? ? ?? ??

SublimeText3 Mac ??
? ??? ?? ?? ?????(SublimeText3)

?????? ?? ???? ?? ? ???? ?? ??? ??? ?????. ?????? ??? ????? ???? ?? ???? ?? ??? ???? ?? ???? ???? ?? ???? ???? ???. ?? ????? ?????? ???? ????? ???? ?? ??? ?? ?? ???? ?? ??? ????? ????? ???? ??? ? ????. ??? ???? ?????? ??? ??? ???? ? ???? ?? ?? ???? ???? ??? ???? ???? ? ?????. ??? ???? ?????? ?? ???? ???? ? ?????. ?? ??? ?? ???? ???? ???? ?????? ???? ?? ??? ?? ??? ? ????.

Golang?? ?? ???? ????. Golang? ????(OOP) ??? ??? ???, ??, ?? ???? ??? ????. ??? golang?? ??(???)? ?????(?????)? ???, ?? ??? ?? ??? ?? ????? ??? ? ????. ?? ??? ?? ???.

?????? ?? ???? ?? ??? PHP ??? ???? ? ???? ??? ?? ?? ???? ????. ?????? ??? ?? ???? ?? ?? ???? ??? ?? ?????. ??????? ???? ???? ??? ? ??? ?? ????? ??? ? ????. ???? ?? ?????? ??? ? ??? ??? ?? ?????? ??? ? ????. ?????? ?????? ? ??? ?? ???? ?????? ? ????.

?? ???? ?????? ?? ???? ?? ???? ???? ??? ?? ? ? ?? ?????? ???? ?? ? ?? ? ? ??? ????. 1. Abstract ???? ?? ? ???? ??? ?? ? ??? ?? ???? ???? ????, ?? ?? ? ?? ??? ???? ? ?????. 2. ?????? ????? ???? ???? ????, ???? ??? ?? ? ???? ??? ?? ?? ? ?? ??? ???? ? ?????.

??? ?????? ?? ???? ?? ?? ???? ?? ????? ?? ??? ?? ??? ?????, ??? ?? ?? ??? ? ?? ?? ???? ?????. ??? ?????? ?????? ? ??? ?? ???? ?????? ? ????. ??? ?????? ??? ?? ???? ???? ??? ?? ???? ?? ???? ??? ? ????.

Java? ???? ????? ? ?? ??? ??? ?? ???? ??? ? ???? ?? ??? ? ???? ?? ???? ?????. ?????? ?? ???? ?? ??? ??? ? ??, ?? ???? ?? ???? ?? ??? ??? ? ???, ?????? ???? ??? ?????.

?????: ??? ?? ?? ?????? Java?? ??? ??? ??? ????? ???? ??? ????? ????. ?? ?????? ???? ???? ??? ???? ????? ???? ?? ??? ???. ?????? ???? ?? ????? ??? ??? ????. ?? ?: publicinterfaceAnimal{voideat();voidsleep();} ?? ???: ????? ??? ????? ?? ???? ?? ????? ??? ? ?? ?? ??? ???? ?? ??????. ?????? ?? ?? ????? ???? ??? ?? ???? ??? ? ????. ?? ???? abstract ???? ???? ?????? ?? ?????? ???. ?? ?: publicabstractcla

????? ?????? Java? ?? ???? ??? ?????. ?????? ???? ???? ??? ?????? ???? ????? ?????. ?????? ?? ???? ??? ??? ??? ????? ???? ??? ?????. ?????? ?????. publicinterfaceExampleInterface{voiddoSomething();intgetSomething();} ?? ??? ?? ???? ?????? ? ?? ??????. ???? ?? ???? ??? ???? ???? ????. ?????? ????? ?? ???? ?? ???? ?? ???? ?? ?????. ??? ?? ????? ?? ??? ???? ???? ???? ??? ?? ????. ?? ??? ??: publicabstractcl
