本篇文章給大家分享的內容是關於【php類與對象】重載,有著一定的參考價值,有需要的朋友可以參考一下
重載(overloading)
定義:指動態地”建立”類屬性和方法。
實現:魔術方法。
當調用當前環境下未定義或不可見的類屬性或方法時,重載方法會被調用。
所有的重載方法都必須被聲明為 public
這些魔術方法的參數都不能通過引用傳遞。
屬性重載
public void __set ( string $name , mixed $value )在給不可訪問屬性賦值時,__set() 會被調用。public mixed __get ( string $name )讀取不可訪問屬性的值時,__get() 會被調用.public bool __isset ( string $name )當對不可訪問屬性調用 isset() 或 empty() 時,__isset() 會被調用。public void __unset ( string $name )當對不可訪問屬性調用 unset() 時,__unset() 會被調用。
參數 $name 是指要操作的變數名稱。__set() 方法的 $value 參數指定了 $name 變數的值。
屬性重載只能在對象中進行。從 PHP 5.3.0 起, 將這些魔術方法定義為 static 會產生一個警告。在靜態方法中,這些魔術方法將不會被調用。所以這些方法都不能被 聲明為 static。
【未懂】在除 isset() 外的其它語言結構中無法使用重載的屬性,這意味著當對一個重載的屬性使用 empty() 時,重載魔術方法將不會被調用。為避開此限制,必須將重載屬性賦值到本地變數再使用 empty()。
Example #1 使用 __get(),__set(),__isset() 和 __unset() 進行屬性重載<?phpclass PropertyTest { /** 被重載的資料儲存在此 */ private $data = array(); /** 重載不能被用在已經定義的屬性 */ public $declared = 1; /** 只有從類外部存取這個屬性時,重載才會發生 */ private $hidden = 2; public function __set($name, $value) { echo "Setting '$name' to '$value'\n"; $this->data[$name] = $value; } public function __get($name) { echo "Getting '$name'\n"; 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?\n"; return isset($this->data[$name]); } /** PHP 5.1.0之後版本 */ public function __unset($name) { echo "Unsetting '$name'\n"; unset($this->data[$name]); } /** 非魔術方法 */ public function getHidden() { return $this->hidden; }}echo "<pre>\n";$obj = new PropertyTest;$obj->a = 1; //__set(): Setting 'a' to '1'echo $obj->a . "\n\n"; //__get(): Getting 'a'var_dump(isset($obj->a)); //__isset(): Is 'a' set? bool(true)unset($obj->a); //__unset(): Unsetting 'a'var_dump(isset($obj->a)); //__isset(): Is 'a' set? bool(false)echo "\n";echo $obj->declared . "\n\n"; //可訪問,__get()不被調用:1echo "Let's experiment with the private property named 'hidden':\n";echo "Privates are visible inside the class, so __get() not used...\n";echo $obj->getHidden() . "\n"; //可訪問,__get()不被調用:2echo "Privates not visible outside of class, so __get() is used...\n";echo $obj->hidden . "\n"; //__get(): Notice: Undefined property via __get(): hidden in D:\phpStudy2018\PHPTutorial\WWW\index.php on line 75 in D:\phpStudy2018\PHPTutorial\WWW\index.php on line 31?>
方法重載
public mixed __call ( string $name , array $arguments )在對象中調用一個不可存取方法時,__call() 會被調用。public static mixed __callStatic ( string $name , array $arguments )在靜態上下文中調用一個不可存取方法時,__callStatic() 會被調用。
相關推薦:
PHP中重載詳解
PHP的重載介紹