PHP帮助手册拾遗:类与对象
1、__autoload函数
__autoload函数定义时必须包含一个参数,否则会显示如下错误:
Fatal error: __autoload() must take exactly 1 argument
在 __autoload 函数中抛出的异常不能被 catch 语句块捕获并导致致命错误。
2、父类的构造方法调用
如果子类中定义了构造函数则不会暗中调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。这里python和php一样
3、父类的析构方法调用
和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。
析构函数在脚本关闭时调用,此时所有的头信息已经发出。
试图在析构函数中抛出一个异常会导致致命错误。
4、访问限制
var与public在类中的变量定义相同,但是在php5的php5.1.3会生成一个E_STRICT警告
方法如果没有设置访问控制,则将默认设置为public
5、构造方法
PHP提交两种构造方法,以类名和__construct,当类中没有__construct方法时,PHP会调用类名函数,但是如果存在__construct时,不管其访问控制是什么,都不会调用类名函数。
如下所示代码:
1 2 3 4 5 6 7 8 9 10 11 | class Demo { public function Demo() { echo 'Demo function'; } private function __construct() { echo '__construct function'; } } $demo = new Demo(); |
运行会报错:Fatal error: Call to private Demo::__construct() from invalid context
ps:上面的这个问题是ben前辈提出的,感谢ben前辈昨天的指导
6、静态变量
PHP5.3以后,可以使用变量引用类,但是这个变量不能是关键字(如self,parent,static等)。如下所示代码:
1 2 3 4 5 6 | class Demo { public static $my_static = 'Demo'; } $classname = 'Demo'; print $classname::$my_static . "\n"; // As of PHP 5.3.0 |
7、接口
接口可以有常量,不能有变量,并且常量在其子类中无法重载
如下所示代码:
1 2 3 4 5 6 7 8 9 10 11 | interface Base { const constant = 'constant value'; public $var = "test var"; } class Foo implements Base { } echo Base::constant; echo Base::$var; |
以上代码报错为:Fatal error: Interfaces may not include member variables
注释掉对变量的操作后可以正常打印常量中存放的值。
8、对象迭代
在PHP5中,使用foreach,遍历一个对象,可以访问这个对象的所有可以访问的属性
如果要自定义迭代器,可以通过实现一个叫Iterator的接口来实现
9、单例模式
单例模式(singleton模式)在实现过程中,需要考虑__clone方法。
10、对象与引用
PHP5之后,对象在默认情况下是以引用的方式传递的。
运行会报错:Fatal error: Call to private Demo::__construct() from invalid context
private 当然会报错啦..
其实这里想说明的是当有__construct存在时,是不会调用类名函数作为构造函数
哦哦, 呵呵.
起始public也一样啊. 可以看到__construct function 也证明问题鸟..
Pingback引用通告: Think In LAMP Blog » Blog Archive » PHP每月通讯(2010年10月)