php中魔术方法做什么的,php中的魔术方法

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

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

equation?tex=object%20%3D%20new%20%5CImooc%5CObject()%3Bobject->title = 'hello';

echo $object->title;

在上面代码中,我们首先获取Object对象,class Object

{

protected

equation?tex=array%20%3D%20%5B%5D%3B%0A%20%20%20%20public%20function%20__set(name,

equation?tex=value)%0A%20%20%20%20%7Bthis->array[

equation?tex=name%5D%20%3Dvalue;

// TODO: Implement __set() method.

}

public function __get(

equation?tex=name)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20var_dump(__METHOD__)%3B%0A%20%20%20%20%20%20%20%20returnthis->array[$name];

// TODO: Implement __get() method.

}

}

但是在Object中并不存在title这个属性,如果没有__set,__get方法的话,php就会抛出一个错误,但是如果设置了__set,__get方法的话,就不会存在问题,如果访问的属性不存在,会首先访问__set方法, 去设置这个属性,获取的时候会首先访问__get方法,然后返回设置好的数组中的某个属性,

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

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

下面我们看代码:

equation?tex=object%20%3D%20new%20%5CImooc%5CObject()%3Bobject->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(

equation?tex=name%2Carguments)

{

var_dump(

equation?tex=name%2Carguments);

// TODO: Implement __call() method.

}

}

__call就会接收两个参数,

equation?tex=name%E6%98%AF%E8%BF%99%E4%B8%AA%E6%96%B9%E6%B3%95%E7%9A%84%E5%90%8D%E7%A7%B0%EF%BC%8Carguments是所有的参数

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

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

可以在这里做对应的处理

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

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

equation?tex=object%20%3D%20new%20%5CImooc%5CObject()%3B%0Aechoobject;

如果没有设置__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的返回值,

equation?tex=object%20%3D%20new%20%5CImooc%5CObject()%3B%0Aechoobject("test1");

public function __invoke(

equation?tex=param)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20var_dump(param);

return 'invoke';

// TODO: Implement __invoke() method.

}

打印结果大家可以做个试验。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值