2011-02-14 7 views
5

Mam trudno zrozumieć dlaczego Dostaję błąd Unexpected T_PAAMAYIM_NEKUDOTAYIM w poniższym kodzie, co wydaje mi się ważne perfecly ...Nieoczekiwany T_PAAMAYIM_NEKUDOTAYIM w PHP 5.2.x

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

wyjścia w 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 

W prior versions jednak nie mogę zrobić $result::$id = strval($xpto);, czy ktoś wie dlaczego?

Czy są jakieś obejścia tego problemu?

+0

skopiować/wklejony kod do pliku php, i działa bez błędów . –

+0

@ Chris: Jakiej wersji PHP używasz? Sprawdź także ten link: http://codepad.org/wpT0g3VH. –

+0

Przepraszamy, źle zinterpretowaliśmy twoje pytanie. Zamieszczona odpowiedź poniżej. –

Odpowiedz

1

Po obejrzeniu codepad:

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

... powinny być

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

poprawiłem to w nowej pasty, a błąd nadal istnieje ... tylko z powiadomieniem o problem w kodzie demo.

EDIT

Per PHP stronie dokumentacji na static słowa kluczowego,

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).

Niestety, żaden szczegół nie jest podana, dlaczego by było inaczej w poprzednich wersjach, ani też nie widzę obejście przedstawione w komentarze.

Ponieważ klasa jest statyczna, choć powinieneś być w stanie zmienić się bezpośrednio:

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

Czy przetestowałeś ten kod? – Gumbo

+0

Ups, to był literówka! Nadal dostaję błąd (http://codepad.org/wpT0g3VH). –

+1

Co ciekawe, mój serwer dev (php 5.2.7) nazywa pierwotny błąd "Błąd analizy: błąd parsowania" zamiast wyrzucenia starego kasztana "T_PAAMAYIM_NEKUDOTAYIM". –

0

PHP wersja 5.3.3, Nie otrzymuję żadnych błędów w tym kodzie.

wyjściowa:

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

swój błąd prawdopodobnie leży gdzie indziej. Proszę dokładnie sprawdzić zgłoszone numery linii.

+0

PHP 5.3 działa poprawnie, jak już wspomniałem w mojej odpowiedzi problem występuje tylko w poprzednich wersjach PHP. Sprawdź link Codepad na przykład. –

+0

Przepraszam, myślałem, że powiedziałeś, że działało w poprzednich wersjach, ale w 5.3 to się nie udawało. –

+0

Nie ma problemu, powinienem był wyjaśnić moje pytanie. Dziękuję Ci. –

4

Przyczyną błędu jest po prostu, że składnia nie jest obsługiwana w < 5.3.

Jednakże, jeśli starasz się tylko dostęp do statycznej zmiennej $ id, wtedy składnia byłoby:

$result::id

Jeśli trzeba zrobić, aby uzyskać dostęp do zmiennej zmiennej statycznej, to jest obejście użyć refleksji:

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

ReflectionClass

+0

Auch, czyli PITA ... '$ id' w tym przypadku nie jest zmienną. Czy wiesz, gdzie mogę przeczytać więcej na temat obsługi tej składni? Zauważyłem, że właściwości niestatyczne również nie działają (http://codepad.org/Fb1mQOvx), czy to też dlatego, że składnia nie jest obsługiwana? –

+0

Otrzymujesz nowy błąd, ponieważ używasz $ this w funkcji statycznej. http://php.net/manual/en/language.oop5.static.php – webbiedave

+0

O tak, zapomniałem o tym! Dziękuję Ci. –

0

Przyjechałem tu przez odniesienie: Syntax error in PHP 5.2 gdzie Chandresh wspomniał o twoim linku: jak sobie poradzić z PHP 5.2 to:

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; 

Zignoruj, jeśli już rozwiązałeś. Dziękuję

0

Inny przypadek:

Może się zdarzyć, na niektórych serwerach (Wersja PHP ??), jeśli używasz: if (empty(NAME_OF_A_CONSTANT)) ...

Powiązane problemy