摘要:方法如無的調(diào)用,則默認(rèn)為為靜態(tài)方法。聲明靜態(tài)方法會(huì)有錯(cuò)誤提示,但很方便,能用盡量用效率高。
一、面向?qū)ο蟮年P(guān)鍵字
1.instanceof操作符:
對(duì)象是否屬于類(檢測繼承性),如下:
class Person {}; class Student extends Person {}; $p=new Person; $s=new Student; echo $p instanceof Student;//false echo $s instanceof Student;//true echo $s instanceof Person;//true
2.final關(guān)鍵字:
不定義常量,不能使用final修飾成員屬性
a.final可以修飾類,該類不能擴(kuò)展(不能有子類),即最終類,如下:
final class Person {......};
b.final可以修飾方法,這個(gè)方法不能在子類中被覆蓋(不能被擴(kuò)展),即最終方法,如下:
public final function say(){......}; //子類不能用parent::say();調(diào)用
3.static關(guān)鍵字:
a.將一個(gè)類中多個(gè)實(shí)例對(duì)象的共用屬性/方法存入初始化靜態(tài)段中,節(jié)省內(nèi)存空間 b.類第一次出現(xiàn),加載時(shí),已將static成員加載到了內(nèi)存,即不創(chuàng)建實(shí)例對(duì)象,也可以訪問該成員//echo Person::country c.靜態(tài)成員一定要使用類來訪問//echo Person::country d.靜態(tài)成員可以訪問也可以賦值,賦值后所有實(shí)例都變化,self關(guān)鍵字可以在本類中代表本類名,類似this e.靜態(tài)成員一旦被加載,只有腳本結(jié)束才釋放 f.該關(guān)鍵字可以修飾屬性和方法,不能修飾類。方法如無$this的調(diào)用,則默認(rèn)為為靜態(tài)方法。聲明靜態(tài)方法會(huì)有錯(cuò)誤提示,但很方便,能用盡量用(效率高)。 g.上述第f條的缺點(diǎn)如下: (1)占內(nèi)存,腳本結(jié)束才釋放 (2)靜態(tài)方法只能使用靜態(tài)屬性,因?yàn)椴荒苁褂?this
4.const關(guān)鍵字
a.常量存儲(chǔ)區(qū)域?yàn)槌跏蓟o態(tài)段 b.define只能在類外部聲明常量,內(nèi)部報(bào)錯(cuò) c.const只能修飾成員屬性,即定義常量,注意: (1)常量使用大寫,不能使用$ (2)聲明時(shí)必有初值 (3)訪問方式與static相同(self::name),但只能讀
二、魔術(shù)方法
1.自動(dòng)調(diào)用,只有PHP語言存在 2.以“__”開始 3.方法名固定 4.如果不寫就不存在,也沒有默認(rèn)功能
1.__toString():將對(duì)象轉(zhuǎn)為自定義的字符串(類似js),該方法不能有參數(shù),必須返回一個(gè)字符串(echo/print后常用),如下:
class Person { function __toString(){ return "$$$$
"; } }; $p=new Person; echo $p;//$$$$
2.__clone():
a.克隆對(duì)象
class Person { function __toString(){ return "$$$$
"; } }; $p=new Person; $p2=clone $p;
b.魔術(shù)方法:
(1)在克隆對(duì)象時(shí)自動(dòng)調(diào)用 (2)作用:與構(gòu)造方法一樣,對(duì)新克隆的對(duì)象初始化 (3)該方法中$this代表副本,可進(jìn)行初始化($that有時(shí)可代表原本,有的版本能用)
class Person { var $name; function __construct($name){ $this->name=$name; } function say(){ echo $this->name."
"; } function __clone(){ $this->name="ni"; } }; $p=new Person("wo"); $p->say();//wo $p2=clone $p; $p2->say();//ni
3.__call():
a.調(diào)用對(duì)象中不存在的方法時(shí),自動(dòng)調(diào)用
b.有兩個(gè)參數(shù),第一個(gè)參數(shù)不存在的方法名,第二個(gè)是不存在方法的參數(shù)數(shù)組
c.作用:將功能相似方法進(jìn)行批量處理或?qū)Σ淮嬖诜椒ㄍ瓿商崾竟δ?/p>
class Person { var $name; function __construct($name){ $this->name=$name; } function say(){ echo $this->name."
"; } function __clone(){ $this->name="ni"; } function __call($method,$args){ echo "方法{$method}(),參數(shù)為"; print_r($args); echo"不存在!
"; } }; $p=new Person("wo"); $p->eat("肉","米"); //方法eat(),參數(shù)為Array ( [0] => 肉 [1] => 米 ) 不存在!
d.可以用來實(shí)現(xiàn)重載(與JS函數(shù)的arguments方法類似)
class Foo1{ public function __call($name,$arguments){ if($name=="doStuff"){ /** *實(shí)際上,不僅僅可以第一個(gè)參數(shù)類型,還可以判斷參數(shù)個(gè)數(shù),以及參數(shù)順序,那么就和C++等強(qiáng)數(shù)據(jù)類型語言的重載效果是一樣的了! */ if(is_int($arguments[0])){ $this->doStuffForInt($arguments[0]); }else if(is_string($arguments[0])){ $this->doStuffForString($arguments[0]); } } } private function doStuffForInt($a){ echo "執(zhí)行的是doStuffForInt()方法"; } private function doStuffForString($a){ echo "執(zhí)行的是doStuffForString()方法"; } } $foo1=new Foo1; $foo1->doStuff("1");//執(zhí)行的是doStuffForString()方法
三、單態(tài)/單件/單例設(shè)計(jì)模式
概念:一個(gè)類只能創(chuàng)建一個(gè)對(duì)象,最適合PHP使用的設(shè)計(jì)模式
方法:
a.先將構(gòu)造函數(shù)私有化,讓類不能創(chuàng)建對(duì)象,如下:
class Person { private function __construct(){ } function __destruct(){ echo "######
"; } function say(){ echo "$$$$
"; } }; $p=new Person;//報(bào)錯(cuò)
b.定義(static)靜態(tài)方法,在類中創(chuàng)建類的對(duì)象,外部使用類調(diào)用來創(chuàng)建對(duì)象,但這樣仍然是每次調(diào)用創(chuàng)建一個(gè)新對(duì)象,而不是只能創(chuàng)建一個(gè)對(duì)象,具體如下:
class Person { private function __construct(){ } static function createObj(){ $obj=new self; return $obj; } function __destruct(){ echo "######
"; } function say(){ echo "$$$$
"; } }; $p=Person::createObj();//###### $p=Person::createObj();//###### $p=Person::createObj();//###### $p=Person::createObj();//###### $p->say();//$$$$
c.將新建對(duì)象的變量$obj設(shè)定為靜態(tài)屬性(唯一的),即可達(dá)到要求,該類只能創(chuàng)建一個(gè)對(duì)象,如下:
class Person { static $obj=null; private function __construct(){ } static function createObj(){ if(is_null(self::$obj)){ self::$obj=new self; } return self::$obj; } function __destruct(){ echo "######
"; } function say(){ echo "$$$$
"; } }; $p=Person::createObj(); $p=Person::createObj(); $p=Person::createObj(); $p=Person::createObj(); //由于只創(chuàng)建了一個(gè)類,只輸出一次###### $p->say();//$$$$
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/25594.html
摘要:初始化我們知道容器初始化后會(huì)對(duì)容器中非懶加載的,單例的以及非抽象的定義進(jìn)行的初始化操作,所以我們分析源碼的入口也就是在容器初始化的入口,分析容器初始化后在什么地方開始第一次的初始化。 前言 Spring IOC容器在初始化之后會(huì)對(duì)容器中非懶加載的,單例的以及非抽象的bean定義進(jìn)行bean的初始化操作,同時(shí)會(huì)也涉及到Bean的后置處理器以及DI(依賴注入)等行為。對(duì)于Bean的初始化,...
摘要:特殊在,方法被對(duì)象調(diào)用執(zhí)行時(shí),會(huì)自動(dòng)確定是那個(gè)對(duì)象調(diào)用的該方法,會(huì)使用該對(duì)象為方法內(nèi)的賦值構(gòu)造析構(gòu)類,沒有作用域,作用域,只是講,函數(shù)內(nèi)和函數(shù)外。析構(gòu)在對(duì)象消失對(duì)象被銷毀時(shí),也會(huì)自動(dòng)執(zhí)行一個(gè)方法,稱之為析構(gòu)方法。 相關(guān)定義 對(duì)象(object):現(xiàn)實(shí)生活中的實(shí)體,在編程語言中的體現(xiàn)。實(shí)體都有屬性和功能。一組數(shù)據(jù),和操作管理這些數(shù)據(jù)的操作,定義在一起就形成了一個(gè)實(shí)體,稱之為對(duì)象。(屬性和...
摘要:面向?qū)ο竺嫦驅(qū)ο蠡A(chǔ)面向?qū)ο笫裁词穷惥哂邢嗤瑢傩蕴卣骱头椒ㄐ袨榈囊幌盗袀€(gè)體的集合,類是一個(gè)抽象的概念。析構(gòu)函數(shù),當(dāng)一個(gè)對(duì)象被銷毀前,自動(dòng)調(diào)用。作用是為新克隆的對(duì)象進(jìn)行初始化賦值對(duì)象序列化時(shí),自動(dòng)調(diào)用。使用抽象類的作用限制實(shí)例化。 面向?qū)ο?面向?qū)ο蠡A(chǔ) 面向?qū)ο?什么是類? 具有相同屬性(特征)和方法(行為)的一系列個(gè)體的集合,類是一個(gè)抽象的概念。 什么是對(duì)象? 從類中,拿到的具有具體...
摘要:一面向?qū)ο蟮母拍钍裁词敲嫦驅(qū)ο笫篱g萬物皆對(duì)象,抽象的也是對(duì)象,一切可見或不可見都是對(duì)象對(duì)象的基本組成對(duì)象包含兩個(gè)部分對(duì)象的組成元素是對(duì)象的數(shù)據(jù)模型,用于描述對(duì)象的數(shù)據(jù)又稱為對(duì)象的屬性,或者對(duì)象的成員變量對(duì)象的行為是對(duì)象的行為模型,用于描述對(duì) 一、面向?qū)ο蟮母拍?1.1 什么是面向?qū)ο?object oriented) ?????世間萬物皆對(duì)象,抽象的也是對(duì)象,一切可見或不可見都是對(duì)象 ...
摘要:類與對(duì)象基本概念如果在之后跟著的是一個(gè)包含有類名的字符串,則該類的一個(gè)實(shí)例被創(chuàng)建。如果該類屬于一個(gè)名字空間,則必須使用其完整名稱。如果一個(gè)類被聲明為,則不能被繼承。命名空間通過關(guān)鍵字來聲明。 類與對(duì)象 基本概念 new:如果在 new 之后跟著的是一個(gè)包含有類名的字符串,則該類的一個(gè)實(shí)例被創(chuàng)建。如果該類屬于一個(gè)名字空間,則必須使用其完整名稱。 Example #3 創(chuàng)建一個(gè)實(shí)例 ...
閱讀 2274·2021-11-25 09:43
閱讀 3147·2021-10-14 09:42
閱讀 3497·2021-10-12 10:12
閱讀 1580·2021-09-07 10:17
閱讀 1912·2019-08-30 15:54
閱讀 3197·2019-08-30 15:54
閱讀 1570·2019-08-30 15:53
閱讀 1930·2019-08-29 11:21