做个技术宅

PHP中的十大魔术方法详解

PHP中有很多魔术方法,它们都需要一个触发时机由系统自动调用,下面我们看看常见的十大魔术方法。

一、__construct

构造方法,这个方法最常看到了,在所有方法之前优先调用,也可用作初始化一个类。

二、__destruct

析构方法,这个方法与__construct对应,在对象被销毁时调用,也就是在程序结束时会调用。

三、__get

触发时机:获取私有或受保护属性值的时候调用

<?php
class Test{
    public $name;
    protected $age;
    private $weight;
}
$test = new Test();

我们如果直接打印$test->age会报错,因为age是Test的受保护的属性,不可直接调用,如果想调用必须写上__get方法:

<?php
class Test{
    public $name;
    protected $age=1;
    private $weight;

    public function __get($value)
    {
        if($value=='age'){
            return $this->$value;
        }
    }
}
$test = new Test();
var_dump($test->age);

四、__set

触发时机:设置私有或受保护属性值的时候调用,使用方法和上面一样,只不过__set($name,$value)需要传2个值,一个名字,一个值

五、__unset

触发时机:销毁私有或受保护属性值的时候调用,比如上述代码:

$test = new Test();
unset($test->weight);//会报致命错误

我们得在类里面加上这段代码:

public function __unset($value)
    {
        if($value=='weight'){
            unset($this->weight);
        }
    }

这样就好理解__unset的作用。

六、__isset

触发时机:判断(属性是否存在)私有或受保护属性值的时候调用,用法与__unset如出一辙

七、__call

触发时机:当调用一个不存在的对象方法的时候触发,比如:

<?php
class Test{
    public function say(){
        echo 'hello';
    }
}
$test = new Test();
$test->speak();

上述代码会报致命错误,因为speak方法不存在;但是如果加上__call()方法,再看一下:

<?php
class Test{
    public function say(){
        echo 'hello';
    }
    public function __call($name, $arguments)
    {
        var_dump($name,$arguments);
    }
}
$test = new Test();
$test->speak('speak',[1,2,3]);

我们可以看到结果是:

string(5) "speak"
array(2) {
  [0]=>
  string(5) "speak"
  [1]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(2)
    [2]=>
    int(3)
  }
}

这就是__call()的神奇之处。通常用作数据库操作类。

八、__callStatic

触发时机:当调用一个不存在的静态方法时调用,与__call类似

九、__toString

触发时机:当echo一个对象的时候调用
我们知道对象不能被echo,但是如果非要echo,在类里面加上__toString,可以控制输出对象的内容

十、__debugInfo

触发时机:当var_dump来打印这个对象的时候调用,返回一个自定义的数组,你想打印什么就打什么

十一、__sleep()

执行serialize()时,先会调用这个函数

十二、__wakeup()

执行unserialize()时,先会调用这个函数

十三、__clone()

当对象复制完成时调用,可用作复制一个对象,然后对对象内容进行小幅修改

十四、__autoload()

尝试加载未定义的类

回复

This is just a placeholder img.