PHP笔记-面向对象之构造方法定义

作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!

从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、执行:。

1
$people = new People();

第一次调用会报错:

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、执行:。

1
$people = new People();

会正常执行,且可以调用:$people->People();

三、总结 | Summary

  • __construct()在前面时,碰到与类同名的构造方法时,不做处理,将其作为普通方法对待;
  • 与类同名的构造方法在前面时,在碰到__construct()构造方法时,优先将__construct()作为构造方法,同时提示用户。