php中的魔术方法

121 阅读2分钟

php中主要拥有四种魔术方法:

__set和__get方法, 主要对对象中不存在的属性进行获取和设置;下面看例子:

object = new \Imooc\Object();object->title = 'hello'; echo $object->title; 在上面代码中,我们首先获取Object对象,class Object

{ protected array = [];
    public function __set(name, value)
    {this->array[name] =value; // TODO: Implement __set() method. } public function __get(name)
    {
        var_dump(__METHOD__);
        returnthis->array[$name]; // TODO: Implement __get() method. } } 但是在Object中并不存在title这个属性,如果没有__set,__get方法的话,php就会抛出一个错误,但是如果设置了__set,__get方法的话,就不会存在问题,如果访问的属性不存在,会首先访问__set方法, 去设置这个属性,获取的时候会首先访问__get方法,然后返回设置好的数组中的某个属性,

下面继续看__call和__callStatic这两个方法,和__set,__get相似,不过他们一组是针对属性,一组是针对方法

__call 和 __callStatic方法,是针对方法的,如果你去访问一个不存在的方法的时候,php就会报一个错误,但是如果我们设置了__call方法的时候 就不会存在这个错误,

下面我们看代码:

object = new \Imooc\Object();object->test('hello', 123); namespace Imooc;

class Object {

} 但是Object中并不存在 test方法,就会报错:

Fatal error: Uncaught Error: Call to undefined method Imooc\Object::test() in /www/resot/index.php:26 Stack trace: #0 {main} thrown in /www/resot/index.php on line 26

但是如果我们设置了__call方法 就不会有这个错误

namespace Imooc;

class Object { public function __call(name,arguments) { var_dump(name,arguments); // TODO: Implement __call() method. } } __call就会接收两个参数,name是这个方法的名称,arguments是所有的参数

string(4) "test" array(2) { [0]=> string(5) "hello" [1]=> int(123) }

打印结果出来如上,打印的方法名称是test,后面是所有的参数

可以在这里做对应的处理

__callStatic方法和__call大致是相同的,只是一个对应的是普通方法,一个对应的是静态方法 大家可以自己做测试,在此就不做赘述!

下一个是:__toString 他的作用就是当我们输入一个对象的时候,他就会自动去调用__toString方法,他会将一个对象转换为字符串

object = new \Imooc\Object();
echoobject; 如果没有设置__toString方法,就会报错

Recoverable fatal error: Object of class Imooc\Object could not be converted to string in /www/resot/index.php on line 26

如果设置

public function __toString() { // TODO: Implement __toString() method. return CLASS; } 就会输出:Imooc\Object

下一个魔术方法:__invoke(); 默认对象是不能做为一个函数来访问的,但是如果这个对象里设置了__invoke方法的话,这个对象就可以做为一个函数访问,他也有返回值,就是__invoke的返回值,

object = new \Imooc\Object();
echoobject("test1"); public function __invoke(param)
    {
        var_dump(param); return 'invoke'; // TODO: Implement __invoke() method. } 打印结果大家可以做个试验。

这几种魔术方法在实际的应用场景中还是很有用的,请大家结合自己的应用和魔术方法结合