переменная возвращает ноль после расширения класса

У меня небольшая проблема. У меня есть класс с именем 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;
}
}

?>

Пожалуйста, помогите мне.
Спасибо

Извините за плохой английский.

1

Решение

Вы никогда не передаете обязательные переменные экземпляру дочернего класса, поэтому вы не получите никакого другого результата. Для начала, вызовите супер-конструктор с правильными аргументами:

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

Это должно немного облегчить ситуацию. Просто имейте в виду, что обычно модели не имеют соединений, у них есть только (мета) данные, а затем другой объект заботится о выполнении запросов. Посмотрите на шаблоны объектов хранилища и доступа к данным.

2

Другие решения

Родительские конструкторы не вызываются автоматически, когда вы создаете экземпляр дочернего класса, плюс в вашем случае нет способа предоставить родительскому конструктору его зависимости, поскольку они не передаются дочернему конструктору.

Ваши классы, вероятно, должны быть переопределены следующим образом:

<?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;
}
*/
}

?>
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector