Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在实例化子类时调用静态父方法_Php_Oop - Fatal编程技术网

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

Php 在实例化子类时调用静态父方法,php,oop,Php,Oop,我正在改变我的类结构,将常用的数据库方法存储在一个类中。然后从一个子类扩展它。这将减少代码,但也允许我在需要时覆盖父方法 我已经完成了以下工作,对于这个示例,与包含更多类的原始代码相比,我已经简化为基本代码 class parent_object{ private $table_name; public function all_records(){ $sql = "SELECT * FROM ".$this->table_name; re

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

我已经完成了以下工作,对于这个示例,与包含更多类的原始代码相比,我已经简化为基本代码

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_对象中编写all_records()方法来实例化自身并调用父对象all_records(),但这种排序无法实现扩展以减少子类中的代码和相同方法的目的

我相信它相当简单,或者一些新的高级oop函数可以做到这一点


谢谢您的帮助。

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


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

你可以这样做:

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

嗨,埃弗特,谢谢你的回复。如果是这样的话,我会考虑另一种方法,因为我正在努力改进代码,而不是让它在技术上变得更糟。原因是你基本上放弃了OOP提供的功能(部分),并且有效地引入了全局。如果你想在这方面做得更好,研究“依赖注入”。