Unexpected T_PAAMAYIM_NEKUDOTAYIM in PHP 5.2.x

柔情痞子 提交于 2019-11-30 08:42:04

问题


I'm having a hard time understanding why I'm getting an Unexpected T_PAAMAYIM_NEKUDOTAYIM error in the following code, which seems perfecly valid to me...

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;
}

Output in 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

In prior versions however, I can't do $result::$id = strval($xpto);, does anyone know why?

Are there any workarounds for this problem?


回答1:


After looking at codepad:

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

... should be

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

I corrected this in a new paste, and the error still exists... just letting you know about the problem in the demo code.

EDIT

Per PHP documentation page on static keyword,

As of PHP 5.3.0, it's possible to reference the class using a variable. The variable's value can not be a keyword (e.g. self, parent and static).

Unfortunately, no detail is given as to WHY to was otherwise in prior versions, nor do I see a workaround presented in the comments.

Because the class is static, though, you should be able to change the property directly:

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;
}



回答2:


The reason for the error is simply that the syntax isn't supported in < 5.3.

However, if you're trying to just access the static variable $id, then the syntax would be:

$result::id

If you do need to access a static variable variable, then a workaround is to use reflection:

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

ReflectionClass




回答3:


PHP Version 5.3.3, I am not getting any errors on that code.

Output:

string(0) "" string(3) "dev" string(4) "prod" string(0) ""

Your error likely lies elsewhere. Please double check the reported line numbers.




回答4:


I came here by the reference: Syntax error in PHP 5.2 where Chandresh mentioned your link: how ever one work around for PHP 5.2 is:

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;

Ignore if you already resolved. Thank you




回答5:


Another case :

It may happen on some servers (PHP VERSION ??) if you use: if (empty(NAME_OF_A_CONSTANT)) ...



来源:https://stackoverflow.com/questions/4995540/unexpected-t-paamayim-nekudotayim-in-php-5-2-x

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!