Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.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 如何在不使用DI的情况下实例化父类_Php_Singleton - Fatal编程技术网

Php 如何在不使用DI的情况下实例化父类

Php 如何在不使用DI的情况下实例化父类,php,singleton,Php,Singleton,我正在尝试一个MVC概念,其中数据库的主模型与其他模型相分离。我希望有一个主数据库类型的模型,用于连接和查询。然后,构建其他模型来支持控制器。也就是说,产品模型可以从主数据库模型扩展到查询,而不是使用依赖项注入 对于主数据库模型,我当前的想法和尝试如下所示: namespace Portfolio\Application; abstract class DriverModel { private static $driver; private $entity

我正在尝试一个MVC概念,其中数据库的主模型与其他模型相分离。我希望有一个主数据库类型的模型,用于连接和查询。然后,构建其他模型来支持控制器。也就是说,产品模型可以从主数据库模型扩展到查询,而不是使用依赖项注入

对于主数据库模型,我当前的想法和尝试如下所示:

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这不是你要求别人解释更多的方式。伙计,我成功了-现在我可以从一个主模型得到多个扩展模型树。我成功了-现在我可以从一个主模型得到多个扩展模型树。