如果你有一个对每个成员都有约束的复杂数组,我不会使用匿名数组,而是使用定义明确的对象。使用数组,您永远无法确定它包含什么,这有点像在例如传递“对象”。 Java,您很少会认为它是一个不错的选择。
但是,当您的数组包含here 解释的特定类型的对象时,可能会有一点提示,但这并不是您问题的一个很好的答案。
如果您确实需要将参数作为数组,您可以按照您在方法描述中建议的方式记录它;但是,如果您使用对象作为参数,您将在现代 IDE(IntelliSense 等)中获得额外的支持。
编辑:我的意思是,对我来说,问题是“我为什么要使用匿名数组而不是自定义类型” - 除了简单(这会适得其反如果您维护和扩展您的代码,以后会产生技术债务),我想不出任何原因,尤其是与您在使用用户定义类型(自我记录的代码、可见的约束并通过标准方法明确等)获得的收益相比开)。
如果您只需要转储数据,您可能希望使用简单的数组,但由于您已经在考虑可选和必需键,因此需要用户定义类型。
EDIT2:关于您是否已经有一个数组作为源的评论:我不确定您是否需要将其作为数组传递或立即执行“映射”操作接收数组(例如作为 $_POST 或作为来自某些第三方库或 PHP 内部函数等的返回值)。
我想有人可能会争辩说,解释视图生成的数据(例如 POST 数据的 HTML 表单)不是模型的业务,而是控制器对输入做出相应反应并将模型转移到适当状态的责任。我的意思是,如果你收到例如,你可以做这样的事情。 $_POST 的数组:
$customer = new Customer();
$customer->setId($_POST['id']);
$customer->setName($_POST['name']);
$customer->setTown($_POST['town']);
并在您访问 $customer 时立即处理错误,例如如果未设置名称(即$_POST['name'] 为空等),则抛出异常。这样,您可以使用源数组来调用对象上的设置器,而不是例如将数组传递给像Customer::buildByHttpPostData(array $data) 这样的工厂,从而将视图细节的知识(HTML 输入标签的名称等)委托给我们。
底线是,没有“标准”方式来声明必需或可选的数组键,当然您可以在方法描述中描述这些约束,但也许您可以通过在设置器上使用 PHPDoc cmets 等受支持的方式来规避这一点或吸气剂。
当然,可能有更好的方法来解决这个问题,也许有人想出了更好的解决方法。