2013-03-14 5 views
0

Кажется, я нашел ошибку при вызове некоторых функций PHP из пространства имен, которые я не могу понять его:называемые PHP функции из пространства имен

<?php 
namespace test; 
$var = "foo/bar"; 
echo 'let\'s call \strpos($var, \'o\'):', \strpos($var, 'o'); 
try{ 
echo '<br />let\'s call \unset($var):'; 
\unset($var); //error! 
unset($var); //correct! 
echo '<br />let\'s call \isset($var):'; 
\isset($var); //error! 
isset($var); //correct! 
}catch(\Exception $e){ 
echo 'We have error:', $e->getMessage(); 
} 
?> 

Php говорит: Parse error: syntax error, unexpected T_UNSET, expecting T_STRING in global_namespace.php on line 7 Даже не try...catch работ и ошибка сообщается ТОЛЬКО для глобальных функций isset() и unset()!

Мне понравилось это очень странно, по крайней мере!

+1

Это потому, что пространства имен не используются для функций, они используются для классов. :) – Seer

+0

@Seer Bzzzzzt. Неправильно. – deceze

+0

Try/Catch не работает, потому что то, что сказал @Seer. И: http://stackoverflow.com/questions/1900208/php-custom-error-handler-handling-parse-fatal-errors – apelsinapa

ответ

1

isset и unset не функции, они язык конструирует. Это означает, что они ближе к операторам, такие как + и =, чем функции, поэтому не играют по тем же правилам. Есть только один unset, вы не можете переопределить его как функцию, если хотите.

Кроме того, ошибки не являются исключениями. Вы не можете получить catch, так как это не throw n. Тем более для ошибок синтаксиса/парсера, которые происходят до того, как какой-либо код даже выполняется.

+0

Спасибо 'deceze' за ваш ответ: по-прежнему очень странно, как эти «конструкции», как вы их называете, реализуются командой php! – centurian

+0

(Кроме того, я только что посетил ваш проект Kunststube-Router, который я нашел очень интересным, поскольку я пытаюсь сделать то же самое для проекта, над которым я работаю, - The Front Controller Pattern. Сделайте контакт на своем сайте, чтобы можно было связаться с!) – centurian

+0

* Языковые конструкции * являются частью самого языка, а не предопределенной функции. Подумайте об этом, регулярная функция не может «отменить» переменную. Просто нет механизма для регулярной функции. 'unset' определяется PHP как зарезервированное ключевое слово и обрабатывается самим интерпретатором PHP. Посмотрите исходный код PHP, если хотите узнать подробности реализации. – deceze

Смежные вопросы