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