2013-02-09 55 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详细例如