我想让一个变量以数组或字符串的形式传递给我的函数,并使它们成为可选的.以下是示例函数:

function myFunction(string $msg = '' || array $msg = []) { // This is line 9
    if(is_string($msg)) {
        echo "I'm a string";
    } else if (is_array($msg)){
        echo "I'm an array";
    }
}

这个是可能的吗?我找不到任何具体说明这一点的东西.当我try 在测试页面上运行此函数时,我得到以下错误:

分析错误:语法错误,意外变量"$msg",应为"(" 在/Path/to/My/FileTest.php中 9.

我看了php的函数论证手册:https://www.php.net/manual/en/functions.arguments.php,上面写道:

信息可以通过参数列表传递给函数,该参数列表是 逗号分隔的表达式列表.对参数进行判断 从左到右,在实际调用函数之前(EARGE 判断).

那么为什么我写的东西不管用呢?

编辑...以下是我正在使用的实际方法.

public function flash(string|array $name = '', string $type = '') {
    if (!empty($name) && !empty($message) && $type !== '') {
        // create a flash message
        $this->createFlashMessage($name, $message, $type);
    } elseif ($name !== '' && $message === '' && $type === '') {
        // display a flash message
        return $this->displayFlashMessage($name);
    } elseif ($name === '' && $message === '' && $type === '') {
        // display all flash message
        return $this->displayAllFlashMessages();
    }
}

第一个参数接受一个名称,如error_msg,并将其分配给

$_Session[Flash_Message][$NAME]

$name是‘error_msg’.它可以很好地处理单个实例.但我在上传图像文件时遇到过一种情况,如果同一文件输入字段中的多次上传存在多个错误,

<input type="file" name="upload[]" multiple>

当我调用$Load=$Upload-&gt;ploadFile方法时,它可以返回一个字符串,其中包含准备输入到数据库中的文件名.该字符串是逗号分隔的列表,否则上传文件将返回一个包含以下错误的数组:

$Upload=[‘SERVER_ERROR=&gt;[’Message‘=&gt;’Error Message here‘,’type‘=&gt;’Flash_Error‘]];

但在同一上传出现多个错误的情况下,则:

$Upload=[‘SERVER_ERROR’=&gt;[[‘Message’=&gt;‘First Error Message’,‘type’=&gt;‘Flash_Error’],[‘Message’=&gt;‘Second Error Message’,‘type’=&gt;‘Flash_Message’]];

但这就是为什么我需要能够传递数组、字符串或什么都不传递的原因.另外,我的方括号可能在这里也可能不正确:)我仍在try 切换到使用方括号,而不是使用数组(array()):d

推荐答案

  1. 复合类型:https://www.php.net/manual/en/language.types.declarations.php#language.types.declarations.composite
  2. 可为Null的类型:https://www.php.net/manual/en/language.types.declarations.php#language.types.declarations.nullable
function myFunction(string|array $msg = NULL) {
    if( is_null($msg) ) {
        // do a default thing?
    }
    var_dump($msg);
}

myfunction();
myfunction('foo');
myfunction(['foo']);

输出:

NULL
string(3) "foo"
array(1) {
  [0]=>
  string(3) "foo"
}

注意:复合类型仅在PHP>;=8中可用.要在PHP<;8中实现这一点,您必须完全省略类型声明,并自己实现判断.例如:

function myFunction($msg = NULL) {
    if( ! in_array(gettype($msg), ['string', 'array', 'NULL']) ) {
        throw new \Exception('Parameter msg not of an acceptable type.');
    }
    var_dump($msg);
}

不过,如果你正试图以一种简单的方式容纳"一个或多个",我会建议你这样做:

function handleOne(string $msg) {
    echo $msg . PHP_EOL;
}

function handleMany(array $msgs) {
    foreach( $msgs as $msg ) {
        handleOne($msg);
    }
}

handleOne('first');
handleMany(['second', 'third']);

这具有确保所有数组成员都是字符串的附加好处,并且更易于维护.

Php相关问答推荐

产品ACF值在WooCommerce我的账户订单的附加列中为空

PHP中的圆生成器在国际日期变更线上失败

如何使用php一次更新两个数据库中的MySQL表

FlySystem v3:使用本地适配器时出现问题

根据发货类别在WooCommerce产品页面中显示快捷代码

PHP -流加密启用服务器切断字节

WooCommerce 以编程方式添加的费用不会持续存在

通过添加计数器修改文本区域表单中的重复值

Woocommerce 中为空时隐藏显示变体自定义字段数据

在 DateTime 或 DateTimeImmutable 对象上调用modify() 时是否必须使用空格?

通过ajax发送数据到下拉列表未完全设置为所选

在 php 中生成 MAC ISO/IEC 9797-1

PHP 在数组中搜索值

根据WooCommerce中选定的变体重量更改输入数量步值

PHP 合并/合并多维数组

php preg_match 验证 Tiktok 用户名

PHP header() 是否缓存重定向,如果是,如何防止它这样做?

如何在不解压缩/重新压缩的情况下连接(连接)两个缩小的值

正则表达式抓取递归括号的内容

加号登录 GET 查询并比较 URL