从命名空间中调用PHP函数

3

当调用一些我无法理解的命名空间中的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报错: 全局命名空间.php在第7行出现语法错误,意外的T_UNSET,期望T_STRING 甚至try...catch也无法解决问题,并且只有全局函数isset()unset()会报错!

我觉得这非常奇怪!


1
这是因为命名空间不用于函数,而是用于类。 :) - Seer
@Seer 嗡嗡声。错误。 - deceze
Try/Catch不起作用,因为@Seer所说的。并且:https://dev59.com/xnI-5IYBdhLWcg3wW24L - apelsinapa
@Seer "虽然任何有效的 PHP 代码都可以包含在命名空间中,但只有四种类型的代码受命名空间的影响:类、接口、函数和常量。" http://www.php.net/manual/en/language.namespaces.definition.php - deceze
每天你都会学到新东西,<3 SO。 - Seer
1个回答

4

issetunset不是函数,它们是语言构造体。这意味着它们更接近于像+=这样的运算符,而不是函数,因此不遵循相同的规则。只有一个unset,如果要重新定义它为函数,则无法实现。

此外,错误不是异常。您无法catch错误,因为它没有被throw。对于语法/解析器错误更是如此,这些错误发生在任何代码执行之前。


感谢deceze的回答:我仍然觉得这些“构造”是如何由PHP团队实现的非常奇怪! - centurian
(另外,我刚访问了你的项目Kunststube-Router,我觉得非常有趣,因为我正在为我正在进行的项目尝试做同样的事情-前端控制器模式。请在你的网站上提供联系方式,以便与你取得联系!) - centurian
“语言结构”是语言本身的一部分,而不是预定义的函数。想想看,普通函数无法“unset”变量。对于普通函数来说,根本没有机制可以这样做。“unset”被PHP定义为保留关键字,并由PHP解释器本身处理。如果您想了解实现细节,请查看PHP源代码。 - deceze
(而且各种联系方式可以在不同的地方找到。) - deceze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接