У меня небольшая проблема. У меня есть класс с именем BaseModel. Есть подключение к pdo. Теперь у меня есть другой класс с именем TestModel, и я расширил класс BaseModel. Но когда я делаю var_dump () для переменной pdo, он возвращает null. Я знаю проблему, потому что конструктор, но как мне это сделать? Мне нужен этот конструктор в TestModel. Но без constcuter переменная возвращает ноль. Я уже пробовала ничуть parent::__construct()
но чем страница загружается бесконечно.
Вот мои занятия
BaseModel
<?php
namespace App\System\MVC\Models;
class BaseModel
{
protected $config;
protected $connection;
public function __construct($config, $connection)
{
$this->config = $config;
$this->connection = $connection;
}
public function __destruct()
{
$this->config = null;
$this->connection = null;
}
}
?>
TestModel
<?php
namespace App\System\MVC\Models;
use App\System\MVC\Models\BaseModel;
class TestModel extends BaseModel
{
protected $config;
protected $connection;
public function __construct()
{
var_dump($this->connection);
}
public function __destruct()
{
$this->config = null;
$this->connection = null;
}
}
?>
Пожалуйста, помогите мне.
Спасибо
Извините за плохой английский.
Вы никогда не передаете обязательные переменные экземпляру дочернего класса, поэтому вы не получите никакого другого результата. Для начала, вызовите супер-конструктор с правильными аргументами:
class TestModel extends BaseModel
{
// no need to redeclare the properties
public function __construct($config, $connection)
{
// pass the variables to __construct() in BaseModel
parent::__construct($config, $connection);
// some other initialization
}
// no need for destructor since the parent one is called
}
Теперь вы можете использовать свою модель следующим образом:
$obj = new TestModel($config, $connection);
var_dump($obj->getAllChildren()); // whatever operations that you want
Но вы должны пройти $config
а также $connection
каждый раз, когда вы пользуетесь моделью, и это, как вы наверняка, чувствуете боль. В таких случаях вы можете захотеть завод. Самый простой из них выглядел бы так:
class ModelFactory
{
const NS = 'App\System\MVC\Models';
private $config;
private $connection;
public function __construct($config, $connection)
{
$this->config = $config;
$this->connection = $connection;
}
public function create($class_name)
{
$reflection = new ReflectionClass(self::NS . '\\' . $class_name);
return $reflection->newInstance($this->config, $this->connection);
}
}
Это позволит вам указать параметры только один раз, а затем вы сможете легко создать столько экземпляров модели, сколько захотите:
$factory = new ModelFactory($config, $connection);
$obj1 = $factory->create('UserModel'); // creates new App\System\MVC\Models\UserModel
$obj2 = $factory->create('GroupModel'); // creates new App\System\MVC\Models\GroupModel
Это должно немного облегчить ситуацию. Просто имейте в виду, что обычно модели не имеют соединений, у них есть только (мета) данные, а затем другой объект заботится о выполнении запросов. Посмотрите на шаблоны объектов хранилища и доступа к данным.
Родительские конструкторы не вызываются автоматически, когда вы создаете экземпляр дочернего класса, плюс в вашем случае нет способа предоставить родительскому конструктору его зависимости, поскольку они не передаются дочернему конструктору.
Ваши классы, вероятно, должны быть переопределены следующим образом:
<?php
namespace App\System\MVC\Models;
class BaseModel
{
protected $config;
protected $connection;
public function __construct($config, $connection)
{
$this->config = $config;
$this->connection = $connection;
}
public function __destruct()
{
$this->config = null;
$this->connection = null;
}
}
?>
<?php
namespace App\System\MVC\Models;
use App\System\MVC\Models\BaseModel;
class TestModel extends BaseModel
{
/* You don't need to redefine them as they are inherited from the parent
protected $config;
protected $connection;
*/
public function __construct($config, $connection)
{
parent::__construct($config, $connection);
var_dump($this->connection);
}
/* This is also inherited from the parent
public function __destruct()
{
$this->config = null;
$this->connection = null;
}
*/
}
?>