Call to a member function table() on a non-object

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
ondraondra81
Člen | 82
+
0
-

Ahoj mám třídu Repository jako BaseClass

namespace App\Model;

abstract class Repository extends \Nette\Object
{

    /** @var \Nette\Database\Context */
    protected $database;

    public function __construct(\Nette\Database\Context $db)
    {
        $this->database = $db;
    }

 }

a pak mám třidu PriceTableRepository která mě vrací chybu Call to a member function table() on a non-object

namespace App\Model;


class PriceTableRepository extends Repository
{
    const PRICE_TABLE = 'pricetable';

    /** @var \Nette\Database\Table\Selection  */
    private $table;

    function __construct()
    {
        $this->table = $this->database->table(self::PRICE_TABLE);
    }
}

Když to udělám takto, tak to funguje, ale nějak se mě to řešení nezdá

namespace App\Model;


class PriceTableRepository extends Repository
{
    const PRICE_TABLE = 'pricetable';

    /** @var \Nette\Database\Table\Selection  */
    private $table;

    function __construct( \Nette\Database\Context $database)
    {
        parent::__construct($database);
        $this->table = $this->database->table(self::PRICE_TABLE));
    }
}
David Kudera
Člen | 455
+
+2
-

Odpověděl jsi si sám, tohle je řešením ;-)

Kde jinde by totiž parent (Repository) vzal jen tak tu databázi v konstruktoru, když její potomek (PriceTableRepository) ten konstruktor přepíše?

Šaman
Člen | 2666
+
+1
-

Tohle je naprostý základ OOP. V konstruktoru vždycky volat konstruktor předka. Výjimkou je jen, pokud předek žádný konstruktor nemá, např. když dědíš od Nette\Object.

V Nette tohle pravidlo platí taktéž pro metodu startup().