【问题标题】:Is $params a reserved word in PHP 7.2?$params 是 PHP 7.2 中的保留字吗?
【发布时间】:2019-01-31 04:57:38
【问题描述】:

我刚刚进行了一次迁移,有些事情让我感到惊讶。我在一个类中有这个函数:

function selectEnums($name,$table,$filed, $params = '')
{
    $fieldName = $name. $this->name;
    if(is_array($params) && sizeof($params) > 0)
    {
        foreach($params as $var => $newValue)
        {
            $$var = $newValue;
        }
    }
    $res = $this->getEnums($table,$field, $this->db);
    $this->debug('res after getEnums');
    $this->debug($res);
    $params['options'] = array();
    foreach($res as $v)
    {
        $params['options'][] = $v;
    }
    .....
}

现在,我得到:

PHP 致命错误:未捕获的错误:无法将字符串偏移量用作数组 在 ....

在这一行:foreach($res as $v)

感谢之前的调试,我 100% 确定 $res 是一个数组。现在,棘手的事情是:如果我将变量从$params 更改为$parames,它就可以正常工作。更糟糕的是,这条线运行良好:if(is_array($params) && sizeof($params) > 0) 并且在与 $params 无关的另一行抛出致命错误。

所以它正在与这种变化一起工作,买为什么???有任何想法吗?也许是 php.ini 配置?保留字?我在 PHP 文档上没有找到它。

谢谢

【问题讨论】:

  • 我不知道(这意味着什么)。为什么要检查if(is_array($params) 中的数组,但假设$params$params['options'] 中的数组?如果$params 始终是一个数组,不要将其默认为字符串,而是在参数中使用$params = []
  • 谢谢。 $params = [] 效果很好,感谢您的提示。好像是服务器出了故障,因为今天不工作了,所以我把它改回 $params 并再次工作。

标签: php parameters reserved


【解决方案1】:

PHP 中的几乎所有保留字都不以 $ 符号开头,而是在没有前导符号的情况下定义,并且也应该大写。例如

const MY_RESERVE_WORD = value;

或与

define(MY_RESERVE_WORD, value);

所以没有params这样的保留字,你可以在PHP Fiddle测试下面的代码

$params = [1, 2, 2];

foreach($params as $var => $newValue)
{
    $$var = $newValue;
}

可能在您使用的任何lib/framework 中将$params 定义为constant

希望这能阐明PHP 中常量的概念。

【讨论】:

    【解决方案2】:

    错误消息与 $params 无关,而与 $res 无关,您将其作为数组传递给该行的 foreach。显然 getEnums 正在返回一个字符串,或者至少不是一个数组。

    编辑:另外,如果这是为了将 $params 的元素导入符号表(即,数组键成为变量名):

    foreach($params as $var => $newValue)
            {
                $$var = $newValue;
            }
    

    ...可以更简单的写成:

    extract($params);
    

    http://php.net/manual/en/function.extract.php

    【讨论】:

    • 不知道 extract(),很好用!非常感谢。关于错误消息,getEnums 正在返回一个数组,我确信因为我正在调试 $res 并且它打印为一个数组,这是其中令人困惑的部分。现在,这似乎是服务器上的一个小故障,因为今天它不再工作了,所以我再次将变量从 $parames 更改为 $params 并且工作正常。我猜服务器有一些问题
    • PHP 有一个鲜为人知的语法特性,它将字符串与字符数组类似地对待。例如:$str = "AEIOU";回声 $str{1};会打印 E。我怀疑调试功能中可能发生了类似的事情。很高兴它对你有用。
    • 另外,请务必了解 extract() 的可选标志参数。如果已经存在同名变量,则它可以以不同的方式运行,具体取决于传递的标志。您提取的变量可能会或可能不会覆盖现有变量,可能根本没有设置,或者可能具有与预期不同的(前缀)名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 2020-05-14
    • 2012-07-30
    相关资源
    最近更新 更多