我基本上是PEAR(和PhpDocumentor)的新手; 我使用PEAR CLI安装了PhpDocumentor,一切似乎都没问题......直到我去使用它,此时我收到以下错误:
Warning: require(PhpDocumentor/phpDocumentor/phpdoc.inc):
failed to open stream: No such file or directory in
/usr/local/bin/phpdoc on line 40
Fatal error: require(): Failed opening required
'PhpDocumentor/phpDocumentor/phpdoc.inc' (include_path='.:/usr/share/pear')
in /usr/local/bin/phpdoc on line 40
Run Code Online (Sandbox Code Playgroud)
我在网上找不到任何关于错误的内容,所以我再次通过命令行卸载/重新安装,没有错误,但是我遇到了同样的问题.我忽略了什么吗?正如我所说,我对PEAR很新:)
谢谢.d
以下哪一项是为phpDocumentor记录此方法的返回类型的正确方法?
方法1:
/**
* @return array Foo array.
*/
public function foo() {
return array(1, 2, 3);
}
Run Code Online (Sandbox Code Playgroud)
方法2:
/**
* @return integer[] Foo array.
*/
public function foo() {
return array(1, 2, 3);
}
Run Code Online (Sandbox Code Playgroud)
此外,这两种方法都有任何IDE含义吗?
编辑:
似乎PhpStorm和Netbeans 7.1+ IDE都支持第二种方法.
我按照MVC模式在Codeigniter开发了一个项目.
这意味着,例如,我有一个名为Items的控制器,它调用一个名为Items_model的模型,它从数据库中获取文件,最后将那些文件传递给名为Item_view的视图.
现在我需要记录它,我试图使用phpdoc.
我的主要问题是如何在控制器中的函数解释中,以函数的方式将该函数的行为与模型和视图相关联,而不仅仅是以纯文本形式写出名称.我正在阅读包装,但不知道如何正确使用它
我希望你能帮助,我非常高兴与phpdoc.
提前谢谢,对不起我的英语.
Sverd.
我想知道如何将@package和@subpackage用于类doc.
假设我有以下课程
class My_Controller_Action_Helper_MyHelperAction extends Foo_Bar {}
Run Code Online (Sandbox Code Playgroud)
应该是:
@category My
@package Controller
@subpackage Action_Helper
Run Code Online (Sandbox Code Playgroud)
要么
@category My
@package Controller
@subpackage Action_Helper_MyHelperAction
Run Code Online (Sandbox Code Playgroud)
要么
@category My
@package Controller_Action
@subpackage MyHelperAction
Run Code Online (Sandbox Code Playgroud)
要么
@category My
@package My_Controller_Action
@subpackage MyHelperAction
Run Code Online (Sandbox Code Playgroud)
如果使用命名空间而不是'_'怎么办?
如何表明该方法是PHPDoc接口的一部分?
例如:
/**
* @implements BarInterface
*/
class Foo implements BarInterface
{
/**
* @thisMethodIsHereBecauseItIsAPartOf("BarInterface")
*/
public function doBar()
{
}
}
Run Code Online (Sandbox Code Playgroud)
有什么适合替换@thisMethodIsHereBecauseItIsAPartOf("BarInterface")吗?
我经常给对象提供静态方法和属性,这些方法和属性不需要初始化对象。例如:
class SomeObject {
public function __construct($object_id) {
$this->loadProperties($object_id);
}
public static function getSomeStaticString() {
return "some static string";
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我们对这些对象进行了子类化,并具有某种控制器,该控制器在某些尚不应该初始化对象的情况下返回对象类字符串。例如:
class SomeObjectController {
public function getSomeObjectWithTheseProperties(array $properties) {
if($properties[0] === "somevalue") {
if($properties[1] === "someothervalue") {
return SomeSubclassObject::class;
}
return SomeObject::class;
}
return NULL;
}
}
Run Code Online (Sandbox Code Playgroud)
有时我可能想在SomeObject::getSomeStaticString()不实际初始化对象的情况下调用静态函数(因为这将涉及不需要的数据库提取)。例如:
$controller = new SomeObjectController;
$properties = array("somevalue", "someothervalue");
$object_class = $controller->getSomeObjectWithTheseProperties($properties);
echo $object_class::getSomeStaticString();
Run Code Online (Sandbox Code Playgroud)
问题:我可以以某种方式最好通过phpDoc告诉PhpStorm,它$object_class是的子类的类字符串SomeObject吗?
如果我告诉我的IDE它是一个字符串,它将通知我这getSomeStaticString()是一个无效方法。另一方面,如果我告诉我的IDE是SomeObject的实例,它认为我可以访问常规的非静态方法和属性,而我不能。
假设我有以下内容
class Something extends ClassWithMagicMethods{}
Run Code Online (Sandbox Code Playgroud)
通常我会为我知道存在的任何属性添加一个docblock,即使通过魔术方法访问也是如此
/**
* @property string $someVar
* @method SomeClass getSomeClass()
*/
class Something extends ClassWithMagicMethods{}
Run Code Online (Sandbox Code Playgroud)
哪个效果很好,但我想知道的是,我们是否可以将该docblock与类的定义分开.两种可能的用例:
我知道我可以在技术上创建一个ide_helper.php永远不会实际运行的虚拟文件 - 只是由IDE编制索引 - 不幸的是,这会导致任何体面的IDE抱怨我不想要的重复声明,因为它也会使代码导航速度变慢.
那么 - 是否可以通过从类定义中外部组合多个docblock来记录PHP类?
我在SO上提取的大多数结果只是记录了你使用它们的未知类型,这不是我需要的.IE:
/** @var Something $something */
$something = FactoryMethodThing::create('Something');
Run Code Online (Sandbox Code Playgroud) 说我有这个
function foo(){
return [1, 'bippo'];
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能编写它在自动完成时自动创建的 phpdoc 像这样
list($x, $y) = foo();
Run Code Online (Sandbox Code Playgroud) 我在一个Symfony项目上运行PHPStan,其中我在Doctrine实体中有以下关系:
/**
* @ORM\OneToMany(targetEntity="App\Entity\Course\Slide", mappedBy="chapter", cascade={"persist"}, orphanRemoval=true)
* @ORM\OrderBy({"listOrder" = "ASC"})
*
* @var ArrayCollection<Slide>
*/
private $slides;
Run Code Online (Sandbox Code Playgroud)
使用规则级别 6运行分析我收到以下有关该属性(及其 getter 返回类型)的消息:
App\Entity\Course\Chapter::$slides具有泛型类的属性Doctrine\Common\Collections\ArrayCollection未指定其类型:TKey, T
您可以通过checkGenericClassInNonGenericObjectType: false在您的phpstan.neon.
我的编辑尝试只会混淆 PHPStan,可能是因为我没有完全理解这里的泛型。但是仅仅因为我不明白而将消息静音将是愚蠢的。
我应该在 PHPDoc 中添加或更改什么?
假设你有一个类:
class MyClass
{
public function __construct(public int $id, public string $foo)
{
}
}
Run Code Online (Sandbox Code Playgroud)
和一个生成器创建该类的多个实例,如下所示:
$myGenerator = function (): \Generator {
yield new MyClass(id: 21, foo: 'fnord');
yield new MyClass(id: 13, foo: 'baz');
yield new MyClass(id: 42, foo: 'Thanks for the fish');
};
Run Code Online (Sandbox Code Playgroud)
如何输入提示生成器函数,以便它在迭代期间推断每个元素的类型?
class MyClass
{
public function __construct(public int $id, public string $foo)
{
}
}
Run Code Online (Sandbox Code Playgroud)
我不想做:
$myGenerator = function (): \Generator {
yield new MyClass(id: 21, foo: 'fnord');
yield new MyClass(id: 13, foo: 'baz');
yield new …Run Code Online (Sandbox Code Playgroud)