【问题标题】:How to tell if optional parameter in PHP method/function was set or not?如何判断 PHP 方法/函数中的可选参数是否已设置?
【发布时间】:2012-12-24 07:47:26
【问题描述】:

假设我有一个具有以下签名的方法/函数:

foo($bar = 0)

foo 内部,我如何判断 $bar 是否已设置? isset 将始终返回 TRUE,因为 $bar如果没有任何内容传递给 foo,则 > 分配为 0

检查 0 不是一个选项。我需要知道参数显式设置为 0 或默认设置为 0 之间的区别。

【问题讨论】:

  • 对于函数的行为来说,这是一种非常笨拙的方式。 f(0) 应该产生相同的结果,而不管参数 0 的“来源”。
  • 如果您正在创建一个多态方法,如果设置了参数则执行一件事,如果未设置参数则执行另一件事。
  • 弗兰克,一些内置函数可以做到这一点,在我的情况下,我需要包装 substr,当我将 null 的包装器 $length 默认参数传递给 substr 时,我什么也没得到,因为 substr 解释说长度为 0。是的,它非常笨拙,我已经开始期待 PHP 没有比这更好的了。

标签: php


【解决方案1】:

只需使用func_num_args() 专门检查传入的参数数量。

<?php
function foo($bar = 0)
{
    echo "\nNumber of arguments: " . func_num_args();
}

  // Outputs "Number of arguments: 1"
foo(0);

  // Outputs "Number of arguments: 0"
foo();
?>    

Live example

【讨论】:

    【解决方案2】:

    您可以使用func_get_args。示例:

    function foo($optional=null) {
        if (count(func_get_args()) > 0)
            echo "optional given\n";
        else
            echo "optional not given\n";
    }
    
    foo(); //optional not given
    foo(null); //optional given
    

    请注意,用于内部 PHP 函数的约定是总是给可选参数一个默认值,并且当两个参数都没有给出并且它的默认值被显式给出时,让它们具有相同的行为。如果您发现其他情况,请提交错误报告。这让你可以在没有ifs 的情况下做这样的事情:

    function strpos_wrap($haystack, $needle, $offset = 0) {
        return strpos($haystack, $needle, $offset);
    }
    

    这个约定在用户空间中更加强制执行,因为导致您提出这个问题的困难已经向您展示了。如果约定不适合您的需要,至少重新考虑您的方法。 func_num_args/func_get_args的目的主要是允许变参函数。

    【讨论】:

      猜你喜欢
      • 2012-05-09
      • 2016-08-19
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 2013-05-09
      • 1970-01-01
      相关资源
      最近更新 更多