您好,登錄后才能下訂單哦!
這篇文章主要介紹PHP中十六個魔術方法分別是什么,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
No.1 __construct()
定義:類的構造函數 解釋:對象創建后第一個被自動調用的方法,通常被用來執行一些有用的初始化任務,例如在創建對象時對成員屬性賦予初始值。 例子: Class Person{ public $name; public $age; public $sex; public function __construct($name = '', $sex = '男', $age = 28) { $this->name = $name; $this->sex = $sex; $this->age = $age; }}注意:如果子類中定義了構造函數則不會調用其父類的構造函數。要執行父類的構造函數,需要在子類的構造函數中調用 parent::__construct()
定義:類的析構函數 解釋:與構造函數相反,在類銷毀之前執行一些操作,比如關閉文件、釋放結果等。 例子: 主動調用 unset( $obj )主動調用 $obj = NULL程序自動結束
定義:在對象中調用一個不存在的方法時 自動調用 解釋:為了避免當調用的方法不存在時產生錯誤,而意外的導致程序中止,可以使用 __call() 方法來避免。
定義:同上 不同在于調用靜態方法時 自動調用
定義:可以在對象的外部獲取私有成員屬性的值 例子:private $name;function __construct($name="", $age=1){ $this->name = $name;}public function __get($propertyName){ return $this->$propertyName;}// 通過Person類實例化的對象,并通過構造方法為屬性賦初值$Person = new Person("小明", 60);// 直接訪問私有屬性name,自動調用了__get()方法可以間接獲取echo "姓名:" . $Person->name . "<br>";
定義:與__get()類似 為私有屬性賦值 例子:public function __set($propertyName, $value){ $this->$propertyName = $value;}
定義:在類外部 判斷屬性isset()例子:public function __isset($content) { echo "當在類外部使用isset()函數測定私有成員{$content}時,自動調用<br>"; echo isset($this->$content);}echo isset($person->name);
定義:在類外部刪除私有變量時自動調用
定義:執行serialize時會被自動調用 例子:public function __sleep(){ $this->name = base64_encode($this->name); return ['name', 'age'];}echo serialize($person);
定義:與__sleep類似 在執行unserialize()時被自動調用
定義:當類被當成字符串輸出時如何響應 例如 echo $obj; 應該顯示些什么。 注意:此方法必須返回一個字符串,否則將發出一條 `E_RECOVERABLE_ERROR` 級別的致命錯誤。 警告:不能在 __toString() 方法中拋出異常。這么做會導致致命錯誤。
定義:當嘗試以調用函數的方式調用一個對象生效 例子:public function __invoke() { echo '拿我當函數用,我就會被自動調用';}$person = new Perseon();$person();
定義:調用var_export導出類時,該方法自動被調用。
定義:當對象復制完成時調用 例子:public function __clone(){ echo __METHOD__."你正在克隆對象<br>"; $this->name = 'new name'; $this->age = 18;}$copy_of_object = clone $object;
定義:嘗試加載未定義的類 例子:function __autoload($className) { $filePath = “project/class/{$className}.php”; // 判斷文件是否可讀 if (is_readable($filePath)) { require($filePath); } } if (條件A) { $a = new A(); $b = new B(); $c = new C(); // … 業務邏輯 } else if (條件B) { $a = newA(); $b = new B(); // … 業務邏輯 }注意:這里可以只用require,因為一旦包含進來后,php引擎再遇到類A時,將不會調用__autoload,而是直接使用內存中的類A,不會導致多次包含。 擴展:<?phpclass autoloader { public static $loader; public static function init() { if (self::$loader == NULL) self::$loader = new self (); return self::$loader; } public function __construct() { spl_autoload_register ( array ($this, 'model' ) ); spl_autoload_register ( array ($this, 'library' ) ); } public function model($class) { $class = preg_replace ( '/_model$/ui', '', $class ); set_include_path ( get_include_path () . PATH_SEPARATOR . '/model/' ); spl_autoload_extensions ( '.model.php' ); spl_autoload ( $class ); } public function library($class) { set_include_path ( get_include_path () . PATH_SEPARATOR . '/lib/' ); spl_autoload_extensions ( '.library.php' ); spl_autoload ( $class ); }}//callautoloader::init ();?>
定義:打印所需調試信息 例子:public function __debugInfo(){ return [ 'message' => "姓名:".$this->name . " 年齡:".$this->age ];}$person = new Person('tongfei', 28);var_dump($person);
以上是“PHP中十六個魔術方法分別是什么”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。