</pre><pre name="code" class="php"><?phpdate_default_timezone_set("PRC");/** * 魔術方法3之屬性重載 * 1. 在給不可訪問屬性賦值時,__set() 會被調用。 * 2. 讀取不可訪問屬性的值時,__get() 會被調用。 * 3. 當對不可訪問屬性調用 isset() 和empty()時,__isset() 會被調用。 * 4. 當對不可訪問屬性調用 unset() 時,__unset() 會被調用 */class MagicTest{ public $name; public function __tostring(){ return "This is the Class MagicTest.\n"; } public function __invoke($x){ echo "__invoke called with parameter " . $x . "\n"; } public function __call($name, $arguments){ echo "Calling " . $name . " with parameters: " . implode(', ', $arguments) . "\n"; } public static function __callStatic($name, $arguments){ echo "Static calling " . $name . " with parameters: " . implode(', ', $arguments) . "\n"; } // 通過這兩個方法可以實現動態對象屬性 public function __get($name){ return "Getting the property " . $name; } public function __set($name, $value){ echo "Setting the property " . $name . " to value ". $value. "\n"; } public function __isset($name){ echo "__isset invoked\n"; return false; } public function __unset($name){ echo "unsetting property " . $name; } public function __clone(){//深拷貝 }}$obj = new MagicTest();echo $obj->name . "\n"; //對象中不存在name屬性,讀取不存在屬性,__get方法被調用$obj->name = "Name Value";//對象中不存在name屬性,設定不存在屬性,__set方法被調用echo '$obj->name is set? '. isset($obj->name) . "\n";//對象不存在name屬性,__isset方法調用echo '$obj->name is empty?' . empty($obj->name) . "\n";//對象不存在name屬性,__isset方法調用unset($obj->name);//對象不存在name屬性, __unset方法調用$p1 = new MagicTest();$p1->name = "p1";echo $p1->name."\n";$p2 = clone $p1;//深拷貝,如果有寫__clone魔法,則該__clone方法調用。$p2->name = "p2";echo $p1->name."\n";echo $p2->name."\n";//可以看出到p2不影響p1;$?>