限制函数参数以允许特定值

Posted

技术标签:

【中文标题】限制函数参数以允许特定值【英文标题】:Restrict function parameter to allow specific values [duplicate] 【发布时间】:2014-09-01 13:18:48 【问题描述】:

我想限制某人可以在我的函数调用中分配给变量的值。 例如说我的功能是

function myFunction ($carType, $isOld , $something)

    //do what is required

我希望我应该能够限制 $carType,$isOld 仅具有某些值,例如来自给定数组:

$carTypeValues = array ("car1", "car2", "car3");
$isOldValues = array (true,false);

我知道我可以将参数变量限制为某种类类型。

我试图找到一种方法来做到这一点,但我找不到任何可以准确解决我想要的东西的方法。我知道我可以在实际执行函数调用后检查该值,但是我正在寻找允许用户最好能够使用选择器的东西,例如:

myFunction (carType::car1, isOld::car2 , $something);

我不确定,这可能是:

myFunction (carType.car1, isOld.car2 , $something);

感谢阅读本文

【问题讨论】:

有人从书架上选择了 php 书而不是 C :-D 是的..我实际上更像是一名 Java 开发人员并且对 PHP 相对较新,松散的语言也有一些缺点:) 请看这个综合答案:***.com/a/27721900/352040。我个人喜欢类方法,然后将函数参数限制为该类型的对象,例如function foo(SomeClass $data) ... 【参考方案1】:

您可以通过多种方式做到这一点。快速而肮脏的方法是手动检查函数中的值并相应地处理它们:

function myFunction($carType, $isOld, $something)

    if (in_array($carType, array('car1', 'car2', 'car3'))) 
        echo 'Car type is valid';
     
    if (is_bool($isOld)) 
        echo 'Car age is valid';
     

另一种方法是使用验证输入的对象对函数定义进行类型提示。 PHP 不支持所有类型的类型提示,因此对象可能是要走的路,但在这种情况下这可能是多余的。

【讨论】:

是的,我知道我可以按照我在问题中所说的那样做到这一点,但是我正在寻找可以有提示或告诉调用该函数的用户它不正确的东西。我开始认为这可能不值得打扰...... *** 上有一些非常棒的用户(比如你自己),他们很多时候让我感到惊讶,因此我想问是否有一些我没有考虑的简单事情。谢谢 我认为您正在尝试做一些 PHP 根本无法做到的事情。它不支持枚举类型提示或任何比基本对象和数组提示更复杂的东西。如果您需要这种级别的控制,恐怕您最好使用另一种语言。不过祝你好运! 你可以用 PHP 很好地完成这样的事情。这是 Value 对象模式的一个很好的用例,请看martinfowler.com/bliki/ValueObject.html 这里我们需要一个 CarType 类,它只允许在其构造函数中使用某些汽车类型【参考方案2】:

您是否正在寻找一种简单的验证方式来验证将什么变量传递到您的函数中,比如这样?

function myFunction ($carType = null, $isOld = null, $something = null)

    $carTypeValues = array ("car1", "car2", "car3");
    $isOldValues = array (true,false);

    $strict = true; // strict comparison here? e.g. null == false if $strict is false

    if(
        !$carType || !$isOld                            // variables aren't empty?
        || !in_array($carType, $carTypeValues, $strict) // passed carType is ok?
        || !in_array($isOld, $isOldValues, $strict)     // passed isOld is ok?
    ) 
        // error, incorrect variable passed
        return false;
    

    //do what is required
    return true;

这将允许您检查 A. 您传递的变量是否存在,以及 B. 它们是否存在于您定义的一系列可接受的选项中。


我知道我可以在实际执行函数调用后检查该值,但是我正在寻找可以让用户更好地使用选择器的东西

您不能像示例中那样指定选择器,但您可以传入一个整数来表示数组键,从而避免复制变量值的需要:

function myFunction($carType = null, $isOld = null, $something = null)  
    $carTypeValues = array ("car1", "car2", "car3");
    $isOldValues = array (true,false);  

    if(
        !$carType || $isOld
        || !array_key_exists($carType, $carTypeValues)
        || !array_key_exists($isOld, $isOldValues)
    ) 
        return false;
    

    // handle OK
    return array(
        'car_type' => $carTypeValues[$carType],
        'is_old'   => $isOldValues[$isOld]
    );


myFunction(1, 0, 'foobar'); // array('car_type' => 'car2', 'is_old' => true);

【讨论】:

是的,我知道我可以做到这一点,正如我在问题中所说的那样,但是我正在寻找可以有提示或告诉用户的东西。我并不是说这一定是可能的。 如果这是一个类的一部分,您可以将可能的值设置为公共属性,并有一个返回它们的方法,这样您就可以向用户提供可能的选项... 这是一个独立的函数,不是类的一部分。谢谢 好的。您能否提供更多关于这种结构的原因和要求的信息,我会尽力提供进一步的帮助 哦,没有具体的要求,最好有这样其他开发人员首先正确调用该函数..但正如我所说,这不值得再花时间了花费在它上面。感谢您的帮助伙伴。【参考方案3】:

PHP 语言没有 Enum 类型 (proposition only)。

但是你可以通过安装特殊的扩展来获得splEnum。

PHP and enumerations问题

【讨论】:

我知道,我查看了 splEnum,不幸的是我无法在我们的服务器上安装它。谢谢

以上是关于限制函数参数以允许特定值的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中,如何定义一个函数包装器来验证具有特定名称的参数?

函数的返回值与参数

GDB:将参数转储到特定函数的所有调用

允许为不同的参数值分别实现功能的功能的名称是啥?

C++ (带有默认参数的函数参数)缺省函数参数

MATLAB 是不是允许您为 python 之类的函数的输入参数分配默认值?