【问题标题】:PHP: How to document array when they are method parameters [duplicate]PHP:当它们是方法参数时如何记录数组[重复]
【发布时间】:2013-07-20 22:04:51
【问题描述】:

当数组元素是方法的参数时,记录数组元素的最佳方法是什么?例如,使用 PHPDoc 标头,我可能会有类似的内容:

@param array $data

这并没有告诉我数组中哪些元素是必需的,哪些是可选元素。我想这应该在方法的解释中。比如:

array: $data
============ 
int     $id      Required 
name    $string  Required 
town    $string  Optional

【问题讨论】:

  • 在这种情况下,您不想使用有据可查且定义明确的对象而不是匿名数组吗?在对象中,您可以记录所有方法并提示它们是否需要。

标签: php documentation


【解决方案1】:

要回答没有正式方法的问题,请尝试使用您认为最直观的方法。我做了类似的事情:

/**
 * @param array $data [ int $id, string $name, string $town ]
 */

但是,我不会将此表示法用于参数,而是用作返回值。在您的情况下,我会将方法参数提取到对象并将其传递给方法:

/**
 * @param User $user
 */
public function myMethod( User $user )
{ 
    //... 
}

这样做的原因是 User 对象将其属性作为 API 公开给其他开发人员,自记录代码!

另一种方法是将数组元素分离为参数,如下所示:

/**
 * @param int $id
 * @param string $name
 * @param string $town
 */
public function myMethod( $id, $name, $town )
{
    //...
}

3 个参数几乎可以通过,但您应该开始寻找重构它的方法,就像我的第一个建议一样。 4个参数一般都认为是乱七八糟的,你重构一下。

【讨论】:

    【解决方案2】:

    如果你有一个对每个成员都有约束的复杂数组,我不会使用匿名数组,而是使用定义明确的对象。使用数组,您永远无法确定它包含什么,这有点像在例如传递“对象”。 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 等受支持的方式来规避这一点或吸气剂。

    当然,可能有更好的方法来解决这个问题,也许有人想出了更好的解决方法。

    【讨论】:

    • 感谢 stef77,但如果源是一个数组,例如$_POST?在某些时候,数组需要加载到一个对象中,因此需要在那个时候记录。
    • 请查看我编辑的答案,试图解决您的问题...
    【解决方案3】:
    /**
     * @param array $data
     * 
     * @var $data[id] int, required
     * @var $data[name] string, required
     * @var $data[town] string, required
     */
    

    这个使用学说的例子和zf2例子:

    /**
    * @ORM\Id
    * @ORM\Column(type="integer")
    * @ORM\GeneratedValue
    * @Form\Attributes({"type":"hidden"})
    */
    protected $id;
    
    /**
    * @ORM\Column(type="string")
    * @Form\Type("Zend\Form\Element\Text")
    * @Form\Required({"required":"true"})
    * @Form\Filter({"name":"StripTags"})
    * @Form\Filter({"name":"StringTrim"})
    * @Form\Validator({"name":"StringLength", "options":{"min":"5"}})
    * @Form\Options({"label":"First name"})
    */
    protected $firstName;
    

    【讨论】:

      猜你喜欢
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 2014-07-05
      • 2020-01-20
      • 2021-05-12
      • 2019-12-31
      相关资源
      最近更新 更多