2014-12-27 53 views
1

好吧,我做了3個文件,我有index.php其中i包括namespace.php在那裏我有2個功能:所需的類不能實例

Namespace namespaceName{ 

class classLoader{ 
     public function __construct() { 
      //not used 
     } 

     public function executeFunctionOutsideTheNamespace() { 
      include("class.php"); 
      new classExtended("badass"); 
     } 
} 

class classBase{ 
    public function __construct(){ 

    } 
} 
} 
index.php

現在我嘗試動態地從第三個文件調用一個函數class.php其中是從namespaces擴展一個類的類。這裏是class.php代碼

class classExtended extends namespaceName\classBase 
{  
    public function __construct($action) { 
     echo $action; 
    } 
} 

,當然還有我的index.php文件

require("namespace.php"); 

$namespace= new namespaceName\classLoader(); 
$oController = $namespace->executeFunctionOutsideTheNamespace(); 

$oControllerclassLoader()實例的權利?現在我從名稱空間namespaceName的類classLoader()調用函數executeFunctionOutsideTheNamespace,並告訴include("class.php");並實例化擴展類女巫是從名稱空間的classBase的一個擴展。我recide一個Fatal error: Class 'namespaceName\classExtended' not found in C:\xampp\htdocs\exercices\namespace.php on line 10

+1

右鍵 - 文件'class.php'沒有聲明一個名稱空間,所以在全局命名空間。它不會繼承包含它的文件的名稱空間,因此您需要使用'new \ classExtended()'。這是你的問題嗎? – 2014-12-27 17:56:28

+0

是的我的課是在'globalNamespace \ classExtended()'和我的命名空間是'namespaceName'因此是2個命名空間,我希望延伸'namespaceName \ classBase'的類也在'namespaceName'中,不在'globalNamespace '我的問題是如何將擴展類包含在'namespaceName'中? – 2014-12-27 18:03:29

+0

你需要將它放在'namespaceName'中,並且在它的文件'namespace namespaceName'的頂部有一個聲明;'我會在下面寫下這個答案。 – 2014-12-27 18:05:27

回答

1

class.phpinclude()版的classLoader類,它駐留在namespaceName命名空間內不會導致它從包括文件繼承命名空間內的事實。

所以包括class.php負載類classExtended到全局命名空間,這意味着爲你的代碼來訪問它,你將需要使用

new \classExtended("cool"); 

爲了得到classExtended到命名空間namespaceName,因爲它位於在它自己的文件中,您將需要在該文件中聲明命名空間。這樣做也意味着您需要從extends聲明中刪除namespaceName,以免PHP開始尋找嵌套的namespaceName\namespaceName\classBase。該文件class.php必須成爲

namespace namespaceName; 

// Declare the class without the namespace in extends 
// since classExtended is now in the same namespace as classBase 
class classExtended extends classBase 
{  
    public function __construct($action) { 
     echo $action; 
    } 
} 

我會強烈建議熟悉的PHP框架協同工作組定義的PSR-4 class autoloading standard,並使用Composer來處理你的類自動加載。命名空間大多是文件系統佈局的問題,並且文件包含是自動處理的。