Littlest things

Yaf自动加载规则

Yaf Autoloader

我希望可以读完官方文档,再看这篇文章。

Yaf Autoloader官方文档
本文将对官方文档的概念进行简单的介绍,侧重点主要在于对官方文档的用例进行详细的说明,帮助你使用yaf 的自动加载器。

全局类与自身类(本地类)

  • 全局类:类库的路径是yaf.library在php.ini中配置的路径(默认值是null)。
  • 自身类:类库的路径是在yaf项目下conf/application.ini的application.library进行配置(默认值是application.directory + “/library”),通常是不需要修改的。

Example

可以通过分析得到,yaf的自动加载有如下几种情况。

  1. 没有类的函数库。
  2. 没有命名空间的类。
  3. 有命名空间的类;(是否自动导入的目录规则)

没有类的函数库

1
2
3
4
5
6
// application/library/helper.php
<?php
//不是class的类库,如函数库 就需要在bootstrap中手动加载
function helper(){
echo 'helper';
}

bootstrap.php中引入方式

1
2
3
4
5
6
7
public function _initLoader()
{
/**
* Yaf\Loader::import是根据路径引入
*/
Yaf\Loader::getInstance()->autoload('helper');
}

有类的函数库 无命名空间

1
2
3
4
5
6
7
8
9
// application/library/DB.php
<?php
//是class的类库,没有namespace yaf可以直接加载
class DB{
function __construct()
{
echo 'db';
}
}

这种方式Yaf自动导入

有类的函数库 有命名空间且按照命名空间对应目录的格式

1
2
3
4
5
6
7
8
9
10
<?php
// application/library/lib/a
namespace lib\a;
//按照正确的目录文件格式 yaf就可以自动加载类库
class Example{
function __construct()
{
echo 'db';
}
}

这种方式Yaf可以自动加载,无需设置Bootstrap.php

有类的函数库 有命名空间且不按照命名空间对应目录的格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// application/library/test.php
<?php
namespace T;
/**
* Class Test
* @package T
* 像这种有namespace 但是目录结构不对的class yaf是无法自动加载的,所以需要在bootstrap中手动加载
*/
class Test
{
function __construct()
{
echo 'test';
}
}

Bootstrap.php中设置

1
2
3
4
public function _initLoader()
{
Yaf\Loader::getInstance()->registerLocalNamespace(['T']);
}

导入composer的autoload.php

1
2
3
4
5
6
7
8
9
10
11
12
public function _initLoader()
{
/**
* Yaf\Loader::import是根据路径引入
* Yaf\Loader::getInstance()->autoload 在library目录下的的路径
* 没有namespace的DB在library根目录下默认引入
* namespace为lib\a 的路径一定要写对如class Haha
*/
Yaf\Loader::import(APPLICATION_PATH . "/vendor/autoload.php");
Yaf\Loader::getInstance()->autoload('helper');
Yaf\Loader::getInstance()->registerLocalNamespace(['T']);
}