PHP 命名空间,use 命令



我只是在学习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

最新更新