-
PHP類和對象之重載
PHP中的重載指的是動態(tài)的創(chuàng)建屬性與方法,是通過魔術(shù)方法來實現(xiàn)的。屬性的重載通過__set,__get,__isset,__unset來分別實現(xiàn)對不存在屬性的賦值、讀取、判斷屬性是否設(shè)置、銷毀屬性。
查看全部 -
PHP類和對象之訪問控制
被定義為公有的類成員可以在任何地方被訪問。被定義為受保護(hù)的類成員則可以被其自身以及其子類和父類訪問。被定義為私有的類成員則只能被其定義所在的類訪問。
如果構(gòu)造函數(shù)定義成了私有方法,則不允許直接實例化對象了,這時候一般通過靜態(tài)方法進(jìn)行實例化,在設(shè)計模式中會經(jīng)常使用這樣的方法來控制對象的創(chuàng)建,比如單例模式只允許有一個全局唯一的對象。
查看全部 -
PHP類和對象之Static靜態(tài)關(guān)鍵字
靜態(tài)屬性與方法可以在不實例化類的情況下調(diào)用,直接使用
類名::方法名
的方式進(jìn)行調(diào)用。靜態(tài)屬性不允許對象使用->操作符調(diào)用。靜態(tài)方法中,$this偽變量不允許使用??梢允褂胹elf,parent,static在內(nèi)部調(diào)用靜態(tài)方法與屬性。
查看全部 -
PHP類和對象之構(gòu)造函數(shù)和析構(gòu)函數(shù)
在子類中如果定義了__construct則不會調(diào)用父類的__construct,如果需要同時調(diào)用父類的構(gòu)造函數(shù),需要使用parent::__construct()顯式的調(diào)用
查看全部 -
PHP類和對象之定義類的方法
使用關(guān)鍵字static修飾的,稱之為靜態(tài)方法,靜態(tài)方法不需要實例化對象,可以通過類名直接調(diào)用,操作符為雙冒號::。
查看全部 -
PHP類和對象之類的屬性
一般通過->對象操作符來訪問對象的屬性或者方法,對于靜態(tài)屬性則使用::雙冒號進(jìn)行訪問。當(dāng)在類成員方法內(nèi)部調(diào)用的時候,可以使用$this偽變量調(diào)用當(dāng)前對象的屬性。
受保護(hù)的屬性與私有屬性不允許外部調(diào)用,在類的成員方法內(nèi)部是可以調(diào)用的。
查看全部 -
PHP類和對象之創(chuàng)建一個對象
方法內(nèi)部可以使用$this偽變量調(diào)用對象的屬性或者方法
查看全部 -
正則表達(dá)式中具有特殊含義的字符稱之為元字符,常用的元字符有:
\ 一般用于轉(zhuǎn)義字符
^ 斷言目標(biāo)的開始位置(或在多行模式下是行首)
$ 斷言目標(biāo)的結(jié)束位置(或在多行模式下是行尾)
. 匹配除換行符外的任何字符(默認(rèn))
[ 開始字符類定義
] 結(jié)束字符類定義
| 開始一個可選分支
( 子組的開始標(biāo)記
) 子組的結(jié)束標(biāo)記
? 作為量詞,表示 0 次或 1 次匹配。位于量詞后面用于改變量詞的貪婪特性。 (查閱量詞)
* 量詞,0 次或多次匹配
+ 量詞,1 次或多次匹配
{ 自定義量詞開始標(biāo)記
} 自定義量詞結(jié)束標(biāo)記//下面的\s匹配任意的空白符,包括空格,制表符,換行符。[^\s]代表非空白符。[^\s]+表示一次或多次匹配非空白符。 $p?=?'/^我[^\s]+(蘋果|香蕉)$/'; $str?=?"我喜歡吃蘋果"; if?(preg_match($p,?$str))?{ ????echo?'匹配成功'; }
元字符具有兩種使用場景,一種是可以在任何地方都能使用,另一種是只能在方括號內(nèi)使用,在方括號內(nèi)使用的有:
\ 轉(zhuǎn)義字符
^ 僅在作為第一個字符(方括號內(nèi))時,表明字符類取反
- 標(biāo)記字符范圍其中^在反括號外面,表示斷言目標(biāo)的開始位置,但在方括號內(nèi)部則代表字符類取反,方括號內(nèi)的減號-可以標(biāo)記字符范圍,例如0-9表示0到9之間的所有數(shù)字。
//下面的\w匹配字母或數(shù)字或下劃線。 $p?=?'/[\w\.\-]+@[a-z0-9\-]+\.(com|cn)/'; $str?=?"我的郵箱是Spark.eric@imooc.com"; preg_match($p,?$str,?$match); echo?$match[0];
查看全部 -
PCRE庫函數(shù)中,正則匹配模式使用分隔符與元字符組成,分隔符可以是非數(shù)字、非反斜線、非空格的任意字符。經(jīng)常使用的分隔符是正斜線(/)、hash符號(#) 以及取反符號(~),例如:
/foo?bar/ #^[^0-9]$# ~php~
如果模式中包含分隔符,則分隔符需要使用反斜杠(\)進(jìn)行轉(zhuǎn)義。
/http:\/\//
如果模式中包含較多的分割字符,建議更換其他的字符作為分隔符,也可以采用preg_quote進(jìn)行轉(zhuǎn)義。
$p?=?'http://'; $p?=?'/'.preg_quote($p,?'/').'/'; echo?$p;
分隔符后面可以使用模式修飾符,模式修飾符包括:i, m, s, x等,例如使用i修飾符可以忽略大小寫匹配:
$str?=?"Http://idcbgp.cn/"; if?(preg_match('/http/i',?$str))?{ ????echo?'匹配成功'; }
查看全部 -
PHP中使用PCRE庫函數(shù)進(jìn)行正則匹配,比如上例中的preg_match用于執(zhí)行一個正則匹配,常用來判斷一類字符模式是否存在。
查看全部 -
對象比較,當(dāng)同一個類的兩個實例的所有屬性都相等時,可以使用比較運算符==進(jìn)行判斷,當(dāng)需要判斷兩個變量是否為同一個對象的引用時,可以使用全等運算符===進(jìn)行判斷。
class?Car?{ } $a?=?new?Car(); $b?=?new?Car(); if?($a?==?$b)?echo?'==';???//true if?($a?===?$b)?echo?'===';?//false
對象復(fù)制,在一些特殊情況下,可以通過關(guān)鍵字clone來復(fù)制一個對象,這時__clone方法會被調(diào)用,通過這個魔術(shù)方法來設(shè)置屬性的值。
class?Car?{ ????public?$name?=?'car'; ???? ????public?function?__clone()?{ ????????$obj?=?new?Car(); ????????$obj->name?=?$this->name; ????} } $a?=?new?Car(); $a->name?=?'new?car'; $b?=?clone?$a; var_dump($b);
對象序列化,可以通過serialize方法將對象序列化為字符串,用于存儲或者傳遞數(shù)據(jù),然后在需要的時候通過unserialize將字符串反序列化成對象進(jìn)行使用。
class?Car?{ ????public?$name?=?'car'; } $a?=?new?Car(); $str?=?serialize($a);?//對象序列化成字符串 echo?$str.'<br>'; $b?=?unserialize($str);?//反序列化為對象 var_dump($b);
查看全部 -
PHP中的重載指的是動態(tài)的創(chuàng)建屬性與方法,是通過魔術(shù)方法來實現(xiàn)的。屬性的重載通過__set,__get,__isset,__unset來分別實現(xiàn)對不存在屬性的賦值、讀取、判斷屬性是否設(shè)置、銷毀屬性。
class?Car?{ ????private?$ary?=?array(); ???? ????public?function?__set($key,?$val)?{ ????????$this->ary[$key]?=?$val; ????} ???? ????public?function?__get($key)?{ ????????if?(isset($this->ary[$key]))?{ ????????????return?$this->ary[$key]; ????????} ????????return?null; ????} ???? ????public?function?__isset($key)?{ ????????if?(isset($this->ary[$key]))?{ ????????????return?true; ????????} ????????return?false; ????} ???? ????public?function?__unset($key)?{ ????????unset($this->ary[$key]); ????} } $car?=?new?Car(); $car->name?=?'汽車';??//name屬性動態(tài)創(chuàng)建并賦值 echo?$car->name;
方法的重載通過__call來實現(xiàn),當(dāng)調(diào)用不存在的方法的時候,將會轉(zhuǎn)為參數(shù)調(diào)用__call方法,當(dāng)調(diào)用不存在的靜態(tài)方法時會使用__callStatic重載。
class?Car?{ ????public?$speed?=?0; ???? ????public?function?__call($name,?$args)?{ ????????if?($name?==?'speedUp')?{ ????????????$this->speed?+=?10; ????????} ????} } $car?=?new?Car(); $car->speedUp();?//調(diào)用不存在的方法會使用重載 echo?$car->speed;
查看全部 -
empty()?函數(shù)用于檢查一個變量是否為空。
類屬性必須定義為公有、受保護(hù)、私有之一。為兼容PHP5以前的版本,如果采用 var 定義,則被視為公有。
查看全部 -
靜態(tài)屬性與方法可以在不實例化類的情況下調(diào)用,直接使用
類名::方法名
的方式進(jìn)行調(diào)用。靜態(tài)屬性不允許對象使用->操作符調(diào)用。class?Car?{ ????private?static?$speed?=?10; ???? ????public?static?function?getSpeed()?{ ????????return?self::$speed; ????} } echo?Car::getSpeed();??//調(diào)用靜態(tài)方法
靜態(tài)方法也可以通過變量來進(jìn)行動態(tài)調(diào)用
$func?=?'getSpeed'; $className?=?'Car'; echo?$className::$func();??//動態(tài)調(diào)用靜態(tài)方法
靜態(tài)方法中,$this偽變量不允許使用??梢允褂胹elf,parent,static在內(nèi)部調(diào)用靜態(tài)方法與屬性。
class?Car?{ ????private?static?$speed?=?10; ???? ????public?static?function?getSpeed()?{ ????????return?self::$speed; ????} ???? ????public?static?function?speedUp()?{ ????????return?self::$speed+=10; ????} } class?BigCar?extends?Car?{ ????public?static?function?start()?{ ????????parent::speedUp(); ????} }BigCar::start();echo?BigCar::getSpeed();
查看全部 -
PHP5可以在類中使用__construct()定義一個構(gòu)造函數(shù),具有構(gòu)造函數(shù)的類,會在每次對象創(chuàng)建的時候調(diào)用該函數(shù),因此常用來在對象創(chuàng)建的時候進(jìn)行一些初始化工作。
class?Car?{ ???function?__construct()?{ ???????print?"構(gòu)造函數(shù)被調(diào)用\n"; ???} } $car?=?new?Car();?//實例化的時候?會自動調(diào)用構(gòu)造函數(shù)__construct,這里會輸出一個字符串
在子類中如果定義了__construct則不會調(diào)用父類的__construct,如果需要同時調(diào)用父類的構(gòu)造函數(shù),需要使用parent::__construct()顯式的調(diào)用。
class?Car?{ ???function?__construct()?{ ???????print?"父類構(gòu)造函數(shù)被調(diào)用\n"; ???} } class?Truck?extends?Car?{ ???function?__construct()?{ ???????print?"子類構(gòu)造函數(shù)被調(diào)用\n"; ???????parent::__construct(); ???} } $car?=?new?Truck();
同樣,PHP5支持析構(gòu)函數(shù),使用__destruct()進(jìn)行定義,析構(gòu)函數(shù)指的是當(dāng)某個對象的所有引用被刪除,或者對象被顯式的銷毀時會執(zhí)行的函數(shù)。
class?Car?{ ???function?__construct()?{ ???????print?"構(gòu)造函數(shù)被調(diào)用?\n"; ???} ???function?__destruct()?{ ???????print?"析構(gòu)函數(shù)被調(diào)用?\n"; ???} } $car?=?new?Car();?//實例化時會調(diào)用構(gòu)造函數(shù) echo?'使用后,準(zhǔn)備銷毀car對象?\n'; unset($car);?//銷毀時會調(diào)用析構(gòu)函數(shù)
當(dāng)PHP代碼執(zhí)行完畢以后,會自動回收與銷毀對象,因此一般情況下不需要顯式的去銷毀對象。
查看全部
舉報