2015-08-13 3 views
1

У меня есть небольшая проблема. У меня есть класс под названием BaseModel. Существует соединение pdo. Теперь у меня есть другой класс с именем TestModel, и я расширил класс BaseModel. Но когда я делаю var_dump() в переменной pdo, он возвращает null. Я знаю проблему из-за конструктора, но как это сделать? Мне нужен этот конструктор в TestModel. Но whitout constcuter переменная возвращает null. Я уже пробовал whit parent::__construct(), но страница загружается бесконечно.переменная возвращает null после расширения класса

Вот мои классы

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; 
    } 
} 

?> 

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

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

+0

Родительские контроллеры по умолчанию не вызываются ... вам нужно передать свои параметры в конструктор дочернего класса и вручную вызвать конструкцию parent :: __ ($ config, $ connection) ' – Orangepill

+0

Я уже пробовал это, но то страница загружается бесконечно – Synergy

ответ

0

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

Ваших классы должны, вероятно, быть переписаны так:

<?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

Когда я использую parent :: __ construct(), страница загружается бесконечно – Synergy

2

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

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 каждый раз, когда вы используете модель, и это боль, о чем вы можете точно сказать. В подобных случаях вы можете захотеть получить какой-то factory. Самый простой из них можно сделать будет выглядеть следующим образом:

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 

Это должно сделать вещи немного легче. Просто имейте в виду, что обычно модели не имеют соединений, у них есть только (мета) данные, а затем другой объект заботится о выполнении запросов. Взгляните на repository and data access object patterns.

+0

Есть ли способ не передавать конфигурацию и соединение для каждой модели? Я хочу использовать переменные из класса basemodel – Synergy

+0

У вас могут быть [статические свойства] (https: // stackoverflow.com/questions/14930046/php-static-property) в классе 'BaseModel', который вы задали в начале вашего скрипта:' BaseModel :: $ connection = ???; '. Затем ссылайтесь на них с помощью 'self :: $ connection-> query (...);' внутри моделей. Тем не менее я бы по-прежнему рекомендовал шаблоны DAO или репозитория. – Anonymous

Смежные вопросы