Podane dotychczas odpowiedzi są niepoprawne. Możesz zrobić, co chcesz, zwracając wartość konstruktora, więc nie jest prawdą, że "Nic nie może być zrobione z wartością zwracaną konstruktora (poza użyciem utworzonego obiektu)." Wartość zwracana konstruktora nie jest obiektem "to". Konstruktor nie tworzy obiektów (jest to słowo kluczowe new
). Zwracana wartość konstruktora jest taka sama, jak każdej innej funkcji: cokolwiek wybierzesz, aby powrócić. Ponadto, jest również fałszywe, że obiekt musi już istnieć, aby wywołać jego konstruktora. To jest całkowicie poprawny:
$parent_constructor_return_value = parent::__construct();
Na przykład:
abstract class MyBase {
function __construct() {
return "Hello, world.";
}
}
class MyDerived extends MyBase {
function __construct() {
echo parent::__construct();
}
}
new MyDerived(); // prints "Hello, world."
ile jest to możliwe, nie mogę wyobrazić sobie scenariusz, w którym najlepiej byłoby praktyką.W końcu możesz zawsze wywołać metodę inną niż parent::__construct()
, aby uzyskać swoją wartość, a wszystko, co utracisz, jest nieprzejrzyste. Przypuszczam, że to może być wykorzystywane jako sposób obsługi błędów - istnieją dwa inne sposoby, aby osiągnąć to samo:
- generują wyjątki w konstruktorze dominującej i złapać je w konstruktorze pochodzi.
- Ustaw właściwości w konstruktorze nadrzędnym, wskazując, że wystąpił błąd, a następnie sprawdź stan tych właściwości w konstruktorze pochodnym.
Jeśli błąd w konstruktorze nadrzędnym nie jest wyjątkowy, mógł zdecydować, że konstruktor nadrzędny zwróci wartości błędu, zamiast zapisywać przejściowe informacje o błędzie jako właściwości obiektu. Oczywiście jedynym powodem, dla którego można nazwać metodę rodzica jest __construct
, jeśli klasa nadrzędna nie jest abstrakcyjna, ale może sama zostać utworzona - ale w tym kontekście zwrócone komunikaty o błędach nigdy nie będą widoczne. Zły wzór; zły. Konstruktory nie mają na celu zwracania wartości, co oznacza, że otwierasz puszkę architektoniczną robaków, wykorzystując ten mechanizm.
Nie sądzę, aby konstruktorzy zwracali obiekty: Wierzę, że PHP tworzy instancję nowej klasy danej klasy, a następnie wywołuje jej konstruktor, zanim użytkownik będzie mógł coś zrobić. –
Dzięki za poprawkę. Po ponownym przeczytaniu mojego posta szukałem komentarza, aby dokładnie powiedzieć, co napisałeś :) – Nate