2014-11-02 14 views
6

jestem dopiero zaczyna się z podstawowymi pojęciami OO w PHP,

foo.php

class Foo extends Command { 


    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function fire() 
    { 
     $bar = new Bar(); 
    } 

} 

Bar. php

class Bar extends Foo { 

    public function __construct() 
    { 
     parent::__construct(); 
     $this->info('Bar'); 

    } 
} 

Kiedy biegnę Foo::fire() daje: Call to undefined method Foo::__construct(). Ale Foo wyraźnie ma konstruktora, co robię źle?

Inną rzeczą, podejrzewam, że może to być problem Laravel zamiast PHP. To jest utworzone przeze mnie polecenie artisan.

EDIT:

nazywając także $this->info('Bar') nigdzie w Bar będzie również dać Call to a member function writeln() on a non-object. Dlaczego nie mogę wywołać metody rodzica z klasy podrzędnej?

+0

To było dla mnie lepsze podejście: https://stackoverflow.com/a/41122816/470749 Sprawdzam również https://stackoverflow.com/a/38064494/470749, aby zobaczyć, czy to jest Najlepszym sposobem. – Ryan

Odpowiedz

11

Natknęłam się również na tę kwestię i poczułam, że opinie Marcina są zimne i niepomocne, szczególnie w jego komentarzach. Dlatego z przyjemnością odpowiem tą odpowiedzią Tobie i każdemu, kto natknie się na ten problem.

W oryginalnej klasy Bar:

class Bar extends Foo { 

    public function __construct() 
    { 
     parent::__construct(); 
     $this->info('Bar'); 
    } 
} 

ja po prostu potrzebne, aby ustawić właściwość 'wyjście' jak następuje:

class Bar extends Foo { 

    public function __construct() 
    { 
     parent::__construct(); 
     $this->output = new Symfony\Component\Console\Output\ConsoleOutput(); 
     $this->info('Bar'); 
    } 
} 

Nadzieja jest to pomocne!

+1

Znalazłem 'use Symfony \ Component \ Console \ Output \ ConsoleOutput;' w górnej części pliku, a następnie '$ this-> output = new ConsoleOutput;' pracował dla mnie – Sevenearths

+1

Byłoby wspaniale, gdyby Laravel faktycznie sprawdził, czy istnieje nie był obiektem '$ output' i podał odpowiedni komunikat o błędzie, zamiast po prostu pozwolić PHP wygenerować błąd. Zwłaszcza, że ​​jest to nowe zachowanie. – andrewtweber

Powiązane problemy