我只是在学习PHP命名空间,我有一个非常简单的代码,它不起作用,我想知道为什么:
我们有包含一个命名空间和一个函数的n1.php
:
<?php
namespace appcat1;
function echoo(){
echo "from cat 1";
}
?>
n2.php
:
<?php
namespace appcat2;
function echoo(){
echo "from cat 2";
}
?>
现在在index.php
中,我已经包含了 n1.php 和 n2.php 来使用 echoo
函数:
<?php
require_once('n1.php');
require_once('n2.php');
use appcat1;
echoo();
?>
据我了解命名空间,上面的代码应该可以工作,但它不是,我不知道为什么!?我告诉PHP使用appcat1;
和调用的echoo()
函数,但我得到:
Fatal error: Call to undefined function echoo() in E:xampphtdocstestindex.php on line 7
当然,我可以这样做,它会起作用:
<?php
require_once('n1.php');
require_once('n2.php');
//use appcat1; <-- this is commented
appcat1echoo(); // <-- and now I'm using full path to run the echoo()
?>
以上是有效的,但现在我们在命名空间中use
的原因是什么?
另一件事:我们如何像我上面所做的那样将命名空间放在多个文件中,并且不使用include
方法?我在 Laravel 框架文件中看到这种情况正在发生。文件只有use etcblah
,没有包含,它工作得很好。那么这是怎么回事呢?
默认情况下use
关键字会将对象导入命名空间下,您需要定义您正在使用function
您需要将函数名称传递给use
以解决您的问题的另一件事:
use function appcat1echoo;
文档:
// importing a function (PHP 5.6+)
use function MyFullfunctionName;
所以,在你的例子中 - 这里我使用分组名称空间而不是包含文件,只要大多数在线 IDE 不支持包括- :
namespace appcat1 {
function echoo(){
echo "from cat 1";
}
}
namespace appcat2 {
function echoo(){
echo "from cat 2";
}
}
namespace {
use function appcat2echoo;
// ^^^^^^^^ see this
echoo();
// Output : from cat 2
}
现场示例:https://3v4l.org/TATgp