注释(在 PHPDoc 中)通过 __callStatic 实现的函数的正确方法是什么?更重要的是:有没有办法让 NetBeans 和 PHPStorm 理解这些是静态方法?
如果您想了解更大的图景,这就是我如何回答这个问题的。
问题:在我当前的项目中,我们有大量的类实际上应该是单例(数据库代理等)。不用说,我们至少有几百行 require_once 和 $foo = new FooProxy(); 行。
解决方案:我创建了一个 Loader 类来解决这个问题,使用 __callStatic 魔术方法所以我们可以只说 $foo = 加载器::FooProxy();。它非常适合我们的目的,但是:
问题:这种方式在团队中使用的任何一个 IDE 中显然都没有类型提示。
解决方案:每个模块定义一个 Loader 的子类,添加仅路由到 __callStatic 的方法。
问题:为了自动完成而添加实际解释的代码是 Not Acceptable (这可能会有争议,但让我们暂时接受它)。
解决方案:我们不添加任何实际方法,只在 PHPDoc 中声明方法,如下所示:
<?php
/**
* @method FooProxy FooProxy()
*/
class BarLoader extends Loader {}
?>
问题:FooProxy 不是静态方法。以下任何一项都不会使其成为静态的:
<?php
/**
* @static
* @method FooProxy FooProxy()
*/
///////////////
/**
* @static @method A A()
* @method static A A()
* @method A static A()
* @method A A() static
*/
使类抽象没有区别。大约一个小时的谷歌没有找到任何解决方案。主要目标是让 IDE 了解这些功能;拥有正确的 PHPDoc 并不是必需的。
最佳答案
好吧,PhpStorm 3.0 会接受
@method static type name() description
关于PHPDoc 和 __callStatic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5982312/
是否可以使用PhpDoc声明protected或private类@property?/***ClassNode*@packageapp\models*@propertystring$name*/classNode{} 最佳答案 我不这么认为。对于@property,public是隐含的,即使它是只读或只写的。此类标记的意义在于记录无法推断的接口(interface)。私有(private)/protected变量实际上是类的内部变量,因此它只与子类相关,应该像他们已经知道的那样编写。不过,您仍然可以在声明之前立即留下一个普通的文
当使用PHPs__call使一个类扩展2个类时,您可以使用@method让IDE知道这些方法存在。但是当要求IDE跳转到方法的声明时,您最终会到达@method-row,避免卡在那里的一种方法是在上方添加@see行或以下。但是添加该行和一个分隔行,使PHPDoc的长度/高度增加了3倍。是否可以在同一行添加@see?查看了一些按原样使用它的示例,以及一些在{}中使用它的其他示例。在我的IDE(PhpStorm)中对其进行了测试,跳转至@see的声明仅在它位于单独的行时才有效。PHPDoc是否允许我们在与@method相同的行上使用@see?如果是这样,正确的语法是什么?例子:b=newb
想象一下,我们有一个带有可选可空参数(PHP7.0)的方法,如本例所示:/***@paramType1$foo*@paramType2$bar*/functionmyFunction(Type1$foo,Type2$bar=null){}不幸的是,从PHPDoc文档中并不清楚,将第二个参数标记为可选和可为空的正确方法是什么。通常我使用“Type2|null”表示法:/***@paramType1$foo*@paramType2|null$bar*/functionmyFunction(Type1$foo,Type2$bar=null){}实际上这是我更喜欢的方式,因为它明确描述了所有可
我正在尽一切努力让phpdocumentor允许我使用DocBook教程格式来补充它创建的文档:我正在使用Eclipse我已经在OSX机器上通过PEAR安装了phpDocumentor我可以从我的php类运行并自动生成代码它不会格式化教程-我找不到解决方案我已经尝试在整个文件结构中移动.pkg示例文件,在子文件夹中使用与代码中引用的包相似的名称......我真的很茫然-如果有人可以解释WHERE他们将.pkg和其他DocBook文件与他们正在记录的代码相关联,以及他们如何触发phpdoc对其进行格式化我将不胜感激,我目前正在使用它:phpdoc-oHTML:Smarty:HandS-d
我有下一个php代码我想让我的ide自动完成$a->正确,并告诉我$a中只有一个可用的方法foo。没有像$a=newA();这样的字符串。$a在另一个地方实例化并由自动加载器处理。 最佳答案 下面的语法在eclipse中运行良好/*@var$aA*/$a->请注意,我切换了参数顺序。 关于php文件中的phpdoc@var,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/77227
如何使用PHPDoc标记常量?我应该使用什么@-tag?我想到了@var,但那不合适。 最佳答案 简短的回答是没有。而且也不需要一个。文档生成器足够聪明,能够看到常量声明。因此,只需将摘要放在那里,不要使用任何@-tags。这应该是您需要做的所有事情......classfoo{/***Thisconstantdoessomethingthatyouneed.*/constFOO='bar';} 关于PHPDoc-哪个@[item]用于我的源代码中的"const"语句?,我们在Stack
在JSDoc中,我可以用@constructor标记我的构造函数。现在我试图在PHPDoc规范中找到如何对PHP构造函数执行相同的操作,但他们从未提及任何类似的内容。在PHP中标记我的构造函数的正确方法是什么。这个:/***@constructor*/publicfunction__construct(){}似乎无效。 最佳答案 PHP文档生成器会将__construct()方法识别为构造函数。不需要特殊标记。 关于PHPDoc-如何在PHP中标记构造函数,我们在StackOverflo
有没有办法在phpDoc中将@method签名中的参数标记为可选?像这样:/**@methodboolalloc()alloc(int$filesize[,string&$result])Allocatesspaceforafiletobeuploaded*/ 最佳答案 通常,phpDocumentor通过查看方法签名中参数的默认值来识别可选参数。因此,使用您的示例:@methodboolalloc()alloc(int$filesize,string&$result='')Allocatesspacefor...
我来自严格类型化的编程语言,它有一个名为“ANY”的类型。因为PHP是松散耦合的,所以我的PhpDoc需要某种类型提示,说明变量、参数或返回值可以是任何类型。目前我必须写一些类似的东西:@varstring|int|bool|array|object$someVariable如果我能改写的话,我的生活会更轻松,代码也会更容易阅读:@varany$someVariable我实际上在很多情况下都遇到过这个问题-在过去的几个月里已经超过20-30次了,因为我使用了PhpStorm,它向我显示警告说某些方法需要其他类型的参数类型,或者因为我忘记将它显式地放在类型列表中,或者因为我使用的是用Ec
我目前将EclipsePhotonPDT用于一个旧的PHP应用程序。在这个应用程序中有很多phpdoc注释,但其中一些被标记为错误。for"@paramunknown$form"=>"unknown无法解析为类型"。同上“@returnAmbigous”=>“Ambigouscannotberesolvedtoatype”。有人知道如何禁用这些错误吗?(因为我所有的项目文件都标有错误图标,我看不到哪些文件确实有错误)。 最佳答案 最简单的短期修复是禁用该级别的错误检查:项目->属性PHP->验证->错误/警告启用项目特定设置Unde