2013-02-09 59 views
0

我公司的產品(&我也是)使用PHP 5.2。在PHP命名空間混淆中的類路徑相當於

我想切換到5.4,所以我第一次用5.4做了一些基本的測試。

按PSR 0,我跟着一個簡單的測試,以下文件夾結構:

Projectfolder 
    | 
    + index.php 
    | 
    + lib 
     | 
     + vendor 
      | 
      + mylib 
       | 
       + MyClass.php (Having namespace \mylib) 

這裏是我們的代碼,稱爲MyClass.php

namespace \mylib; 
class MyClass { 
    public $testA; 
    public function MyClass(){ 
     $this->testA = "test entry"; 
    } 
} 

我的問題是如何讓一個實例index.php文件中的MyClass?

命名空間之前,我可以這樣做:

include "lib/vendor/mylib/MyClass.php"; 
$myClass = new MyClass(); 
echo $myClass->testA; 

現在用的命名空間,我嘗試下面的代碼:

<?PHP 
use mylib\MyClass 
$myClass = new MyClass(); 
echo $myClass->testA; 

不過,我得到以下錯誤:

Fatal error: Class 'mylib\MyClass' not found ...

我的問題是,我該如何讓PHP查看文件夾lib\vendor中的命名空間文件。

在Java中,我們通常定義一個類路徑。 PHP中有類似的設置嗎?如命名空間教程中的一些示例所示,我需要包含包含要使用的所有類的所有PHP文件(10,20,50任意數字)。我想這不應該是這樣的,或者在PHP中引入命名空間的全部目的將被擊敗。

+0

你有使用絕對路徑試過嗎? – fedorqui 2013-02-09 15:14:30

+0

不是我想的。你能解釋一下嗎? – 2013-02-09 15:16:42

+0

偶爾'include(「$ _ SERVER [DOCUMENT_ROOT] /lib/whatever.php」);'是一個好的選擇;使路徑絕對相對於webserver/vhost基目錄。或者考慮使用自動加載器,或者使用可怕的PSR-0摺疊,或者使用類路徑映射緩存。 – mario 2013-02-09 15:18:33

回答

2

即使對於命名空間,您也必須包含這些文件。 命名空間用於在包含它們之後引用這些類。

,這樣就可以

include "lib/vendor/mylib/MyClass.php"; 
use mylib; 
\mylib\myClass::myFunction(); 

沒有new MyClass();

看到http://php.net/manual/en/language.namespaces.php詳細例如