Do you know all the sixteen magic methods in PHP?

藏色散人
Release: 2023-04-09 19:52:01
forward
3305 people have browsed it

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()
Copy after login
NO.2 __destruct() [abnormal view]
定义:类的析构函数
解释:与构造函数相反,在类销毁之前执行一些操作,比如关闭文件、释放结果等。
例子:
主动调用 unset( $obj )主动调用 $obj = NULL程序自动结束
Copy after login
NO.3 __call()
定义:在对象中调用一个不存在的方法时 自动调用
解释:为了避免当调用的方法不存在时产生错误,而意外的导致程序中止,可以使用 __call() 方法来避免。
Copy after login
NO.4 __callStatic()
定义:同上 不同在于调用静态方法时 自动调用
Copy after login
NO.5 __get()
定义:可以在对象的外部获取私有成员属性的值
例子: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>";
Copy after login
No.6 __set()
定义:与__get()类似 为私有属性赋值
例子:public function __set($propertyName, $value){
    $this->$propertyName = $value;}
Copy after login
No.7 __isset()
定义:在类外部 判断属性isset()例子:public function __isset($content) {
    echo "当在类外部使用isset()函数测定私有成员{$content}时,自动调用<br>";
    echo  isset($this->$content);}echo isset($person->name);
Copy after login
#No.8 __unset()
定义:在类外部删除私有变量时自动调用
Copy after login
No.9 __sleep()
定义:执行serialize时会被自动调用
例子:public function __sleep(){
    $this->name = base64_encode($this->name);
    return ['name', 'age'];}echo serialize($person);
Copy after login
#No.10 __wakeup()
定义:与__sleep类似 在执行unserialize()时被自动调用
Copy after login
No.11 __toString()
定义:当类被当成字符串输出时如何响应 例如 echo $obj; 应该显示些什么。

注意:此方法必须返回一个字符串,否则将发出一条 `E_RECOVERABLE_ERROR` 级别的致命错误。

警告:不能在 __toString() 方法中抛出异常。这么做会导致致命错误。
Copy after login
NO.12 __invoke()
定义:当尝试以调用函数的方式调用一个对象生效
例子:public function __invoke() {
    echo '拿我当函数用,我就会被自动调用';}$person = new Perseon();$person();
Copy after login
No.13 __set_state()
定义:调用var_export导出类时,该方法自动被调用。
Copy after login
#No.14 __clone()
定义:当对象复制完成时调用
例子:public function __clone(){
    echo __METHOD__."你正在克隆对象<br>";
    $this->name = 'new name';
    $this->age = 18;}$copy_of_object = clone $object;
Copy after login
No.15 __autoload()
定义:尝试加载未定义的类
例子: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, &#39;model&#39; ) );
    spl_autoload_register ( array ($this, &#39;library&#39; ) );
  }
  public function model($class) {
    $class = preg_replace ( &#39;/_model$/ui&#39;, &#39;&#39;, $class );
    set_include_path ( get_include_path () . PATH_SEPARATOR . &#39;/model/&#39; );
    spl_autoload_extensions ( &#39;.model.php&#39; );
    spl_autoload ( $class );
  }
  public function library($class) {
    set_include_path ( get_include_path () . PATH_SEPARATOR . &#39;/lib/&#39; );
    spl_autoload_extensions ( &#39;.library.php&#39; );
    spl_autoload ( $class );
  }}//callautoloader::init ();?>
Copy after login
#No.16 __debugInfo()
定义:打印所需调试信息
例子:public function __debugInfo(){
    return [
        'message' => "姓名:".$this->name . " 年龄:".$this->age    ];}$person = new Person('tongfei', 28);var_dump($person);
Copy after login

【Recommendation:《PHP 视频 Course》】

The above is the detailed content of Do you know all the sixteen magic methods in PHP?. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
php
source:learnku.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!