php权限魔术方法

__get() && __set()

以下是官方文档的解释

__set() is run when writing data to inaccessible properties.
当给很难接近的属性写入数据时(函数)__set()执行
__get() is utilized for reading data from inaccessible properties.
__get()被用来读取很难接近的属性的数据

inaccessible properties可以包括:
- 私有属性
- 没有初始化的属性

下面演示一下对于没有初始化的属性的访问和赋值

code

class Object
{
}
$obj = new Object();
echo $obj->name;

result

PHP Notice: Undefined property: Object::$title in /root/learnphp/index.php on line 7


code

class Object
{
    protected $array = array();
    function __set($key, $value)
    {
        $this->array[$key] = $value;
    }
    function __get($key)
    {
        if (array_key_exists($key, $this->array)) {
            return $this->array[$key];
        } else {
            return null;
        }
    }
}

result

$obj = new Object();
echo "---\n";
echo $obj->name;
echo "---\n";
$obj->name = 'obj';
echo $obj->name;

上面演示了对于没有初始化的属性的访问和赋值,inaccessible properties 还包括另一种,就是私有属性,这个相对来说就比较简单,下面写一个demo

code

class Object
{
    private $name = "private obj";
    function __set($key, $value)
    {
        if (property_exists($this, $key)) {
            $this->$key = $value;
        }
    }
    function __get($key)
    {
        if (property_exists($this, $key)) {
            return $this->$key;
        } else {
            return null;
        }
    }
}
$obj = new Object();
echo $obj->name;
echo "\n---\n";
$obj->name = 'obj';
echo $obj->name;

result

private obj
---
obj

__call()

__call() is triggered when invoking inaccessible methods in an object context.

上面是官方文档中的一句话,翻译过来就是在对象中调用一个不可访问的方法时,__call()会被调用,和__get()一样,只不过一个对应的是方法,一个对应的是属性,下面看一下测试

code

class Object
{
}
$obj = new Object();
$obj->show("Hello", "World", 9);

result

PHP Fatal error:  Call to undefined method Object::show() in /root/learnphp/index.php on line 18

code

class Object
{
    function __call($name, $arguments)
    {
        var_dump($name, $arguments);
    }
}

$obj = new Object();
$obj->show("Hello", "World", 9);

result

string(4) "show"
array(3) {
  [0]=>
  string(5) "Hello"
  [1]=>
  string(5) "World"
  [2]=>
  int(9)
}

我们可以看到__call()确实实现了访问没有定义的方法的方法,那么__call()到底用来干嘛呢,其实__call()可以帮我们实现重载,具体的资料大家可以上网搜索

__callStatic()

__callStatic()其实和__call()一样,后者是对象中调用一个不可访问的方法时执行,前者在类调用一个不可访问的方法时调用。

code

class Object
{
    static function __callStatic($name, $arguments)
    {
        var_dump($name, $arguments);
    }
}
Object::show("Hello", "World", 9);

result

string(4) "show"
array(3) {
  [0]=>
  string(5) "Hello"
  [1]=>
  string(5) "World"
  [2]=>
  int(9)
}

转载自北城的技术博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值