如何使用接受一组固定值的参数定义PHP函数?

时间:2017-02-03 10:36:54

标签: php function constants

如何定义一个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);

我希望澄清。

2 个答案:

答案 0 :(得分:1)

看这里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_上面的评论。

答案 1 :(得分: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);