2024年PHP日本大会

Yaf_Loader 类

(Yaf >=1.0.0)

简介

Yaf_Loader 为Yaf引入了一个全面的自动加载解决方案。

第一次获取Yaf_Application的实例时,Yaf_Loader 将实例化一个单例,并使用spl_autoload注册自身。您可以使用Yaf_Loader::getInstance()获取实例。

Yaf_Loader 只尝试加载一次类,如果失败,则取决于yaf.use_spl_auload,如果此配置为开启,Yaf_Loader::autoload() 将返回false,从而为其他自动加载函数提供机会。如果它为关闭(默认情况下),Yaf_Loader::autoload() 将返回true,更重要的是,将触发一个非常有用的警告(非常有助于找出为什么无法加载类)。

注意:

除非某些库有自己的自动加载机制且无法重写,否则请保持yaf.use_spl_autoload为关闭。

默认情况下,Yaf_Loader 假设所有库(定义类的脚本)都存储在全局库目录中,该目录在php.ini(yaf.library)中定义。

如果您希望Yaf_Loader本地类目录(在application.ini中定义,默认情况下为application.directory . "/library")中搜索某些类(库),则应使用Yaf_Loader::registerLocalNameSpace()注册类前缀。

让我们看一些例子(假设APPLICATION_PATH是application.directory

示例 #1 配置示例

// Assuming the following configure in php.ini:
yaf.library = "/global_dir"

//Assuming the following configure in application.ini
application.library = APPLICATION_PATH "/library"
假设注册了以下本地命名空间

示例 #2 注册本地命名空间

<?php
class Bootstrap extends Yaf_Bootstrap_Abstract{
public function
_initLoader($dispatcher) {
Yaf_Loader::getInstance()->registerLocalNameSpace(array("Foo", "Bar"));
}
?>
然后是自动加载示例

示例 #3 加载类示例

class Foo_Bar_Test =>
  // APPLICATION_PATH/library/Foo/Bar/Test.php
  
class GLO_Name  =>
  // /global_dir/Glo/Name.php
 
class BarNon_Test
  // /global_dir/Barnon/Test.php

示例 #4 加载命名空间类示例

class \Foo\Bar\Dummy =>
   // APPLICATION_PATH/library/Foo/Bar/Dummy.php

class \FooBar\Bar\Dummy =>
   // /global_dir/FooBar/Bar/Dummy.php

您可能注意到所有文件夹的首字母都大写,您可以通过在php.ini中设置yaf.lowcase_path = On将其设置为小写。

Yaf_Loader 还设计用于加载MVC类,规则如下:

示例 #5 MVC类加载示例

Controller Classes =>
// APPLICATION_PATH/controllers/

Model Classes =>
// APPLICATION_PATH/models/

Plugin Classes =>
// APPLICATION_PATH/plugins/
Yaf通过识别类的后缀(这是默认设置,您也可以通过更改配置yaf.name_suffix将其更改为前缀)来确定它是否为MVC类。

示例 #6 MVC类区分

Controller Classes =>
    // ***Controller

Model Classes =>
    // ***Model

Plugin Classes =>
    // ***Plugin
一些例子

示例 #7 MVC加载示例

class IndexController
    // APPLICATION_PATH/controllers/Index.php

class DataModel =>
   // APPLICATION_PATH/models/Data.php

class DummyPlugin =>
  // APPLICATION_PATH/plugins/Dummy.php

class A_B_TestModel =>
  // APPLICATION_PATH/models/A/B/Test.php

注意:

从2.1.18版本开始,Yaf支持用户脚本端控制器自动加载(这意味着由用户PHP脚本触发的自动加载,例如:在Bootstrap或插件中访问控制器静态属性),但自动加载器只尝试在默认模块文件夹“APPLICATION_PATH/controllers/”下定位控制器类脚本。

此外,目录将受yaf.lowcase_path影响。

类概要

class Yaf_Loader {
/* 属性 */
protected $_local_ns;
protected $_library;
protected $_global_library;
static $_instance;
/* 方法 */
private __construct()
public autoload(): void
public static getInstance(): void
public getLibraryPath(bool $is_global = false): Yaf_Loader
public getNamespacePath(string $namespaces): string
public getNamespaces(): array
public static import(): void
public isLocalName(): void
public registerNamespace(string|array $namespaces, string $path = ?): bool
public setLibraryPath(string $directory, bool $is_global = false): Yaf_Loader
}

属性

_local_ns

_library

默认情况下,此值为 application.directory . "/library",您可以在 application.ini (application.library) 中更改此值,或者调用 Yaf_Loader::setLibraryPath()

_global_library

_instance

目录

添加笔记

用户贡献笔记

此页面没有用户贡献的笔记。
To Top