折腾大半天这个自动加载文件,才搞清楚,特别感谢peter
需求:
系统开发过程中,随着类文件不断增加,在文件中引用其他文件时,需要比较繁琐的不断include
或者require
,所以能不能搞一个自动引用的东西,当文件中需要调用其它文件中的类时,将所需文件自动加载进来;
实现代码:
autorequire.php
<?php
class autoLoad {
static function __autoload( $class ) {
$class = str_replace('\\', '/', $class);
$path = realpath(__DIR__.'/../../');
$file = $path.'/'.$class . '.php';
if ( is_file($file) ) {
require_once($file);
}
}
}
spl_autoload_register(['\autoLoad','__autoload'], true, true);
-
!!!@ 我们这个自定义方法有个要求就是:类名与文件名要保持一致;
-
该文件中尽量不要添加
namespace
,因为\autoLoad
意义是从根目录搜索文件,如果添加namespace
,\autoLoad
就要变为namespace\autoLoad
object_tree:
phpunit
|src
|____func
| |____api.php
| |____autorequire.php
|____suite
| |____allTestSuite.php
| |____aTestSuite.php
| |____test.xml
|____test
| |____a05Test.php
| |____a07Test.php
| |____a08Test.php
| |____a09Test.php
调用关系:
allTestSuite.php
调用a05Test.php
实现步骤:
1.在a05Test.php
声明namespace src\test
<?php
namespace src\test;
use src\func\Api;
class a05Test extends \PHPUnit_Framework_TestCase {
public function testa05(){
$url = "http://api.AAAA.com/index.php?r=er/l";
$response = Api::getApi_requests($url);
self::assertTrue(array_key_exists('succ', $response['body']));
}
}
2.在allTestSuite.php
中require_once __DIR__.'../func/autorequire.php';
<?php
namespace src\suite;
use src\test\a05Test;
use src\test\im1Test;
require_once __DIR__.'/../func/autorequire.php';
class allTestSuite extends \PHPUnit_Framework_TestSuite {
public static function suite(){
$suite = new allTestSuite();
$suite->addTestSuite(a05Test::class);
$suite->addTestSuite(im1Test::class);
$suite->addTestSuite(aTestSuite::class);
return $suite;
}
3.然后运行allTestSuite.php
成功
总结
- 自动加载方法需要类名称与文件名保持一致;
- 自动加载方法需要放在入口文件中;(可以看到在
a05Test.php
中并没有执行require 'api.php'
) - 一定要声明
namespace
即当前文件相对根目录的绝对路径 - spl_autoload_register()
- __autoload
@大晴天-2016-12-01 18:31:23