Разница между двумя классами __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');

0

Решение

Ваши два примера действительно могут показаться эквивалентными, но только с одной (вашей, сейчас) точки зрения.


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 и никогда не отображать имя вообще. На самом деле вы можете даже не знать, что можете, если по какой-то причине не обращаете внимания на код класса (это обычная практика — давать каждому классу отдельный файл).


В обоих примерах я провел строку комментария между объявлением класса и использованием, потому что это две разные точки зрения (думаю, что они могут даже быть двумя разными людьми, которые не могут общаться друг с другом). Как автор класса, вы переводите свои ограничения именно в самый явный код, который вы можете создать. Как пользователь класса, вы не хотите терять время, разбираясь в тонкостях класса, который вы используете: вы хотите создавать объекты с минимальной сложностью, использовать функциональность с минимальными затратами и обучение, и продолжать свой код и бизнес.

2

Другие решения

В этом надуманном примере со вторым все в порядке.

Что, если name Было ли поле класса, а не просто метод, который эхо? Какова будет его ценность, прежде чем вы ее явно установите?

Чтобы убедиться, что поля инициализированы и настройка выполнена перед использованием объекта, используйте конструктор. Если вам не нужна инициализация, вам не обязательно писать явный конструктор.

4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector