2013-02-25 8 views
9

Jestem początkującym w CodeIgniter i OOP. Czytałem stronę z tutorialem CI here. Znalazłem coś, co spowodowało pytanie w moim umyśle.
Spójrz na ten kod:dlaczego nadal potrzebujemy konstruktora macierzystego, gdy klasa kontrolera rozszerza kontroler nadrzędny?

<?php 
class News extends CI_Controller { 
    public function __construct() 
    { 
     parent::__construct(); 
     $this->load->model('news_model'); 
    } 

myślę, że jeśli zrobiliśmy klasy, która rozciąga CI_Controller zakładamy, musi mieć wszystkie metody i właściwości w swojej klasie nadrzędnej (choć możemy je zastąpić). Dlaczego w kodzie jest parent::__construct();?

Odpowiedz

11

__construct() to metoda konstruktora klasy. Działa, jeśli zadeklarujesz z niego nową instancję obiektu. Jednak uruchamia tylko konstruktora, a nie rodzica. Na przykład:

<?php 

class A { 
    public function __construct() { 
    echo "run A's constructor\n"; 
    } 
} 

class B extends A { 
    public function __construct() { 
    echo "run B's constructor\n"; 
    } 
} 

// only B's constructor is invoked 
// show "run B's constructor\n" only 
$obj = new B(); 

?> 

W tym przypadku, jeśli trzeba uruchomić konstruktora Klasa A kiedy $ obj jest zadeklarowana, będziesz musiał użyć parent::__construct():

<?php 

class A { 
    public function __construct() { 
    echo "run A's constructor\n"; 
    } 
} 

class B extends A { 
    public function __construct() { 
    parent::__construct(); 
    echo "run B's constructor\n"; 
    } 
} 

// both constructors of A and B are invoked 
// 1. show "run A's constructor\n" 
// 2. show "run B's constructor\n" 
$obj = new B(); 

?> 

W przypadku CodeIgniter jest, że linia biegnie konstruktor w CI_Controller. Ta metoda konstruktora powinna w jakiś sposób pomóc twoim kodom kontrolerów. A ty po prostu chcesz, żeby robił wszystko dla ciebie.

+0

Twoja deklaracja b brakuje rodzica w rozciąga – drk

+0

'klasa B rozszerza A' jest poprawna –

+1

Więc musimy zrobić to samo dla innych metod w nowych klas, które mają podobną metodę w klasa nadrzędna i chcesz korzystać z funkcji rodzica? czy to tylko dla klas '__construct()'? –

2

Rozszerzenie stosowane do wszystkich zajęć. __construct() używane dla tej klasy, z której korzystasz.

Klasy, które mają metodę konstruktora, wywołują tę metodę na każdym nowo tworzonym obiekcie, więc jest odpowiednia do każdej inicjalizacji, jakiej obiekt może potrzebować, zanim zostanie użyty.

1

wierzę potrzeba wywoływania konstruktora rodzica/metoda jest zapach kod , znany jako Wezwania Super. Oprócz wrażliwości na błędy (zapominając o tym połączeniu, możesz uzyskać nieoczekiwane wyniki), jest to procedura proceduralna zamiast OOP. W końcu kolejność instrukcji może również prowadzić do nieoczekiwanych wyników.

Czytaj więcej tutaj: https://martinfowler.com/bliki/CallSuper.html

Powiązane problemy