php中主要拥有四种魔术方法:
__set和__get方法, 主要对对象中不存在的属性进行获取和设置;下面看例子:
object->title = 'hello';
echo $object->title;
在上面代码中,我们首先获取Object对象,class Object
{
protected
name,
this->array[
value;
// TODO: Implement __set() method.
}
public function __get(
this->array[$name];
// TODO: Implement __get() method.
}
}
但是在Object中并不存在title这个属性,如果没有__set,__get方法的话,php就会抛出一个错误,但是如果设置了__set,__get方法的话,就不会存在问题,如果访问的属性不存在,会首先访问__set方法, 去设置这个属性,获取的时候会首先访问__get方法,然后返回设置好的数组中的某个属性,
下面继续看__call和__callStatic这两个方法,和__set,__get相似,不过他们一组是针对属性,一组是针对方法
__call 和 __callStatic方法,是针对方法的,如果你去访问一个不存在的方法的时候,php就会报一个错误,但是如果我们设置了__call方法的时候 就不会存在这个错误,
下面我们看代码:
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(
arguments)
{
var_dump(
arguments);
// TODO: Implement __call() method.
}
}
__call就会接收两个参数,
arguments是所有的参数
string(4) "test" array(2) { [0]=> string(5) "hello" [1]=> int(123) }
打印结果出来如上,打印的方法名称是test,后面是所有的参数
可以在这里做对应的处理
__callStatic方法和__call大致是相同的,只是一个对应的是普通方法,一个对应的是静态方法 大家可以自己做测试,在此就不做赘述!
下一个是:__toString 他的作用就是当我们输入一个对象的时候,他就会自动去调用__toString方法,他会将一个对象转换为字符串
object;
如果没有设置__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("test1");
public function __invoke(
param);
return 'invoke';
// TODO: Implement __invoke() method.
}
打印结果大家可以做个试验。
这几种魔术方法在实际的应用场景中还是很有用的,请大家结合自己的应用和魔术方法结合