Php 如何在不使用DI的情况下实例化父类
我正在尝试一个MVC概念,其中数据库的主模型与其他模型相分离。我希望有一个主数据库类型的模型,用于连接和查询。然后,构建其他模型来支持控制器。也就是说,产品模型可以从主数据库模型扩展到查询,而不是使用依赖项注入 对于主数据库模型,我当前的想法和尝试如下所示:Php 如何在不使用DI的情况下实例化父类,php,singleton,Php,Singleton,我正在尝试一个MVC概念,其中数据库的主模型与其他模型相分离。我希望有一个主数据库类型的模型,用于连接和查询。然后,构建其他模型来支持控制器。也就是说,产品模型可以从主数据库模型扩展到查询,而不是使用依赖项注入 对于主数据库模型,我当前的想法和尝试如下所示: namespace Portfolio\Application; abstract class DriverModel { private static $driver; private $entity
namespace Portfolio\Application;
abstract class DriverModel {
private static $driver;
private $entity;
private function __construct() {
// Connection to the PDO will be done in here
}
private function __clone() {}
public static function getInstance() {
if(self::$driver)
return self::$driver;
self::$driver = new self();
return self::$driver;
}
protected function q($sql, $values = []) {
$stmt = $this->entity->Prepare($sql);
$stmt->execute($values);
return $stmt;
}
}
然后,我的示例概要文件控制器将如下所示(具有使用主数据库运行查询的方法):
但是,当我执行这行代码时:
print_r(ProfileModel::getInstance()->doSomeQ());
我留下了这个错误:(这是有道理的。)
未捕获错误:无法实例化抽象类
然后我从类中删除抽象属性(class DriverModel
),但是现在,我接收的实例是父类的实例,这意味着如果我在getInstance()
方法上对ProfileModel
执行print\r()
,则没有doSomeQ()
方法
实现此方法的任何帮助都会很有帮助。您必须使用
get_called_class()
方法,而不是new self()代码>
随函附上您可以找到显示您预期行为的样品
class Main {
public static function getInstance() {
$class = get_called_class();
return new $class();
}
}
class Foo extends Main{
}
var_dump(Foo::getInstance()); // Output Foo object
您必须使用get_called_class()
方法,而不是new self()代码>
随函附上您可以找到显示您预期行为的样品
class Main {
public static function getInstance() {
$class = get_called_class();
return new $class();
}
}
class Foo extends Main{
}
var_dump(Foo::getInstance()); // Output Foo object
停止使用单例,停止滥用继承,停止将活动记录实例称为“模型”。一个学习使用依赖注入的人。我不把编程当作工作,我在军队里,伙计。这是一种爱好,所以不要对我摆出态度,伊娃不要评论或解释怎么做@tereško这不是你要求别人解释更多的方式。停止使用单例,停止滥用继承,停止将活动记录实例称为“模型”。一个学习使用依赖注入的人。我不把编程当作工作,我在军队里,伙计。这是一种爱好,所以不要对我摆出态度,伊娃不要评论或解释怎么做@tereško这不是你要求别人解释更多的方式。伙计,我成功了-现在我可以从一个主模型得到多个扩展模型树。我成功了-现在我可以从一个主模型得到多个扩展模型树。