classCar {privatestatic$speed = 10; publicfunctiongetSpeed() {returnself::$speed; } //在這裡定義一個靜態方法,實現速度累加10publicstaticfunctionspeedUp() {returnself::$speed += 10; }}$car = new Car();Car::speedUp(); //調用靜態方法加速echo$car->getSpeed(); //調用共有方法輸出當前的速度值
靜態方法也可以通過變數來進行動態調用。
$func = 'getSpeed';$className = 'Car';echo$className::$func(); //動態調用靜態方法
存取控制通過關鍵字public,protected和private來實現。被定義為公有的類成員可以在任何地方被訪問。被定義為受保護的類成員則可以被其自身以及其子類和父類訪問。被定義為私人的類成員則只能被其定義所在的類訪問。
類屬性必須定義為公有、受保護、私人之一。
類中的方法可以被定義為公有、私人或受保護。如果沒有設定這些關鍵字,則該方法預設為公有。
如果建構函式定義成了私人方法,則不允許直接執行個體化對象了,這時候一般通過靜態方法進行執行個體化,在設計模式中會經常使用這樣的方法來控制對象的建立,比如單例模式只允許有一個全域唯一的對象。
classCar {privatefunction__construct() {echo'object create'; } privatestatic$_object = null; publicstaticfunctiongetInstance() {if (empty(self::$_object)) { self::$_object = new Car(); //內部方法可以調用私人方法,因此這裡可以建立對象 } returnself::$_object; }}//$car = new Car(); //這裡不允許直接執行個體化對象$car = Car::getInstance(); //通過靜態方法來獲得一個執行個體
classCar {public$speed = 0; //汽車的起始速度是0publicfunctionspeedUp() {$this->speed += 10; return$this->speed; }}//定義繼承於Car的Truck類classTruckextendsCar{publicfunctionspeedUp() {$this->speed = parent::speedUp() + 50; }}$car = new Truck();$car->speedUp();echo$car->speed;
PHP中的重載指的是動態建立屬性與方法,是通過魔術方法來實現的。屬性的重載通過__set,__get,__isset,__unset來分別實現對不存在屬性的賦值、讀取、判斷屬性是否設定、銷毀屬性。
classCar {private$ary = array(); publicfunction__set($key, $val) {$this->ary[$key] = $val; } publicfunction__get($key) {if (isset($this->ary[$key])) { return$this->ary[$key]; } returnnull; } publicfunction__isset($key) {if (isset($this->ary[$key])) { returntrue; } returnfalse; } publicfunction__unset($key) {unset($this->ary[$key]); }}$car = new Car();$car->name = '汽車'; //name屬性動態建立並賦值echo$car->name;
方法的重載通過__call來實現,當調用不存在的方法的時候,將會轉為參數調用__call方法,當調用不存在的靜態方法時會使用__callStatic重載。
lass Car { public$speed = 0; publicfunction__call($name, $args) {if ($name == 'speedUp') { $this->speed += 10; } }}$car = new Car();$car->speedUp(); //調用不存在的方法會使用重載echo$car->speed;
對象比較,當同一個類的兩個執行個體的所有屬性都相等時,可以使用比較子“==“進行判斷,當需要判斷兩個變數是否為同一個對象的引用時,可以使用全等運算子“===“進行判斷。
classCar {}$a = new Car();$b = new Car();if ($a == $b) echo'=='; //trueif ($a === $b) echo'==='; //false
對象複製,在一些特殊情況下,可以通過關鍵字clone來複製一個對象,這時__clone方法會被調用,通過這個魔術方法來設定屬性的值。
classCar {public$name = 'car'; publicfunction__clone() {$obj = new Car(); $obj->name = $this->name; }}$a = new Car();$a->name = 'new car';$b = clone$a;var_dump($b);
對象序列化,可以通過serialize方法將對象序列化為字串,用於儲存或者傳遞資料,然後在需要的時候通過unserialize將字串還原序列化成對象進行使用。
classCar {public$name = 'car';}$a = new Car();$str = serialize($a); //對象序列化成字串echo$str.'
';$b = unserialize($str); //還原序列化為對象var_dump($b);
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
以上就介紹了移動app介面編程技術-學習實現之PHP類其他特性,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。