我更喜欢阅读和编写简洁的代码-如Robert C. Martin在“简洁的代码”中所述。当遵循他的信条时,您不应该要求开发人员(以您的API用户身份)知道数组的(内部)结构。
API用户可能会问:这是只有一维的数组吗?对象是否散布在多维数组的所有层上?访问所有对象需要多少个嵌套循环(foreach等)?该阵列中“存储”了哪些类型的对象?
如概述所示,您想将该数组(包含对象)用作一维数组。
如Nishi所述,您可以使用:
/**
* @return SomeObj[]
*/
为了那个原因。
但同样要注意:这不是标准的docblock表示法。这种表示法是由某些IDE生产商引入的。
好的,好的,作为开发人员,您知道“ []”与PHP中的数组相关。但是,“ something []”在正常的PHP上下文中是什么意思?“ []”的意思是:在“某物”中创建新元素。新元素可能就是一切。但是您要表达的是:具有相同类型和确切类型的对象数组。如您所见,IDE生产者引入了一个新的上下文。您必须学习的新环境。其他PHP开发人员必须学习新的知识(以了解您的docblock)。风格不好(!)。
因为您的数组确实具有一维,所以您可能希望将该“对象数组”称为“列表”。请注意,“列表”在其他编程语言中具有非常特殊的含义。例如,最好将其称为“集合”。
请记住:您使用的编程语言可以启用OOP的所有选项。使用类而不是数组,使您的类像数组一样可遍历。例如:
class orderCollection implements ArrayIterator
或者,如果您想将内部对象存储在多维数组/对象结构中的不同级别上:
class orderCollection implements RecursiveArrayIterator
此解决方案用类型为“ orderCollection”的对象替换您的数组,但到目前为止,尚未在IDE中启用代码完成功能。好的。下一步:
使用docblocks实现接口引入的方法-特别是:
/**
* [...]
* @return Order
*/
orderCollection::current()
/**
* [...]
* @return integer E.g. database identifier of the order
*/
orderCollection::key()
/**
* [...]
* @return Order
*/
orderCollection::offsetGet()
不要忘记将类型提示用于:
orderCollection::append(Order $order)
orderCollection::offsetSet(Order $order)
该解决方案不再引入很多内容:
/** @var $key ... */
/** @var $value ... */
Zahymaka确认了她/他的回答后,遍及了整个代码文件(例如,循环内)。您的API用户不会被强制引入该文档块来完成代码。仅在一个位置上返回@会尽可能减少冗余(@var)。撒上带有“ @var”的“ docBlocks”会使您的代码可读性最差。
最后,您完成了。看起来很难达到?看起来像是用大锤砸开螺母?并非如此,因为您熟悉该接口和简洁的代码。请记住:您的源代码只编写一次/读很多次。
如果您的IDE的代码完成不适用于此方法,请切换到更好的代码(例如IntelliJ IDEA,PhpStorm,Netbeans),或在IDE生产者的问题跟踪器上提出功能请求。
感谢Christian Weiss(来自德国)成为我的培训师,并教给我这么棒的东西。PS:在XING上认识我和他。