成人精品一区二区三区中文字幕-成人精品一区二区三区-成人精品一级毛片-成人精品亚洲-日本在线视频一区二区-日本在线视频免费

導航首頁 ? 技術教程 ? 淺談PHP中的面向對象OOP中的魔術方法
全站頭部文字 我要出現在這里
淺談PHP中的面向對象OOP中的魔術方法 777 2024-01-10   

一、什么是魔術方法:

PHP為我們提供了一系列用__開頭的函數,這些函數無需自己手動調用,會在合適的時機自動調用,這類函數稱為魔術函數。
例如:

function __construct(){} 在new一個新對象時自動調用此函數

二、PHP中都有那些魔術方法,以及它們的作用:

1.__construct():構造函數,new對象時自動調用

eg:

class Person{
    public $name;
    public $age;
    
    function __construct($name,$age){
      $this->name=$name;
      $this->age=$age;
    }
}

在new新的Person對象時會自動調用__construct()函數,將傳入的參數分別賦給$name,$age。

2.__destruct():析構函數,當一個對象被銷毀前自動調用

class Person{
    public $name;
    public $age;
    
    function __destruct(){
    echo "這個對象被銷毀了";
  }
}

同上所述,對象被銷毀時執行此魔術方法

3.__get():訪問類中私有屬性時自動調用,傳遞讀取屬性名,返回$this->屬性名

class Person{
    private $name;
    public $age;
    
    function __get($name){
     return $this->$name;
    }
}

如上代碼,$name被設為私有屬性后不能直接通過$this->name;的方式讀取,因此需要設置__get()魔術方法來讀取。

4.__set():給類的私有屬性賦值時自動調用,傳遞需設置的屬性名,屬性值

class Person{
    private $name;
    public $age;
    
    function __set($key,$value){
      $this->$key=$value;
    }
}

同__get()方法,私有屬性不能通過$this->name="aaa";的方式直接設置,需要設置__set()方法,傳入的參數分別是屬性名和屬性值。

5.__isset():使用isset檢測對象私有屬性時調用,傳遞檢測的屬性名,返回isset($this->屬性名)

class Person{
    private $name;
    public $age;
    
    function __isset($name){
    return isset($this->$name);
  }
}

使用isset檢測對象私有屬性時調用,其他同上。

6.__unset():使用unset()函數刪除對象私有屬性時調用,傳遞刪除的屬性名,方法中執行unset($this->屬性名)

class Person{
    private $name;
    public $age;
    
    function __unset($name){
      unset($this->$name);
    }
}

同上,在用unset()函數刪除私有屬性時調用。

7.__toString():使用echo打印對象時調用,返回打印對象時想要顯示的內容,返回必須是字符串

class Person{
    public $name;
    public $age;
    
    function __toString(){
      $str = <<<str
      您要打印的內容是:<br>
      $name=>{$this->name};<br>
      $age=>{$this->age};<br>
str;
      return $str;
    }
}

使用echo打印對象時調用,返回打印對象時想要顯示的內容。

8.__call():調用一個類中未定義的或未公開的方法時自動調用,傳遞被調用的函數名及參數列表

class Person{
    public $name;
    public $age;
    
    function __call($funcName,$funcParams){
      echo "您調用的函數{$funcName},參數列表";
      print_r($funcParams);
      echo "不存在/未公開";
    }
}
$zhangsan=new Person();
$zhangsan->say(1,2,3);

如代碼所示,調用不存在的say(1,2,3);時,會打印

您調用的函數way,參數列表Array ( [0] => 123 ) 不存在

9.__clone():當使用clone關鍵字,克隆一個對象時自動調用,作用是為新克隆的對象初始化賦值

class Person{
    public $name;
    public $age;
    
    function __clone(){
    $this->name="lisi";
    }
}  
$zhangsan=new Person("zhangsan",24);
$lisi=clone $zhangsan;
echo $lisi->name;

打印出的結果是"lisi",而不是"zhangsan"。

10.__sleep():對象序列化時自動調用,返回一個數組,數組中的值就是可以序列化的屬性

class Person{
    public $name;
    public $age;
    
   function __sleep(){
    return array("name","age");
  }
}

如上述代碼,在用serialize()序列化對象時只有"name","age"屬性會被序列化。

11.__wakeup():對象反序列化時自動調用,為反序列化新產生的對象進行初始化賦值

class Person{
    public $name;
    public $age;
    
   function __wakeup(){
    $this -> name = "lisi";
  }
}

將對象序列化后再反序列化,同時給對象的name屬性賦初值為"lisi"。

12.__autolode():需要在類外部聲明函數,當實例化一個未聲明的類時自動調用,傳遞實例化的類名,可以使用類名自動加載對應的類文件。

function __autoload($className){
  include "class/".strtolower($className).".class.php";
}
  
$zhangsan=new Person();
$zhangsan->say();

如上述代碼,Person類不存在時調用__autolode()方法,載入寫在文件外的類,"class/".strtolower($className).".class.php";就是類文件的相對路徑,$className就是

不在本文件中的類的類名,因此在創建外部類文件時命名方式必須是小寫的類名.class.php。__autolode()方法也是惟一一個不用寫在類中的魔術方法。

以上就是PHP中的魔術方法,合理利用這些方法可以輕松實現對象的各種操作。希望對大家的學習有所幫助,也希望大家多多支持綠夏網。


PHP

主站蜘蛛池模板: 重温经典节目预告| 赏金猎人日本电影完整版| 那些年,那些事 电视剧| 新闻联播台词| 苹果恋爱多| 火辣监狱在线观看| 花飞满城春 电影| 失魂家族| 豆花电影免费播放| soul电影| 6套电影频道节目表| 漂亮主妇| 薛昊婧演过的电视剧| 团结就是力量歌词电子版| 哥哥啊啊啊| 时代少年团壁纸| 夜魔3| 挠丝袜| 羞羞的动漫在线观看| 抖音火山版| 画江湖之不良人第七季什么时候出| 极度猎杀| 房事性生活| 通往幸福的途径电影在线观看| 孤战迷城电视剧剧情介绍| 《西游降魔篇》2| 洞房艳谭电影| 狂野殴美激情性bbbbbb| 香水有毒微电影无删减完整版| 李洋简介| 四川不锈钢水箱制造厂| 不要嘲笑我们的性| 三人越谷文言文翻译| 电影《exotica》完整版观看| 叶子楣地下裁决| 诺亚方舟电影免费完整版在线观看| 舞法天女绚彩归来| 花火图片| 内蒙古电视台节目表| 罗比威廉姆斯| 林佑星|

!!!站長長期在線接!!!

網站、小程序:定制開發/二次開發/仿制開發等

各種疑難雜癥解決/定制接口/定制采集等

站長微信:lxwl520520

站長QQ:1737366103