【问题标题】:called php functions from a namespace从命名空间调用 php 函数
【发布时间】:2013-03-14 20:03:03
【问题描述】:

从我无法理解的命名空间调用一些 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() 报告错误!

至少我非常喜欢它!

【问题讨论】:

  • 这是因为命名空间不是用于函数,而是用于类。 :)
  • @Seer Bzzzzzt。错了。
  • Try/Catch 不起作用,因为@Seer 所说的。并且:stackoverflow.com/questions/1900208/…
  • @Seer "虽然任何有效的 PHP 代码都可以包含在命名空间中,但只有四种类型的代码受命名空间影响:类、接口、函数和常量。" @ 987654322@
  • 嗯,你每天都会学到新东西,

标签: php namespaces global-namespace


【解决方案1】:

issetunset 不是函数,它们是语言结构。这意味着它们比函数更接近+= 等运算符,因此不遵循相同的规则。只有一个unset,如果你愿意,你不能把它重新定义为一个函数。

此外,错误也不例外。你不能catch 出错,因为它不是thrown。甚至在任何代码执行之前发生的语法/解析器错误更是如此。

【讨论】:

  • 感谢 'deceze' 的回答:仍然觉得非常奇怪的是,您所称的这些“构造”是如何由 php 团队实现的!
  • (另外,我刚刚访问了您的项目 Kunststube-Router,我发现它非常有趣,因为我正在尝试对我正在从事的项目 - 前端控制器模式做同样的事情。联系在您的网站上,以便可以联系!)
  • 语言结构是语言本身的一部分,而不是预定义的函数。想想看,一个普通的函数不能unset一个变量。常规函数根本没有这样做的机制。 unset 被 PHP 定义为保留关键字,由 PHP 解释器自己处理。如果您想了解实现细节,请查看 PHP 源代码。
  • (而且各个地方都有各种联系方式。)
猜你喜欢
  • 2011-01-11
  • 2017-09-12
  • 2012-08-22
  • 2015-11-05
  • 1970-01-01
  • 2021-06-12
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多