2010-02-23 12 views

Odpowiedz

94

Nie, konstruktor klasy nadrzędnej nie jest wywoływany, jeśli klasa potomna definiuje konstruktor.

Od konstruktorze klasy dziecka, trzeba wywołać konstruktor klasy rodzica:

parent::__construct(); 

przekazaniem go parametrów, w razie potrzeby.

Zasadniczo robisz to na początku konstruktora klasy potomnej, przed jakimkolwiek konkretnym kodem; co oznacza, że ​​w danym przypadku, trzeba:

class Child extends Base { 
    function __construct() { 
     parent::__construct(); 
     echo 'Child __construct<br/>'; 
    } 
} 


I, dla odniesienia, można spojrzeć na tej stronie podręcznika PHP: Constructors and Destructors - stwierdza (cytowanie):

Uwaga: konstruktorzy rodzic nie nazywa się niejawnie jeśli klasa dziecko określa konstruktor.
Aby wykonać konstruktor nadrzędny, wymagane jest wywołanie parent::__construct() wewnątrz konstruktora podrzędnego .

+1

Nie jawnie o tym informują, ale sugerują, że jeśli klasa podrzędna nie ma konstruktora, to zostanie wywołany konstruktor macierzysty. Czy to prawda? – andrew

+9

Tak: jeśli klasa podrzędna nie definiuje konstruktora, to element macierzysty nie jest nadpisywany, a zatem nazywany jest ;;; zacytowanie instrukcji: Konstruktory macierzyste nie są wywoływane niejawnie **, jeśli klasa podrzędna definiuje konstruktora **. –

+0

@PascalMARTIN Dziękuję, rozejrzałem się, próbując to sprawdzić. Trochę szukał. –

5

Cóż, ja po prostu znaleźć to w docs:

Uwaga: konstruktorzy rodzic nie są nazwie niejawnie jeśli klasa dziecko określa konstruktor. Aby uruchomić konstruktor nadrzędny, wymagane jest wywołanie parent :: __ construct() wewnątrz konstruktora podrzędnego .

+1

Głównym powodem, dla którego piszę konstruktor w klasie abstrakcyjnej, jest wymuszenie, że każda klasa dziedzicząca z tej klasy wykonuje określony kod. To prawdziwy wstyd PHP sprawia, że ​​wykonanie konstruktora jest opcjonalne. –

+2

@RyanWilliams Istnieją przypadki, w których trzeba wywołać konstruktora macierzystego przed wykonaniem dodatkowej inicjalizacji w klasie i zdarzają się przypadki, gdy rodzic jest wywoływany po dodatkowych inicjalizacjach. Tak więc PHP pozwala ci również wspierać więcej przypadków użycia. – Nux

1

Jeśli potrzebujesz takie samo zachowanie jak C#, który jest konstruktor rodzic dostaje zawsze wykonywane przed konstruktora dzieci, można tworzyć fałszywą klasę konstruktora dla klas potomnych i zadeklarować je jako abstrakcyjne funkcję w swojej abstrakcyjnej klasy nadrzędnej .

E.g.

abstract class Test{ 
    abstract public function __childconstruct(); 
    public function __construct(){ 
    echo "SOME CODE".PHP_EOL; 
    $this->__childconstruct(); 
    } 
} 

class TestExtended extends Test{ 
    public function __childconstruct(){ 
    echo "SOME OTHER CODE FROM EXTENDED CLASS".PHP_EOL; 
    } 
} 

$a = new TestExtended(); 

/* SOME CODE 
    SOME OTHER CODE FROM EXTENDED CLASS */ 
Powiązane problemy