PHP:发送选项列表作为参数(替代命名参数/参数包)

雅亚·乌丁(Yahya Uddin)

我希望提供一个选项列表作为函数的参数。

理想方案:命名参数

如果PHP已命名参数,则将这样进行:

function setOptions($title, $url, $public = true, $placeholder = "type here...") {
   ...
}

setOptions($title = "Hello World", $url = "example.com", $placeholder = "hi"); 

不幸的是,PHP并没有命名的参数(请告诉我,如果PHP7计划有一些作为注释)

其他所有人都在使用的解决方案:关联数组

我见过的大多数PHP脚本都使用类似的替代数组方法,如下所示:

function setOptions($options) {
   ...
}

setOptions(array(
   'title' => "Hello World",
   'url' => "example.com",
   'placeholder' => "hi"
));

关联数组方法的缺点

尽管这可以正常工作,但存在以下缺点:

  • 用户无法从自动补全中受益(花费较长时间来编写)
  • 用户可以轻松地在拼写上犯错误
  • 不知道有哪些可用选项,因此可能会经常返回到文档中

有没有更好的办法?

有没有更好的方法可以解决这些问题(在当前的PHP或PHP7中,甚至在hacklang(?)中)。

用户3477804

在Hack中,您可以使用Shapes形状为关联数组定义了一种结构,以便可以自动完成内容(取决于IDE支持),并由类型检查器识别拼写错误。

例如,您的示例可以像这样重做:

function setOptions(shape(
  'title' => string,
  'url' => string,
  'public' => ?bool,
  'placeholder' => ?string,
) $options) {
  $title = $options['title'];
  $url = $options['url'];
  $public = Shapes::idx($options, 'public', true);
  $placeholder = Shapes::idx($options, 'placeholder', 'type here...');
  ...
}

setOptions(shape(
  'title' => 'Hello World',
  'url' => 'example.com',
  'placeholder' => 'hi',
));

此标记titleurl都是必需选项,public并且placeholder是可选的(形状中的所有可空类型都被视为可选)。Shapes::idx然后用于获取提供的值;如果未传入值,则使用默认值(第三个参数)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

发送对象列表作为导航参数

来自分类Dev

PHP函数参数作为参数

来自分类Dev

PHP函数参数作为参数

来自分类Dev

如何传递闭包以将 Ruby 作为参数发送

来自分类Dev

多个参数包作为工厂函数参数

来自分类Dev

Swift 以参数作为参数传递闭包

来自分类Dev

GORM findAll +无法将动态列表作为命名参数传递

来自分类Dev

发送字符串文字作为C ++模板中的参数-参数包

来自分类Dev

Alamofire发送对象作为参数

来自分类Dev

jQuery发送事件作为参数

来自分类Dev

淘汰发送ViewModel作为参数

来自分类Dev

发送窗口作为命令参数

来自分类Dev

PHP类作为参数

来自分类Dev

PHP:网址作为参数

来自分类Dev

PyGTK自定义信号发送列表作为参数

来自分类Dev

发送列表作为参数时验证Python参考计数

来自分类Dev

列表的var参数作为方法参数

来自分类Dev

使用可变参数宏参数作为列表

来自分类Dev

命名参数与可选参数

来自分类Dev

将口才模型作为PHP中的闭包参数传递

来自分类Dev

提供Bash替代作为函数参数

来自分类Dev

如何在PHP Laravel中将链接作为参数发送

来自分类Dev

较少的列表作为混合参数

来自分类Dev

传递列表参数作为参考

来自分类Dev

使用列表作为类参数

来自分类Dev

列表作为存储过程的参数

来自分类Dev

将列表作为参数传递

来自分类Dev

列表如何作为参数传递?

来自分类Dev

组件接收列表作为参数