记录Phalapi中关于命名空间自动加载的测试及问题

php命名空间我并不是很熟悉,经过实际例子测试,得出以下结论:在phalapi中,只有顶级命名空间下只有放置在Api、Domain以及Model目录下的类使用相应的命名空间才能被use后实例化,如果不在这三个目录下,则需要在composer.json中添加自动加载文件。当然,也可以在config/di.php中注册di依赖注入服务,需要使用时实例化
\PhalApi\DI()->name
即可。以下为测试过程记录。测试不在Api、Domain以及Model目录下的类使用
在phalapi/src/app目录下新建一个Test.php,定义命名空间为App\Test;
[code]//phalapi/src/app/Test.php
namespace App\Test;

class Test{
public function say() {
return 'hello';
}
}
[/code]
接着在phalapi/src/app/Api下的Hello.php中定义Test接口用于本次测试
[code]//phalapi/src/app/Api/Hello.php
namespace App\Api;

use PhalApi\Api;
use App\Test\Test;
/**
* 测试模块接口
*/
class Hello extends Api {

/**
* 测试命名空间接口
* @desc 测试命名空间自动加载
* @return string rs 结果
*/
public function test(){
$a = new Test();
return $a->say();
}
}
[/code]
此时访问接口
?s=App.Hello.Test
会提示uncaught错误,即 App\Test\Test类找不到。可见该文件没有被自动加载,才产生了这种结果。
接下来为进一步证明,我们将该文件的命名空间修改为App\Domain进行测试。会发现同样报错
Uncaught Error: Class 'App\\Domain\\Test' not found
,接下来我们测试将该文件放置到Domain目录下。测试在Api、Domain以及Model目录下的类使用
我们先将该文件放置到Domain目录下,将命名空间修改为App\Test。再次在Test接口中访问,会发现还是提示Uncaught Error: Class ‘App\Test\Test’ not found。这是不是说明命名空间还必须与文件路径相一致呢?我们将命名空间修改为App\Domain再次尝试一下,接口成功返回数据,这一点在官网文档上已有提示。测试composer.json中声明自动加载
接下来我们将Test.php移回app目录下,命名空间修改为App\Test,然后在项目根目录下的composer.json中的添加一条路径,执行 $ composer update
[code]"autoload": {
"files": [
"src/app/functions.php",
"src/app/Test.php"//添加的自动加载文件
],
[/code]
最后仍在Test接口中实例化该类,访问可正常返回结果。
综上可见命名空间的自动加载是框架已经定义好的,只有满足以下两个条件:
  1. 类文件放置在Api、Domain以及Model目录下
  2. 命名空间需与文件路径保持一致

除此之外,只能通过di注入或者在composer.json中声明自动加载才可使用
那么如果我需要在app目录下增加一个Common目录用来存放自己常用的类,应该怎么设置才能达到和Api、Domain、Model目录下的类自动加载的效果呢?

2 个评论

可以参考下PSR4的命名规范:http://docs.phalapi.net/#/v2.0/autoload。实际上,任何符合命名规范的类都能被自动识别和加载,不仅限于Api、Domain、Model。例如对于Common目录,以下是一个示例:类名为App\Common\Test,文件路径对应为app\Common\Test.php。

最上面的例子,把命名空间从原来的【namespace App\Test;】改为【namespace App;】,最后【use App\Test;】就可以了。
要么,把文件路径调整为【phalapi/src/app/Test/Test.php】。
好的,谢谢大大了

要回复文章请先登录注册