知优码

您现在的位置是:首页 > Php语言 > php基础

php基础

搞懂php类中的魔术方法__set__get__isset()

2020-05-02php基础
PHP中所有以两个下划线开头的类方法为魔术方法。__set() ,__get() ,__isset(),__unset() ,__call() ,__callStatic()又被称为类的重载方法

php的重载方法
PHP中所有以 __(两个下划线)开头的类方法为魔术方法。是系统默认保留的,在定义类的方法时,除了上述魔术方法,建议不要以 __ 为前缀。

当在对象上调用未定义或不可见的类属性或方法时,重载方法会被调用。__set() ,__get() ,__isset(),__unset() ,__call() ,__callStatic()又被称为类的重载方法,通常使用不可访问属性(inaccessible properties)和不可访问方法(inaccessible methods)来称呼这些未定义或不可见的类属性或方法。

所有的重载方法都必须被声明为 public。

一、类的属性的重载


在给未定义或不可见的属性赋值时,__set() 会被调用。

访问未定义或不可见的属性时,__get() 会被调用。

当对未定义或不可见的属性调用 isset() 或 empty() 时,__isset() 会被调用。

当对未定义或不可见的属性调用 unset() 时,__unset() 会被调用。

二、类的方法的重载


在对象上调用一个未定义或不可见的普通方法时,__call() 会被调用。

在对象或类上调用一个未定义或不可见的静态方法时,__callStatic() 会被调用。

三、示例

<?php
class Student{
    public $name="lisi"; //外部可见属性
    private $age=18; //外部不可见属性


    public function __get($name)
    {
        echo "__get($name)";
    }

}

$s = new Student();
echo $s->name; //输出lisi,访问公开属性

echo $s->age; //输出__get(age),访问不可见属性,调用魔术方法__get

echo $s->height;//输出__get(height),访问未定义属性,调用魔术方法__get
总结:php中重载魔术方法的调用是针对不可见和未定义的属性和方法的调用以及赋值的。private的属性或方法虽然已经定义了,但类外部不可访问,魔术方法依旧会被执行。