我最近创建了一个类来创建HTML元素。我没有为每个现有的HTML元素和属性创建一个方法,而是决定使用魔术方法__get和__call。所以用我的代码我基本上可以做到这一点:
$signUpForm->insert->input->type('text')->name('firstName')->maxlength(100)->disabled
$signUpForm->insert->input->type('email')->name('emailAddress')->maxlength(100)
等。
但既然我决定保持这种"魔力"和简单,我也可以这样做:
$signUpForm->insert->magic->trick('rabbit')->accessory('hat')
将导致:
<magic trick='rabbit' accessory='hat'>
这一切都很好,因为在我看来,它减少了很多样板代码,并且完全完成了我需要做的事情。我不想要一个类来执行HTML标准,我想要一个类来促进HTML,因为你知道如何使用它(老实说,这样做的代码很小(
所以我的问题是,考虑到这个类可以接受任何未定义的属性或方法,有没有办法在 PHPDoc 中指定这种行为?我尝试了以下方法,但没有任何运气:
/**
* @property HtmlElementAttribute * Insert a new HTML element attribute
* @method HtmlElementAttribute * Insert a new HTML element attribute
*/
我不知道这是否只是 PHPStorm 的事情,但我在任何地方都找不到任何类似的场景......
另外,如果您想知道我为什么要这样做,那就是跟踪我的PHP代码中的某些HTML方面(例如,在表单中声明的ID,或表单中的元素(。这可以让我在将 HTML 发送给最终用户之前在 HTML 中具有可见性。
这个问题仍然在未回答的列表中徘徊,所以我要回答它。
为了在使用 __get()
和 __call()
等自动魔法方法时在 PhpStorm 或 Sublime 中实现良好的代码智能,您需要为添加的每个隐式属性或方法包含一个@property
或@method
行。我知道这很糟糕,但这是使用这种方法的成本。
请在使用__get()
时考虑您是否真的获得了足够的收益。它可能适合你的应用,在这种情况下,它很好。当我们尝试对对象数据进行进一步处理或抽象(例如驼峰大小写名称转换(时,我们通常会使用它。你保存了一些代码(无论如何,PhpStorm 都会为你编写(,但你需要在类中编写 PhpDoc DocBlock 行。
如果没有其他原因,请考虑包括所有行,而不是记录您的类。使用隐式属性,您不仅使 IDE 难以知道哪些方法和属性是有效成员,而且会使下一个维护者难以知道。这些文档块行可能看起来是多余的,但它们是很棒的文档。