繁体   English   中英

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

[英]Calling a static parent method while instantiating child class

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

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

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函数可以做到。

谢谢你的帮助。

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

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

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

您可以执行以下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM