【问题标题】:How to define a PHP function with a parameter accepting a fixed set of values?如何使用接受一组固定值的参数定义 PHP 函数?
【发布时间】:2017-02-03 10:36:54
【问题描述】:

如何定义一个 PHP 函数,其参数接受一组固定值,类似于 filter_var,它接受各种值作为参数,如大写字母:

http://php.net/manual/en/filter.filters.validate.php

我猜它会是这样的:

function f(int $params) { ... }

但问题是如何制作我自己的固定大写类型关联?

举例说明:

目前我有两个功能:

function defineDirConstant($constant, $dirname) {
    if (is_dir($dirname) && is_readable($dirname)) {
        define(__NAMESPACE__ . '\\' . $constant, $dirname . DIRECTORY_SEPARATOR);
    } else {
        // some other logic
    }
}

function defineFileConstant($constant, $filename) {
    if (is_file($filename) && is_readable($filename)) {
        define(__NAMESPACE__ . '\\' . $constant, $filename);
    } else {
        // some other logic
    }
}

我愿意合二为一:

function defineFilesystemConstant($constant, $filename, int $type) {
    // some logic considering the $type
}

我知道在这种特殊情况下我可以使用布尔值作为类型,但我的问题是一般性的:如何制作一个能够作为文本输入的人类可读参数。例如。函数调用将是

f("ONE", "foo.txt", TYPE_FILE);
f("BAR", "bar", TYPE_DIR);
f("JIM", "jimcarrey", TYPE_SOMETHING_ELSE);

我希望澄清一下。

【问题讨论】:

  • 我不认为你真的想要这个,如果事情不完美,会抛出很多运行时错误。
  • 如果我理解正确,您想创建一个函数来接受一个(或可能更多)具有恒定值的参数吗? function f(constant_goes_here, ...){} 之类的东西?
  • 您的意思是您的函数应该接受某些常量(如 MY_FILTER1、MY_FILTER2 等)而不接受其他常量吗?在这种情况下,没有内置的方法可以做到这一点。您必须在函数体中检查输入是否在允许的范围内。
  • 请说明您想要什么,例如通过编写模型代码(即使它不是有效的 PHP)。
  • 我添加了一个说明。

标签: php function constants


【解决方案1】:

我认为您正在寻找的是 define() 函数 - 您可以使用它来创建类似于 filter_var 函数所使用的常量。

在您的示例中,您将创建以下常量:

define('TYPE_FILE', 1);
define('TYPE_DIR', 2);
define('TYPE_SOMETHING_ELSE', 3);

然后您可以使用它,例如,f("BAR", "bar", TYPE_DIR);

或者如果你想避免全局常量,你可以使用一个类来限定它们:

class FileSystemType {
    const FILE = 1;
    const DIR = 2;
    const SOMETHING_ELSE = 3;
}

然后您可以使用以下方式访问:

f("BAR", "bar", FileSytemType::DIR);

【讨论】:

  • 我也想过这个问题,但它需要全局定义这些常量,而不是在函数内部,这是不好的编程风格,不是吗?
  • @george,好吧,是的,但这就是 PHP 为自己的功能所做的。如果您想完全按照您的描述创建代码,这是唯一的方法。否则,您可以创建一个类并向其添加常量。请参阅我的第二个示例。
  • 我在调用function defineFilesystemConstant($constant, $name, FilesystemType $type) { }定义的函数时收到PHP Catchable fatal error: Argument 3 passed to defineFilesystemConstant() must be an instance of FilesystemType, integer given,为什么会这样?
  • 来电是defineFilesystemConstant("FOO", "foo.txt", FilesystemType::FILE);
  • FilesystemType::FILE 是一个int,所以你需要像这样定义你的函数:function defineFilesystemConstant($constant, $name, int $type) {}。我认为您无法更强烈地键入参数。一种选择是将常量定义为通过new FilesystemType(1)new FilesystemType(2) 等创建的对象,但实际上这太过分了。
【解决方案2】:

看这里http://php.net/manual/en/migration56.new-features.php:

function f($req, $opt = null, int ...$params) {
     printf('$req: %s; $opt: %s; number of params: %s'."\n",
       $req, $opt, count($params));
}

此函数以$reg$opt为参数,数组$params保存所有下一个参数并将其转换为int

所以f(1,2,3,4)$reg=1 $opt=2, $params=[3,4]

或者f(1,2,3,4,'5')$reg=1 $opt=2, $params=[3,4,5]

知道你可以检查$params并且只使用有效的参数[ENUMS]。

要定义 ENUMS,你可以这样做:

interface MyEnums {
   const VALUE1 = 1;
   const VALUE2 = 2;
}

echo MyEnums::VALUE1;

因此,如果您将这两种技术结合起来,您将获得与您的示例类似的东西。

f(1,2,MyEnums::VALUE1,MyEnums::VALUE2);

记住上面@this.lau_ 的评论。

【讨论】:

  • 但这是针对可变数量的参数。我正在寻找固定数量的参数,其中只有一个接受一组固定的值。
  • filter_var 就是这样工作的。这只是提示/提示,为实现您的需求提供指导。没有完整的解决方案。如果您不知道该怎么做,请不要让事情变得复杂 :-) @this.lau_ You'll have to check in the body of the function that the input is within the allowed range 的评论充分解释了 accepting a fixed set of values 有一个很好的尝试
  • 谢谢。我会将他的答案标记为答案,但您的答案也有有用的信息。
猜你喜欢
  • 2020-12-16
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
  • 2018-04-30
  • 1970-01-01
  • 2020-12-30
相关资源
最近更新 更多