2011-07-08 15 views
7

W PHP 5.3.6, zauważyłem, że nie będzie działać, co następuje:Wiele paamayim nekudotayims w PHP, dlaczego nie?

class Foo{ 
    public static $class = 'Bar'; 
} 

class Bar{ 
    public static function sayHello(){ 
     echo 'Hello World'; 
    } 
} 

Foo::$class::sayHello(); 

Wydawanie unexpected T_PAAMAYIM_NEKUDOTAYIM. Korzystanie zmienną tymczasową jednak wyniki w oczekiwany:

$class = Foo::$class; 
$class::sayHello(); // Hello World 

Czy ktoś wie, czy jest to zgodne z projektem lub niezamierzony rezultat jaki operator rozdzielczości zakres jest tokenized czy coś? Jakiekolwiek czystsze rozwiązania niż ten ostatni, zmienny przykład tymczasowy?

+0

Może chcesz wypróbować na tym przykładzie wektor składni. '{$ {Foo :: $ class}} :: sayHello();' Coś takiego może działać. Nie mam parsera PHP przede mną. –

+0

Dzięki @Mark Tomlin - Niestety nie ma, prawdopodobnie wypróbowałem każdą możliwą kombinację. Zawsze kończy się szukaniem '$ Foo' lub' $ Bar'' – Dan

+0

Jeśli pamiętam o tym pytaniu, zrobię to, gdy wrócę do domu z pracy. Czy kod działa przed 5.3.6? –

Odpowiedz

2

Niestety nie ma sposobu, aby to zrobić w jednym wierszu. Myślałem, że może być w stanie to zrobić z call_user_func(), ale nie idź:

call_user_func(Foo::$class.'::sayHello()'); 
// Warning: call_user_func() expects parameter 1 to be a valid callback, class 'Bar' does not have a method 'sayHello()' 

Ponadto, dlaczego chcesz zrobić coś takiego w pierwszej kolejności? Jestem pewien, że musi istnieć lepszy sposób na robienie tego, co próbujesz zrobić - zwykle jest tak, gdy używasz zmiennych zmiennych lub nazw klas.

+0

Dzięki @Mike - Rozumiem, że są ograniczone zastosowania, ale "* static linking *" ma zastosowania w niektórych dynamicznych programach ładujących, nad którymi pracowałem. Oczywiście istnieją alternatywy, ale ta składnia byłaby słodką korzyścią dla ładowania helpera. – Dan

+1

Również @Mike - Twoja próba działa z niewielką zmianą; 'call_user_func (array (Foo :: $ class, 'sayHello'));' – Dan