18 июля 2011

Что они курили?

В PHP есть такая волшебная лексема "T_PAAMAYIM_NEKUDOTAYIM".

В природе встречается в виде:

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /home/www/project/includes/file.php on line 43

На первый взгляд, такое сообщение вводит программиста в ступор: что за паамайим некудотайим? На деле расшифровывается просто: эта фраза на иврите обозначает двойное двоеточие, то есть лексуму "::". Что курили разработчики, когда решили так ее обозвать - непонятно. Можно ведь было назвать DOUBLE_COLON??

Теперь о главном - почему получаются такие сообщения? А получаются они из-за несовместимости версий PHP. То есть, если в PHP 5.3 запросто можно написать так:


$className = "Foo";
$result = $className::staticMethod();

то, более ранние версии такую конструкцию не пропустят, и укажут, что у вас "неожиданно встретилось то самое волшебное двоеточие" с непонятным названием.

Решение для PHP 5.2 и более ранних версий:


$className = "Foo";
eval('$result = '.$className.'::staticMethod();');

Еще один вариант решения подсказал @serega011:


call_user_func_array(array($className, 'staticMethod'), array());