PHP魔术方法

PHP 魔术方法

  1. __get/__set:接管 对象 属性。定义私有属性和设置私有属性
  2. __call/__callStatic:控制对象的 方法 调用
  3. __toString:将 PHP 对象转换为字符串
  4. __invoke:将 PHP 对象当成函数执行时会调用这个方法

__get/__set

$obj = new Work\Objection();
echo $obj->title;

调用对象不存在的属性时会报错

应该在对象内设置__get/__set方法

class Objection{
    protected $array = array();
    
    function __set($key, $value){
        $this->array[$key] = $value;
    }
    
    function __get($key) {
        return $this->array[$key];
    }
}

这样一来,就不会报错。$obj->title = "hello";会调用 set 设置属性,echo $obj->title;会调用 get 获取属性

$obj = new Work\Objection();
$obj->title = "hello";
echo $obj->title;

__call/__callStatic

调用对象不存在的方法时会报错

$obj = new Work\Objection();
echo $obj->test("hello", 123);

这时设置在对象内设置__call方法

function __call($fun, $param) {
    var_dump($fun, $param);
    return "magic function";
}

调用到对象内不存在的方法时,会自动调用__call方法

static function __callStatic($name, $arguments) {
    var_dump($name, $arguments);
    return "magic function";
}
\Work\Objection::test("hello", 123);

__toString

$obj = new Work\Objection();
echo $obj;

对象本身不能当做字符串来输出,需要转换成字符串,应该有__toString方法自动回调

function __toString() {
    return __CLASS__;
}

__invoke

对象当成函数执行

$obj = new Work\Objection();
echo $obj("test1");
function __invoke($param) {
   var_dump($param);
   return "invoke";
}

本文链接:https://ariser.cn/index.php/archives/341/
本站文章采用 知识共享署名4.0 国际许可协议进行许可,请在转载时注明出处及本声明!