代码之家  ›  专栏  ›  技术社区  ›  Jaquarh

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

  •  0
  • Jaquarh  · 技术社区  · 6 年前

    我正在尝试一种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;
        }
    }
    

    然后,我的示例概要文件控制器如下所示(具有使用主数据库运行查询的方法):

    class ProfileModel extends DriverModel {
        public function doSomeQ() {
            $this->q('SELECT fname FROM users WHERE id = ?', [(int)1]);
        }
    }
    

    但是,当我执行这行代码时:

    print_r(ProfileModel::getInstance()->doSomeQ());
    

    我留下了这个错误:(这是有道理的。)

    未捕获错误:无法实例化抽象类。

    然后从类中删除抽象属性( class DriverModel )但现在,我接收的实例是来自父类的实例,这意味着如果我执行 print_r() getInstance() 方法 ProfileModel ,没有 doSomeQ() 方法

    对实现这种方法的任何帮助都会很有帮助。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Yanis-git    6 年前

    你必须使用 get_called_class() 方法而不是 new self(); http://php.net/manual/en/function.get-called-class.php

    随附您可以找到显示您预期行为的样本

    class Main {
        public static function getInstance() {
            $class = get_called_class();
            return new $class();
        }
    }
    class Foo extends Main{
    
    }
    
    var_dump(Foo::getInstance()); // Output Foo object