Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.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_Pdo_Ide_Phpdoc - Fatal编程技术网

Php 用于类型提示和使用动态输出类自动完成的动态文档块

Php 用于类型提示和使用动态输出类自动完成的动态文档块,php,pdo,ide,phpdoc,Php,Pdo,Ide,Phpdoc,我有一个中型的MVC应用程序。应用程序的用例是这样的,我需要对用于与数据库交互的SQL进行更多的控制(除其他外,数据是高度规范化的,我们使用了很多连接)。所以,我已经发展了自己的模型设计,而不是使用教条或雄辩或任何东西。我最近发现我的设计叫做模式。无论如何,它看起来是这样的(为了清晰起见简化了一点): 我们有一个抽象类,我所有的表网关都扩展了它。它知道如何与PDO对话并执行SQL操作,但不知道如何处理任何特定的表: abstract class TableGateway { prote

我有一个中型的MVC应用程序。应用程序的用例是这样的,我需要对用于与数据库交互的SQL进行更多的控制(除其他外,数据是高度规范化的,我们使用了很多连接)。所以,我已经发展了自己的模型设计,而不是使用教条或雄辩或任何东西。我最近发现我的设计叫做模式。无论如何,它看起来是这样的(为了清晰起见简化了一点):

我们有一个抽象类,我所有的表网关都扩展了它。它知道如何与PDO对话并执行SQL操作,但不知道如何处理任何特定的表:

abstract class TableGateway {

    protected $db = null;

    public $tableName = '';

    public $outputClass = null;

    function __contruct(\PDO $pdo) {
        $this->db = $pdo;
    }

    /**
     * $return \StdClass[]
     */
    function all() {
        $result = $this->query(sprintf('SELECT * FROM %s',$this->tableName));
        return $result;
    }

    /**
     * @param $query
     * @param array $params
     * @return \StdClass[]
     */
    public function query($query, $params = array()) {
        $stmt = $this->db->prepare($query);
        if($this->outputClass) {
            $stmt->setFetchMode(PDO::FETCH_CLASS, $this->outputClass);
        } else {
            $stmt->setFetchMode(PDO::FETCH_OBJ);
        }
        $success = $stmt->execute($params);
        return $stmt->fetchAll();
    }
}
然后每个表都有一个网关类,它扩展父类并应用表特定的内容。这里将有许多函数调用
$this->query()
,将它们对表结构的了解用于构建有用的查询,但也有一些基本函数,如
PostsGateway::all()
,它们对于每个表都是相同的,因此它们位于父类中

class PostsGateway extends TableGateway {
    public $tableName = 'posts';

    public $outputClass = 'Post';
}
查询的每个结果都加载到一个对象中。默认情况下,它们只是StdClass对象,但您可以指定一个备用的
$this->outputClass
将它们输出到另一个类中,如下所示:

class Post {
    /** @var int $id */
    /** @var string $content */
}
所有这些对我来说都很有效。然而,我的IDE跟不上。您和我都知道
PostsGateway::all()
将返回一个数组
Post
对象,但IDE认为它只是一个常规数组。这意味着我不会自动完成
Post
对象属性的提示

有人知道解决这个问题的聪明方法吗?这样IDE就会知道这个变化了

我在考虑一个脚本来自动为
PostsGateway
生成文档块,但我对一般的代码生成有点了解,尤其是我将定期修改的类中的代码生成。脚本必须根据对
TableGateway
的更改定期更新文档块,并且不要弄乱我添加到
PostsGateway
的任何内容

有没有其他很酷的方法来解决这个问题?或者你能推荐一些好的库来生成这些代码块吗