這篇文章主要介紹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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。