我无法理解什么是__construct()。我看不出这两个例子之间的区别:
1)
class Person {
public function __construct($person) {
echo $person;
}
$person = new Person('Name');
2)
class Person {
public function name($name) {
echo $name;
}
}
$person = new Person();
$person->name('Name');
答案 0 :(得分:4)
在这个人为的例子中,第二个很好。
如果name
是该类的一个字段,而不仅仅是一个回声方法,该怎么办?在明确设置它之前它的价值是什么?
要确保在可以使用对象之前初始化字段并完成设置,请使用构造函数。如果您不需要初始化,则不一定需要编写显式构造函数。
答案 1 :(得分:2)
你的两个例子可能看起来确实相同,但仅从一个(你的,现在)的角度来看。
class Person { // First case : using the constructor
public function __construct($person) {
echo $person;
}
}
// ----------------------------------------------------------------
$person = new Person('Name');
在此示例中,您清楚地表明,类Person
(或其子类之一)的每个对象必须在创建后立即为其指定名称。在任何时间点都没有名字Person
。在您以某种方式共享代码的情况下,这是您选择强加给自己的设计约束(如果您打算创建类Person
)或其他对象。如果有人试图违反此约束,PHP将挂起显式错误/警告消息。 (演示:https://3v4l.org/hCXZ8)
class Person { // Second case : no constructor (equivalent to an empty constructor)
public function name($name) {
echo $name;
}
}
// ----------------------------------------------------------------
$person = new Person();
$person->name('Name');
这是一个不同的野兽:你可以创建一个类Person
的对象,你可以显示一个名字。您还可以创建Person
,并且根本不显示名称。实际上,如果您因某些原因没有着眼于类代码,您可能甚至不知道自己可以这样做(通常的做法是给每个班级一个不同的文件)。
在这两个例子中,我在类声明和用法之间画了一条注释,因为这是两个不同的观点(认为它们甚至可以是两个不能相互沟通的人)。作为类作者,您可以将约束精确地转换为可以生成的最明确的代码。作为类用户,您不想浪费时间来理解您正在使用的类的复杂性:您希望创建具有最小复杂性的对象,利用最小开销和学习曲线的功能,并继续使用你的代码和业务。