两个类之间的区别__construct()

时间:2017-09-13 17:32:10

标签: php methods between

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

2 个答案:

答案 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,并且根本不显示名称。实际上,如果您因某些原因没有着眼于类代码,您可能甚至不知道自己可以这样做(通常的做法是给每个班级一个不同的文件)。

在这两个例子中,我在类声明和用法之间画了一条注释,因为这是两个不同的观点(认为它们甚至可以是两个不能相互沟通的人)。作为类作者,您可以将约束精确地转换为可以生成的最明确的代码。作为类用户,您不想浪费时间来理解您正在使用的类的复杂性:您希望创建具有最小复杂性的对象,利用最小开销和学习曲线的功能,并继续使用你的代码和业务。