我更喜欢阅读和编写干净的代码 - 正如 Robert C. Martin 的“干净代码”中所述。当遵循他的信条时,您不应该要求开发人员(作为您的 API 的用户)知道您的数组的(内部)结构。
API 用户可能会问:这是一个只有一维的数组吗?对象是否分布在多维数组的所有级别上?我需要多少个嵌套循环(foreach 等)才能访问所有对象?该数组中“存储”了哪些类型的对象?
正如您概述的那样,您希望将该数组(包含对象)用作一维数组。
正如 Nishi 所述,您可以使用:
/**
* @return SomeObj[]
*/
为了那个原因。
但同样:请注意 - 这不是标准的 docblock 表示法。这种表示法是由一些 IDE 生产者引入的。
好的,好的,作为开发人员,您知道“[]”与 PHP 中的数组相关联。但是在普通 PHP 上下文中,“something[]”是什么意思呢?“[]”表示:在“某物”中创建新元素。新元素可能就是一切。但是您要表达的是:具有相同类型的对象数组并且它的确切类型。如您所见,IDE 生产者引入了一个新的上下文。您必须学习的新环境。其他 PHP 开发人员必须学习的新环境(以了解您的文档块)。糟糕的风格(!)。
因为您的数组确实有一个维度,您可能想将该“对象数组”称为“列表”。请注意,“列表”在其他编程语言中具有非常特殊的含义。例如,将其称为“收藏”会更好。
请记住:您使用的编程语言可以实现 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 用户不必引入该文档块来完成代码。让@return 只在一个地方尽可能减少冗余(@var)。撒上“带有@var 的docBlocks”会使你的代码可读性变差。
最后你完成了。看起来很难实现?看起来像拿大锤敲碎坚果?不是真的,因为您熟悉这些接口和干净的代码。请记住:您的源代码编写一次/多次阅读。
如果您的 IDE 的代码完成不适用于这种方法,请切换到更好的方法(例如 IntelliJ IDEA、PhpStorm、Netbeans)或在您的 IDE 生产者的问题跟踪器上提交功能请求。
感谢 Christian Weiss(来自德国)担任我的教练并教给我这么棒的东西。PS:在 XING 上认识我和他。