魔术方法

系统在特定的时机自动调用的方法

1、__get

  • 触发时机:对象在外部访问私有成员或者受保护属性时调用
  • 该方法有一个参数:参数就是属性名

2、__set

  • 触发时机:对象在外部设置私有或者受保护成员属性值得时候调用
  • 该方法有两个参数:
    • 参数1:成员属性名
    • 参数2:要设置的值
class Person
{
    public $data = [];
    public function __set($name,$value)
    {
        echo "设置'$name'为$value";
        $this->data[$name] = $value;
    }
​
    public function __get($name)
    {
        echo "获取'$name'的值";
        if( array_key_exists($name,$this->data) ){
            return $this->data[$name];
        }
    }
}
$person = new Person();
$person->username = 'jack';
​
echo $person->age; 

3、__unset

  • 触发时机:对象在外部销毁私有或者受保护成员属性的时候调用
  • 该方法有一个参数:参数就是私有的成员属性名

4、__isset

  • 触发时机:对象在外部判断私有或者受保护成员属性的时候调用
  • 该方法有一个参数:参数就是私有的成员属性名 
class Person
{
    private $data = [];
​
    public function __isset($name){
        return isset($this->data[$name])
    }
​
    public function unset($name){
        unset($this->data[$name]);
    }
}

 

5、__construct构造方法

  • 触发时机:在创建对象的时候自动调用

6、__destruct析构方法

  • 在页面结束、对象销毁的时候自动被调用。 当对象没有指向时,对象被销毁。
class FileRead
{
    protected $handle = NULL;
​
    function __construct(){
        $this->handle = fopen(…);
    }
​
    function __destruct(){
        fclose($this->handle);
    }
}

7、__toString

  • 触发时机:echo 一个对象的时候触发
  • 该函数需要return一个字符串
class Person
{
    public $data = [];
    public function __toString()
    {
        return "我是一个对象你偏要echo我";
    }
}
$person = new Person();
echo $person;

8、__call

  • 触发时机:当调用一个不存在的对象方法的时候触发
  • 参数1:函数名
  • 参数2 数组 函数中的参数都被存放到这个数组中
class Person
{
    public $data = [];
    public function __call($func,$array)
    {
        var_dump($func,$array);
    }
}
$person = new Person();
$person->mm('a','b','c');

9、_callStatic

  • 触发时机:当调用一个不存在的静态方法的时候
class Person
{
    public $data = [];
    public static function __callStatic($func,$array)
    {
        var_dump($func,$array);
    }
}
Person::mm('a','b','c');

10、 __sleep

序列化对象,保存对象

  • 触发时机:在序列化一个对象的时候调用
  • 返回值:数组,数组里你想要的序列的成员属性名
class Person
{
    public $name = 'xxx';
    public $age = 18;
    public $info = '出来浪啊';
    public function __sleep()
    {
        return ['info'];
    }
}
$p = new Person();
var_dump(serialize($p));

11、__wakeup

  • 触发时机:在反序列化一个对象的时候调用 反序列化成功后,想要让对象执行一些初始化方法,可以写到这个函数中
class Person
{
    public $name = 'xxx';
    public $age = 18;
    public $info = '出来浪啊';
    public function __sleep()
    {
        return ['info'];
    }
​
    public function __wakeup(){
        $this->def();
    }
​
    public function def(){
        echo '你们都出去浪吧 不用管我';
    }
}
$p = new Person();
$strp = serialize($p);
$obj = unserialize($strp);
 

12、__clone

  • 触发时机:在克隆一个对象的时候调用 在这里可以对克隆出来的对象的属性做一些操作

在PHP5中,当我们创建一个对象的副本的时候,PHP其实只是创建了这个对象的一个引用,而不是复制整个新对象。换句话说,这两个变量会指向相同的东西,通过一个对象对其值得修改会影响到另一个对象

 

13、__invoke

当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。

class CallableClass 
{
    function __invoke($x) {
        var_dump($x);
    }
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));

 

class Person
{
    public $data = [];
    public static function __callStatic($func,$array)
    {
        var_dump($func,$array);
    }
}
Person::mm('a','b','c');
 
posted @ 2020-07-01 22:22  成文的博客  阅读(98)  评论(0编辑  收藏  举报