【问题标题】:Unexpected T_PAAMAYIM_NEKUDOTAYIM in PHP 5.2.xPHP 5.2.x 中出现意外的 T_PAAMAYIM_NEKUDOTAYIM
【发布时间】:2011-06-27 02:27:42
【问题描述】:

我很难理解为什么我在以下代码中收到 Unexpected T_PAAMAYIM_NEKUDOTAYIM 错误,这对我来说似乎完全有效...

class xpto
{
    public static $id = null;

    public function __construct()
    {
    }

    public static function getMyID()
    {
        return self::$id;
    }
}

function instance($xpto = null)
{
    static $result = null;

    if (is_null($result) === true)
    {
        $result = new xpto();
    }

    if (is_object($result) === true)
    {
        $result::$id = strval($xpto);
    }

    return $result;
}

PHP 5.3+ 中的输出:

echo var_dump(instance()->getMyID()) . "\n"; // null
echo var_dump(instance('dev')->getMyID()) . "\n"; // dev
echo var_dump(instance('prod')->getMyID()) . "\n"; // prod
echo var_dump(instance()->getMyID()) . "\n"; // null

prior versions 但是,我不能在$result::$id = strval($xpto); 做,有人知道为什么吗?

这个问题有解决办法吗?

【问题讨论】:

  • 我将您的代码复制/粘贴到一个 php 文件中,它运行时没有错误。
  • @Chris:你使用的是什么 PHP 版本?另外,请查看此链接:codepad.org/wpT0g3VH
  • 抱歉,误解了您的问题。在下面发布答案。

标签: php php-5.2


【解决方案1】:

错误的原因仅仅是< 5.3 中不支持该语法。

但是,如果您只是尝试访问静态变量 $id,那么语法应该是:

$result::id

如果您确实需要访问静态变量变量,那么解决方法是使用反射:

$class = new ReflectionClass($xpto);
echo $class->setStaticPropertyValue ('id', strval($xpto));

ReflectionClass

【讨论】:

  • 哎呀,这是一个 PITA...$id 在这种情况下不是变量变量。你知道我在哪里可以阅读更多关于这种语法支持的信息吗?我注意到非静态属性也不起作用(codepad.org/Fb1mQOvx),这也是因为不支持语法吗?
  • 您收到新错误是因为您在静态函数中使用了 $this。 php.net/manual/en/language.oop5.static.php
  • 哦,是的,忘记了!谢谢。
【解决方案2】:

查看键盘后:

if (is_object($result) === true)
{
    $result::id = strval($xpto);
}

...应该是

if (is_object($result) === true)
{
    $result::$id = strval($xpto);
}

我在新的粘贴中更正了这个问题,但错误仍然存​​在......只是让您知道演示代码中的问题。

编辑

static 关键字上的每个 PHP 文档页面,

从 PHP 5.3.0 开始,可以 使用变量引用类。 变量的值不能是 关键字(例如 self、parent 和 静态)。

不幸的是,在以前的版本中没有详细说明为什么会这样,我也没有在 cmets 中看到解决方法。

由于该类是静态的,因此您应该可以直接更改属性:

function instance($xpto = null)
{
    static $result = null;

    if (is_null($result) === true)
    {
        $result = new xpto();
    }

    if (is_object($result) === true)
    {
        xpto::$id = strval($xpto)
    }

    return $result;
}

【讨论】:

  • 糟糕,这是一个错字!但仍然出现错误 (codepad.org/wpT0g3VH)。
  • 有趣的是,我的开发服务器 (php 5.2.7) 将原始错误称为“解析错误:解析错误”,而不是使用旧的“T_PAAMAYIM_NEKUDOTAYIM”栗子。
  • 其实你给了我一个很好的提示:codepad.org/Y9ntbREa。谢谢! =)
【解决方案3】:

PHP 版本 5.3.3,我没有收到关于该代码的任何错误。

输出:

字符串(0)“”字符串(3)“开发”字符串(4) “产品”字符串(0)“”

您的错误可能在其他地方。请仔细检查报告的行号。

【讨论】:

  • PHP 5.3 工作正常,正如我在回答中所说的那样,该问题仅存在于 PHP 的早期版本中。查看 Codepad 链接以获取示例。
  • 抱歉,我以为你说它在以前的版本中有效,但在 5.3 中它失败了。
  • 没问题,我应该让我的问题更清楚。谢谢。
【解决方案4】:

我是通过参考来到这里的: Syntax error in PHP 5.2 Chandresh 提到您的链接的地方: 如何解决 PHP 5.2 的问题是:

class Sample{
    public static $name;

    public function __construct(){
        self::$name = "User 1";
    }
}

$sample = new Sample();
$class = 'Sample';
$name = 'name';
$val_name = "";
$str = '$class::$$name';
eval("\$val_name = \"$str\";");
//echo $val_name."<br>";
eval("\$name = $val_name;");
echo $name;

如果您已经解决,请忽略。谢谢

【讨论】:

    【解决方案5】:

    另一种情况:

    如果您使用: if (empty(NAME_OF_A_CONSTANT)) ...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      相关资源
      最近更新 更多