2017-04-02 118 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