gpt4 book ai didi

php - 如何确定是否设置了按引用传递变量?

转载 作者:行者123 更新时间:2023-12-02 15:34:50 27 4
gpt4 key购买 nike

对于声明如下的任意函数:

function foo($first, &$second = null) {
// if ($second is assigned) {
// Work with $second
// }
}

如何确定 $second 是否确实在调用时分配给变量,例如:

foo('hello', $second);

对比

foo('hello'); // Notice &$second is unassigned

尝试了 isset()is_null() 但它们似乎不起作用。

更新:

创建了 test script here这里

最佳答案

据我所知,您希望实现一个函数来实现类似 preg_match 的功能,其中第三个参数将在传递时填充内存模式。

在内部,PHP 函数使用一个名为 zend_parse_parameters() 的函数;它接受格式字符串和可变数量的参数,这些参数将使用调用参数的元数据填充。如果未传递参数(例如,当参数为可选时),则元数据不可用,因此很容易检测到。

回到 PHP 本身,遗憾的是没有诸如 func_arg_used($var) 这样的东西可以告诉您 $var 是否作为函数参数传递;也许这将是对语言的一个有趣的贡献,但在那之前你将不得不满足于更古老的东西:)

if (func_num_args() > 1) {
// $second was passed and can be used to populate
}

更改函数签名时可能要小心,尤其是在$second前面添加参数时;然而,这种情况自然不应该经常发生,因为它肯定会破坏依赖函数。在末尾添加更多参数对上面的代码没有影响。

有两种方法可以实现:

  1. ReflectionFunction - 开发人员的 Shiny 新玩具,它允许您反射(reflection)您的函数并确定签名与创建时相比是否发生了变化。不过请谨慎使用,内省(introspection)并不便宜,尤其是考虑到替代方案。

  2. 简陋的代码注释 - 代码监管的低调形式;一行简单的内容 //重要 - 不要在 $second 之前添加参数

关于php - 如何确定是否设置了按引用传递变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13110667/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com