魔术变量__get和__set()和__call() 的详解

在外部调用类中不公开的属性时(private,protected),程序会抛出错误信息
Fatal error: Uncaught Error: Cannot access private property Db::$name
有了__get()和__set()后,当外部调用类中不开的属性时,程序会自动调用__get()、__set()方法。
在类中未声明魔术方法__get()、__set() 方法时,外部调用私有属性会报错:

class User 
{
    private $name = '大笑哈哈';
}
$user = new User;
echo $user->name ; //Fatal error: Uncaught Error: Cannot access private property User::$name

//Fatal error: Uncaught Error: Cannot access private property User::$name

__get($name)

当使用__get() 函数时,程序会自动调用__get()函数,__get($name)函数必须接收一个参数。看如下代码:

class User
{
    private $name = '大笑哈哈';
    //__get() 必须接受一个参数。
    public function __get($name)
    {
        return $name;
    }
}

$user = new User;
echo $user->name; //name ;自动调用__get函数,并返回了当前调用的属性名称。

__set($name ,$value);

__set($name ,$value) ,设置不公开的属性。必须接受两个参数。实例代码:

class User
{
    private $name;
    public function __set($name ,$value)
    {
        $this->$name = $value;
    }
    
    public function getName()
    {
        return $this->name;
    }
}
$user = new User;
$user->name = '大笑哈哈';
echo $user->getName(); //'大笑哈哈';在外部修改了类中私有属性。

__call($method ,$args);

__call($method ,$args) 当调用类中不存在的方法时,则会调用__call方法,该方法接受两个参数,$method为当前调用不存在的方法名称,$args为方法中的参数,参数可能有多个,所有$args参数为数组,看实例代码:

class User
{
    /*
       $method [String] 方法名称
       $args   [Array]  方法参数
    */
    public function __call($method ,$args)
    {
        var_dump($method ,$args);
    }
}

$user = new User;

//User类中没有index 方法,那么程序会自动调用__call方法。
$user->index('大笑哈哈');// 返回__call方法的结果。string(5) "index" array(1) { [0]=> string(12) "大笑哈哈" }

猜你喜欢

转载自www.cnblogs.com/daxiaohaha/p/11539848.html