我正在改变我的类结构,将常见的数据库方法存储在一个类中。然后从子类扩展它。这应该减少代码,但也允许我在需要时覆盖父方法。
我已经完成了以下内容,对于此示例,与包含更多类的原始代码相比,我已经简化了基础知识。
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();