2017-04-02 115 views
0

我只是在学习PHP的命名空间和我有没有工作一个非常简单的代码,我想知道为什么:PHP命名空间,使用命令

我们已经含有一个名称空间和功能n1.php

<?php 
namespace app\cat1; 
function echoo(){ 
    echo "from cat 1"; 
} 
?> 

n2.php

<?php 
    namespace app\cat2; 
    function echoo(){ 
     echo "from cat 2"; 
    } 
?> 
现在

index.php我既包括n1.php和n2.php使用echoo功能:

<?php 

require_once('n1.php'); 
require_once('n2.php'); 

use app\cat1; 
echoo(); 

?> 

据我了解的命名空间,上面的代码应该工作,但它不是,我不知道为什么!?我告诉PHP使用app\cat1;和被叫echoo()功能,但我得到:

Fatal error: Call to undefined function echoo() in E:\xampp\htdocs\test\index.php on line 7 

Ofcourse我可以做到这一点,这是要去工作:

<?php 

require_once('n1.php'); 
require_once('n2.php'); 

//use app\cat1; <-- this is commented 
app\cat1\echoo(); // <-- and now I'm using full path to run the echoo() 
?> 

上述工作,但现在有什么理由我们命名空间中有use


另一件事:我们怎样才能把命名空间在多个文件中像我上面那样,也不能使用include方法?我在Laravel框架文件中看到了这种情况。文件只有use etc\blah,没有包含,它工作得很好。那么这是如何发生的?

回答

2

默认use关键字将导入命名空间下的对象,您需要定义您正在使用function

,你需要的函数名传递给use其他的事情,所以解决您的问题:

use function app\cat1\echoo; 

docs

// importing a function (PHP 5.6+) 
use function My\Full\functionName; 

所以,在你的榜样 - 这里我使用的分组名称空格代替,只要大多数的在线集成开发环境并不支持其中包括文件 - :

namespace app\cat1 { 
    function echoo(){ 
     echo "from cat 1"; 
    } 
} 

namespace app\cat2 { 
    function echoo(){ 
     echo "from cat 2"; 
    } 
} 

namespace { 
    use function app\cat2\echoo; 
    // ^^^^^^^^ see this 
    echoo(); 
    // Output : from cat 2 
} 

活生生的例子:https://3v4l.org/TATgp

+0

岂能单独的命名空间的文件,并把在多个文件中也不使用include方法?有没有办法呢?我看到这发生在Laravel框架文件中,它只使用'use'并且没有'include' – behz4d

+0

我用底部的新问题更新了我的问题。 – behz4d

+1

@ behz4d http://www.php-fig.org/psr/psr-4/ – hassan