PHP学习笔记(3) - 奇怪的class与autoload

PHP的class与其他语言有很多不同点。PHP允许很奇葩的在静态方法中调用实例方法,提供了关键字self和static用于访问类自身的静态成员。self永远是指当前的类,而static则可能会变成指向派生类,这也是比较奇葩的地方,静态成员是可以继承和覆盖的。

 

PHP还提供了一些以双下划线开头的魔术方法(包括构造方法和一些内置的“接口”),下面即是PHP现有的魔法方法:

1、__construct($args) 和 __destruct(void) 

即构造方法和析构方法,与其他语言相同,在实例化时调用构造方法,在回收对象时调用析构方法。析构方法可用于在执行结束后自动回收资源,像关闭一些以指针引用的资源。

 

2、mixed __call (string $name , array $arguments) 和 mixed __callStatic (string $name , array $arguments)

如果调用一个对象中不存在的方法或类中不存在静态方法,就会分别调用上面两个方法。这两个方法使得你可以使用一些特别的动态运行机制,让方法无中生有。个人建议尽量少用,它们会让代码难以维护,并且无法被IDE支持。

 

3、mixed __get (string $name) 和 __set (string $name , mixed $value)

跟__call一样,它们是在调用不存在的属性时候被执行,同样建议少用。

 

4、bool __isset (string $name __unset (string $name)

当对对象不存在的属性调用 isset() 或 empty() 时,__isset() 会被调用。__unset则是在调用unset时被调用。

 

5、array __sleep (void) 和 __wakeup (void)

这两个方法会分别在序列化之前和序列化之后调用,可用于整理将序列化的对象的属性和在序列化之后恢复状态。

 

6、string __toString (void)

它告诉PHP在需要将对象转换为字符串时应该如何转换,像 echo new MyClass();

 

7、mixed __invoke ()

在把一个对象变量当成函数来调用时会调用这个方法。

 

8、object __set_state (array $properties)

在对一个对象调用var_export()时它将被调用,并以返回值代替对象自身,可以让它来组织导出变量的数据。

 

9、__clone()

用这个方法允许我们在复制对象的同时也为属性进行深拷贝,类似.net中的ICloneable接口。

 

 

关于自动加载:

PHP自身没有自动加载的机制,但是新版本中提供了spl_autoload_register这个函数来注册一个函数,在使用一个不存在的类时被注册的函数即被调用,开发者需要手工在函数中实现加载机制。笔者没深入了解过include的机制,如果还需要检测一个文件是否存在,可能会让运行效率变低。

PHP学习笔记(3) - 奇怪的class与autoload,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。