作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
从PHP5开始,对面向对象的支持开始进入实质阶段,由于要保持向下兼容,所以在使用的过程中会碰到一些问题非常有趣的问题。今天在学习的过程中看到书中有一个提示:PHP4中构造方法是一个与类同名的方法,而从PHP5开始,用__construct()做为构造方法,但仍然支持PHP4的构造方法。我就想到一个问题:如果这两种类型的构造方法同时出现在一个类中,结果会如何。下面通过一个测试来看看会发生怎样的状况。
一、PHP4类型构造方法在前,PHP5类型构造方法在后
1、源代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| <?php class People { private $name; private $age; function People() { echo "call construct method 'People'"; $this->age = 0; } function __construct() { echo "call construct method '__construct'"; $this->age=20; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setAge($age) { $this->age = $age; } public function getAge() { return $this->age; } } ?>
|
2、执行:。
第一次调用会报错:
Strict Standards: Redefining already defined constructor for class People in /home/aofeng/local/nginx-0.7.68/html/object/Pepole.php on line 13
后续调用就恢复正常,并且只会执行构造方法__construct()而略过构造方法People()。
二、PHP5类型构造方法在前,PHP4类型构造方法在后
1、源代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| <?php class People { private $name; private $age; function __construct() { echo "call construct method '__construct'"; $this->age=20; } function People() { echo "call construct method 'People'"; $this->age = 0; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setAge($age) { $this->age = $age; } public function getAge() { return $this->age; } } ?>
|
2、执行:。
会正常执行,且可以调用:$people->People();
三、总结 | Summary
- __construct()在前面时,碰到与类同名的构造方法时,不做处理,将其作为普通方法对待;
- 与类同名的构造方法在前面时,在碰到__construct()构造方法时,优先将__construct()作为构造方法,同时提示用户。