魔術方法__get()實體詳解
在PHP中以兩個下劃線開頭的方法,被稱為"魔術方法"(Magic methods),比如__construct(), __destruct (), __clone(),以及__call(),,__get(), __set(),__sleep(), __wakeup(), __toString(), __autoload()等,都是魔術方法,
如果希望PHP呼叫這些魔術方法,首先必須在類中定義,否則PHP不會執行未創建的魔術方法,
注意:
魔術方法是php中設定好的,所以不能自己去創建,只能用php中本來就存在的,否則會報錯,
__get()的作用為:
__get():讀取不可訪問屬性的值(private,protected,不存在)時,php就會執行__get()方法,
我們來看個有關__get()的實體:
<?php class Person{ public $name; protected $age; function __construct($name,$age){ $this->name = $name; $this->age = $age; } function me(){ echo $this->name.' '.$this->age; } //魔術方法 function __get($pro){ if(isset($this->$pro)){ return $this->$pro; }else{ echo '屬性值:'.$pro.'不存在'; } } } $person = new Person('cyy',25); $person->me(); echo '<br>'; echo $person->age;
魔術方法__set()實體詳解
__set()的作用:
__set():在給不可訪問屬性賦值(private,protected,不存在)時,php就會執行__set()方法,
<?php class Person{ public $name; protected $age; function __construct($name,$age){ $this->name = $name; $this->age = $age; } function me(){ echo $this->name.' '.$this->age; } //魔術方法 function __get($pro){ if(isset($this->$pro)){ return $this->$pro; }else{ echo '屬性值:'.$pro.'不存在'; } } function __set($pro,$val){ if(isset($this->$pro)){ return $this->$pro = $val; }else{ echo '屬性值不存在'; } } } $person = new Person('cyy',25); $person->me(); echo '<br>'; $person->age = '66'; echo $person->age;
因為$age是保護的,所以不允許訪問,那么,我們就要借助__set()魔術方法來實作,__set()方法包含兩個引數,分別表示變數名稱和變數值,兩個引數不可省略,
魔術方法___toString()實體詳解
__toString()方法會先將物件傳化成字串在輸出,這樣就可以用echo或者print輸出了,
實體分析:
<?php class Person{ public $name; protected $age; function __construct($name,$age){ $this->name = $name; $this->age = $age; } //魔術方法 function __get($pro){ if(isset($this->$pro)){ return $this->$pro; }else{ echo '屬性值:'.$pro.'不存在'; } } function __set($pro,$val){ if(isset($this->$pro)){ return $this->$pro = $val; }else{ echo '屬性值不存在'; } } function __toString(){ return $this->name.' '.$this->age; } } $person = new Person('cyy',25); echo $person;
結果如下:
cyy 25
如果實體化一個類,然后直接echo這個類名,頁面上會顯示報錯資訊: Object of class xx could not be converted to string,意思是物件的類不能轉換為字串輸出,所以我們加上__toString()方法,就可以了,在方法中直接回傳需要的結果就可以了,
魔術方法__call()實體詳解
什么是__call()魔術方法?
__call是魔術方法中的一個,當程式呼叫到當前類中未宣告或沒權限呼叫的方法時,就會呼叫__call方法,__call()方法包含兩個引數,即方法名和方法引數,其中,方法引數是以陣列形式存在的,
<?php class Person{ public $name; protected $age; function __construct($name,$age){ $this->name = $name; $this->age = $age; } function __call($name,$arg){ echo '當方法不存在時我會被呼叫<br>'; echo '方法名:'.$name.', 引數為:'; var_dump($arg); } } $person = new Person('cyy',25); $person->hh('a','b');
結果如下:

魔術方法__autoload()實體詳解
在寫代碼的時候,經常會遇到一個頭疼的問題,就是要在一個頁面中引入很多的類,需要用到include_once或者require_once()函式一個一個引入,當引入的內容不多時,還可以接受,但是如果有十幾個或者幾十個檔案需要引入,操作次數多,煩躁不說,還會出現重復引入或者忘了參考的情況,
__autoload()方法可以自動實體化需要使用的類,當程式要用到一個類,但該類還沒有實體化時,PHP5將呼叫__autoload()方法,在指定的路徑下自動查找和該類名稱相同的檔案,如果找到,程式則繼續執行;否則,報告錯誤,
注意:
其他所有的方法都是要在類的內部添加才起作用,__autoload()是唯一一個不在類中添加的方法
只要在頁面中使用到一個類,類名就會自動傳給這個引數,
舉個例子:
創建類檔案person.class.php的代碼:
<?php class Person{ private $name; public function __construct($name){ $this->name = $name; } public function __toString(){ return $this->name; } }
在index.php檔案下的代碼:
<?php function __autoload($class){ $classpath = $class.'.class.php'; if(file_exists($classpath)){ include_once($classpath); }else{ echo '類檔案不存在'; } } $person = new Person('cyy'); echo $person;
結果如下:

報錯是由于php版本過高,PHP 7.2開始不主張使用function __autoload(){}來自動加載類檔案,
可以換低版本php,或者使用推薦的 spl_autoload_register 方法
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/33640.html
標籤:PHP
上一篇:php面向物件高級應用一
下一篇:php連接和操作mysql資料庫
