两者之间的区别 类 __construct()

Difference between two classes __construct()

我无法理解什么是 __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');

在这个人为的例子中,第二个很好。

如果 name 是 class 的一个字段而不只是一个回显的方法怎么办?在您明确设置之前它的价值是多少?

要确保在使用对象之前初始化字段并完成设置,请使用构造函数。如果不需要初始化,则不一定需要编写显式构造函数。

你的两个例子可能看起来确实是等同的,但只是从一个(你现在的)角度来看。


class Person { // First case : using the constructor

    public function __construct($person) {
        echo $person;
    } 
}

// ----------------------------------------------------------------
$person = new Person('Name');

在这个例子中,你非常清楚class Person(或其子class之一)的每个对象必须一创建就给一个名字。在任何时候都不会出现没有名字的 Person。这是您选择强加给自己(如果您打算创建 class Person 的对象)或其他人的设计约束,如果您以某种方式共享您的代码。如果有人试图违反这一约束,PHP 将挂起并显示一条明确的 error/warning 消息。 (演示: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');

这是一个不同的野兽:您可以创建 class Person 的对象,并且可以显示名称。您还可以创建一个 Person 并且根本不显示名称。实际上,如果您出于某种原因没有关注 class 代码,您甚至可能不知道自己可以做到(给每个 class 一个不同的文件是常见的做法)。


在这两个例子中,我在class声明和用法之间画了一条注释线,因为这是两个不同的角度(认为他们甚至可以是两个无法相互交流的不同人)。作为 class 的作者,您可以将约束精确地转换为您可以生成的最明确的代码。作为 class 用户,您不想浪费时间了解您正在使用的 class 的复杂性:您希望创建复杂度最低的对象,以最少的开销和学习利用功能曲线,继续您的代码和业务。