1.回顧:上篇學習了 抽象類別,介面和特徵
2.這篇將學習 重載!
3.重載 :使用魔術方法實現
3.1 總結
(1)php中的重載是指動態建立類屬性和方法 (2)當調用當前環境下未定義或不可見的類屬性或方法時,重載方法會被調用 (3)所有的重載方法都必須聲明為 public (4)通過魔術方法的參數都不能通過引用傳遞 (5)和傳統的物件導向重載不同 (6)傳統的重載是用於提供多個同名類方法,各方法參數類型和個數不同 (7)isset() 和 unset() 魔術方法 (8)callStatic() php5.3
3.2屬性重載
示範一個例子:
# __set __get __isset ,__unset class MemberTest { /** 被重載的資料儲存在此 */ private $data = array(); /** 重載不能被用在已經定義的屬性 */ public $declared = 1; /** 只有從類外部存取這個屬性時,重載才會發生 */ private $hidden = 2; public function __set($name, $value) { echo "Setting '$name' to '$value' "; $this->data[$name] = $value; } public function __get($name) { echo "Getting '$name' "; if (array_key_exists($name, $this->data)) { return $this->data[$name]; } $trace = debug_backtrace(); trigger_error( 'Undefined property via __get(): ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'], E_USER_NOTICE); return null; } /** PHP 5.1.0之後版本 */ public function __isset($name) { echo "Is '$name' set? "; return isset($this->data[$name]); } /** PHP 5.1.0之後版本 */ public function __unset($name) { echo "Unsetting '$name' "; unset($this->data[$name]); } /** 非魔術方法 */ public function getHidden() { return $this->hidden; }}echo " ";$obj = new MemberTest;$obj->a = 1;echo $obj->a . " ";var_dump(isset($obj->a));unset($obj->a);var_dump(isset($obj->a));echo " ";echo $obj->declared . " ";echo "Let's experiment with the private property named 'hidden': ";echo "Privates are visible inside the class, so __get() not used... ";echo $obj->getHidden() . " ";echo "Privates not visible outside of class, so __get() is used... ";echo $obj->hidden . " ";
3.3 方法重載 示範一個例子:
#__call , __callStaticclass MethodTest { public function __call($name, $arguments) { // 注意: $name 區分大小寫 echo "Calling object method '$name' " . implode(', ', $arguments). " "; } /** PHP 5.3.0之後版本 */ public static function __callStatic($name, $arguments) { // Note: value of $name is case sensitive. echo "Calling static method '$name' " . implode(', ', $arguments). " "; }}$obj = new MethodTest;$obj->runTest('in object context');MethodTest::runTest('in static context'); // PHP 5.3.0之後版本
重載,有點不好理解,需要練習!
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
以上就介紹了php-物件導向(5),包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。