在实例化子类时调用静态父方法

时间:2015-03-16 17:11:59

标签: php oop

我正在改变我的类结构,以便在一个类中存储常见的数据库方法。然后从子类扩展它。这应该减少代码,但也允许我在需要时覆盖父方法。

我已经完成了以下操作,对于这个例子,与包含更多类的原始代码相比,我已经简化为基础知识。

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();

我明白为什么我不能用我的代码做这件事,但是想要一些先实例化子进程然后访问父方法的方法。

我可以在child_object中编写all_records()方法来实例化自己并调用父all_records(),但是这种方法违背了扩展以减少我的子类中的代码和相同方法的目的。

我确信它非常简单或者一些新的高级oop功能可以做到。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

答案相对简单,您可以将所有属性转换为静态属性,然后使用static::代替self::

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

以这种方式解决问题被认为是一种不好的做法。祝你好运。

答案 1 :(得分: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();