標籤:php 魔術方法
<?php/** 官方文檔:http://php.net/manual/zh/language.oop5.magic.php*/class magic { public $a = array(1); protected $b = array(2); private $c = array(3); public $d = ‘88‘; public $e = array(‘huazi‘=>55); /** * 構造方法 * 當類被實力化時就會被出發此方法 * 該方法就不用示範了 */ function __construct() { echo ‘構造方法:__construct()<br>‘; } /** * 對象被序列化時會先出發此方法 * 如果沒有此魔術方法 會把 類屬性 $a,$b,$c 序列化 * 此方法可以指定那些屬性被序列化 */ public function __sleep() { return array( ‘a‘ , ‘b‘ ); } /** * 對象被還原序列化時會先出發此方法 */ public function __wakeup() { echo 1; } /** * 方法用於一個類被當成字串時應怎樣回應。例如 echo $obj; 應該顯示些什麼。 * 此方法必須返回一個字串,否則將發出一條 E_RECOVERABLE_ERROR 層級的致命錯誤 */ public function __toString() { return ‘echo 對象?<br>‘; } /** * 自 PHP 5.1.0 起當調用 var_export() 匯出類時,此靜態 方法會被調用。 * 本方法的唯一參數是一個數組,其中包含按 array(‘property‘ => value, ...) 格式排列的類屬性。 */ public static function __set_state($array) { return $array[‘d‘]; } /** * PHP 5 引入了解構函式的概念,這類似於其它物件導向的語言, * 如 C++。解構函式會在到某個對象的所有引用都被刪除或者當對象被顯式銷毀時執行。 * * 該方法就不用示範了 */ public function __destruct() { //echo 55; } /** * 在對象中調用一個不可存取方法時,__call() 會被調用 */ public function __call($name, $arguments) { echo ‘__call() : ‘; // 注意: $name 的值區分大小寫 var_dump($name); var_dump($arguments); echo ‘<br>‘; if( $name == ‘abc‘ ) { $this->$name(); } } private function abc() { echo ‘999<br>‘; } /** * 用靜態方式中調用一個不可存取方法時,__callStatic() 會被調用。 */ public static function __callStatic ( $name , $arguments ) { echo ‘__callStatic() : ‘; // 注意: $name 的值區分大小寫 var_dump($name); var_dump($arguments); echo ‘<br>‘; } /** * 在給不可訪問屬性賦值時,__set() 會被調用。 */ public function __set( $name,$val ) { echo ‘__set : 方法<br>‘; $this->$name = $val; } /** * 讀取不可訪問屬性的值時,__get() 會被調用。 */ public function __get( $name ) { echo ‘__get : 方法<br>‘; return $this->$name; } /** * 判斷屬性是否存在時被調用 */ public function __isset($name) { echo ‘__isset : 方法<br>‘; return isset( $this->e[$name] ); } /** * 當對不可訪問屬性調用 unset() 時,__unset() 會被調用。 */ public function __unset($name) { echo ‘__unset : 方法<br>‘; unset( $this->$name ); var_dump($name); } /** * 對象被複製時被調用的 */ public function __clone() { echo ‘__clone : 方法‘; echo ‘: 被複製了<br>‘; } /** * 當嘗試以調用函數的方式調用一個對象時,__invoke() 方法會被自動調用。 */ public function __invoke ( $x ) { echo ‘__invoke : 方法 <br>‘; var_dump ( $x ); }}$ob = new magic();/** * __sleep() 案例 * var_dump(serialize($ob)); *//** * __wakeup 案例 * $ser = serialize($ob); * unserialize($ser); *//** * __toString 案例 * echo $ob; *//** * __set_state 案例 手冊裡 * eval(‘$b = ‘.var_export($ob,true).‘;‘); * var_dump($b); *//** * __call 案例 * $ob->meiyou(); * $ob->abc(1,2); *//** * __callStatic 案例 * magic::kao(22); *//** * __set 案例 * print_r($ob); * $ob->c=2; * print_r($ob); *//** * __get 案例 * print_r($ob->c); *//** * __isset 案例 * var_dump( isset($ob->huazi) ); *//** * __unset 案例 * unset($ob->b); * print_r($ob); *//** * __clone 案例 * $c = clone $ob; *//** * __invoke 案例 * $ob(‘hehe‘); */class a{ function __construct(){ } function __destruct(){ } function __call( $name,$val ){ } static function __callStatic($name, $arguments) { } function __get($name){ } function __set($name,$val){ } function __unset($name){ } function __isset($name){ } function __toString() { } function __set_state($array) { } function __invoke(){ } function __clone(){ } function __sleep(){ } function __wakeup(){ } }
php魔術方法