2015-03-16 4 views
0

Я меняю структуру своего класса, чтобы хранить общие методы базы данных в одном классе. Затем расширив его из дочернего класса. Это должно сократить код, но также позволяет мне переписывать родительские методы, когда мне это нужно.Вызов статического родительского метода при создании экземпляра дочернего класса

Я сделал следующее, для этого примера я упростил основы по сравнению с исходным кодом, который содержит больше классов.

class parent_object{ 
    private $table_name; 

    public function all_records(){ 
     $sql = "SELECT * FROM ".$this->table_name; 
     return $this->execute_sql($sql); 
    } 
} 

class child_object extends parent_object{ 
    protected static $table_name="tbl_name"; 

    public function __construct(){ 
     parent::__construct(self::$table_name); 
    } 
} 

Я хочу вызвать all_records() статически, чтобы каждый раз создавать новый объект.

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

$child = new child_object(); 
$all = $child->all_records(); 

То, что я действительно хочу, чтобы иметь возможность вызвать родительский метод статический:

$all = child_object::all_records(); 

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

Я могу написать метод whole_records() в child_object, чтобы создать экземпляр себя и вызвать родительский all_records(), но этот сорт побеждает цель расширения, чтобы сократить код и те же методы в моем дочернем классе.

Я уверен, что его довольно простая или новая функция высокого уровня oop может это сделать.

Благодарим за помощь.

ответ

2

Ответ относительно прост, вы можете превратить все свои свойства в статические свойства, а затем использовать static:: вместо self::.

http://php.net/manual/en/language.oop5.late-static-bindings.php

Решая проблему таким образом, считается плохой практикой, хотя. Удачи.

+0

Привет Эверт спасибо за ответ. Если это так, я посмотрю на другой способ сделать это, так как я пытаюсь улучшить код, но это не делает его технически хуже. – Sonix

+0

Причиной является то, что вы в основном отбрасываете (часть) функции, предлагаемые OOP, и вы эффективно внедряете глобальные переменные. Если вы хотите улучшить этот материал, исследуйте «инъекцию зависимостей». – Evert

0

Вы могли бы сделать что-то вроде этого:

class child_object extends parent_object 
{ 
    protected static $table_name="tbl_name"; 

    public static function factory() 
    { 
     return new child_object(); 
    } 

    public function __construct() 
    { 
     parent::__construct(self::$table_name); 
    } 
} 

Затем, когда вы используете его, вы просто сделать:

$all = child_object::factory()->all_records(); 
Смежные вопросы