2

我正在研究 Magento 模板,但这个问题适用于任何模板加载系统。

由于这些模板是由模板引擎加载的,IDE(在本例中为 Aptana)无法知道 $this 是什么对象类型。

潜在地,它可能不止一个对象,因为单个模板可以被多个对象加载,但忽略这一点,正确的 phpdoc 语法是为 $this 对象指定特定类?

4

3 回答 3

3

你可以这样定义它:

/* @var $this type */

其中 type 是类名

于 2010-02-24T22:45:37.340 回答
0

我发现用@var 为$this 定义一个类型是行不通的——大概是因为$this 是特殊的并且被Aptana 视为这样。我对我认为的海报有类似的需求 - 它位于模板文件中(在我的情况下,只是位于数据类中的函数并包含在其中),我希望为 $this 设置一个类型。正如@ashnazg 所说,不需要在类定义中为 $this 设置类型,因为 $this 的类型始终是类的类型(直到继承)。

但是,有一个模板文件的解决方法。在模板文件的顶部简单地放置类似

/**
 * @var My_Data_Model_Type
 */
$dataModel = &$this;

然后只需使用$dataModel(或您选择的任何名称 - 也许更短的名称)而不是$this在模板中

于 2013-12-10T21:15:59.803 回答
0

需要明确的是,使用$this应该只指示当前类的对象,对吗?

PhpDocumentor 目前 (v1.4.3) 不将$this识别为应等同于类本身的数据类型的特定关键字。

只有 PHP 已知的数据类型和已经被 PhpDocumentor 解析的类才是与 @return 标记一起使用的正确数据类型值。有一个功能请求在 PhpDocumtentor 中有一些可用的选项,以帮助记录始终“返回 $this”的流畅方法。[1]

在@var 标记的情况下,我看不出一个类变量包含它自己的类实例是多么可行。因此,我无法理解“@var $this”应该说的内容。

但是,如果您使用$this的意图不是用于“返回 $this”的流畅方法,而只是作为 PhpDocumentor 和/或您的 IDE 的一些快捷方式,以神奇地猜测您使用$this可能意味着什么数据类型,我'我不得不猜测没有办法做到这一点。我可以提出的最接近的建议是使用父类的名称,该父类是该特定 var/return 可能在运行时存在的所有各种子类的公共父类,然后使用标记的描述部分进行内联{@link} 标签列出了可能的子类。

示例:我有一个包含 Child1、Child2 和 Child3 子级的 Parent 抽象类,每个子级都可能出现在我的运行时 Foo 类中。

因此, Foo::_var 在运行时可以是任何这些子类类型,但我将如何记录呢?

/**
 * @var Parent 这可以是 {@link Parent}、{@link Child1}、{@link Child2} 或 {@link Child3} 的任何孩子...
 */
受保护的$_var;

回到“return $this”问题,我会以类似的方式记录事情:

/**
 * 一个流利的方法(即它返回这个类的实例对象)
 * @return Parent 这可以是 {@link Parent}、{@link Child1}、{@link Child2} 或 {@link Child3} 的任何孩子...
 */
公共函数 foo() {
   返回$这个;
}

以这种方式记录至少允许您的课程文档具有指向特定课程的链接。它没有做的是突出流利的'ness。但是,如果您的 IDE 能够识别类名,那么它也许能够对其他类进行必要的逻辑链接。如果您将鼠标悬停在标签描述中的类名上,我认为 Eclipse 至少可以通过弹出帮助来做到这一点。我认为 Eclipse 可以使用它来使各种子类的方法在代码完成中可用。它会知道用于代码完成的 Parent 方法,因为我明确列出的数据类型是 Parent,但这是 IDE 所能做到的。

[1] -- http://pear.php.net/bugs/bug.php?id=16223

于 2010-02-26T00:21:15.443 回答