# 介绍
## class
### 什么是class?
一个class只是一个普通的PHP类。除了命名约定(与Fuel中的所有其他类相同)以外,它不需要扩展任何内容或遵循任何约定。
```php
class Session
```
以上类的加载位置为 app / classes / session.php。
### 加载类
与其他框架不同,类不需要手动加载。当您在代码(控制器,模型等)中引用它们时,它们将被自动加载。
### 子目录中的类
与[Controllers](控制器.md)一样,类必须小写,首字母大写,而下划线会将类放入子目录。
```php
Class Session\_Driver
```
以上类的加载位置为 app / classes / session / driver.php。
### 类和命名空间
为了确定要加载的PHP文件,FuelPHP的自动加载器将使用下划线将名称空间和类名称完全相同。这意味着对于子目录中的类,您可以混合匹配名称空间和下划线以满足您的需求。
```php
// global namespace, fully underscored class name
class Core_System_Messages {}
// combine a namespace and underscores
namespace Core;
class System_Messages {}
// or fully namespaced
namespace Core\System;
class Messages {}
```
第一种方法是最常用且最容易理解的方法。如果以命名空间的方式去控制版本号,从而控制访问对应的类,将会非常方便。
## 初始化class
加载类后,可以让Fuel的自动加载器执行某些自动化任务,就像对`__construct()`类实例进行的操作一样。通过向`_init()`类添加公共静态方法来执行此操作。
``` php
class Example {
public static function _init()
{
// this is called upon loading the class
}
}
```
如果已加载的类具有自己的`_init()`方法,但是还需要调用父类的init方法,需要用`parent::_init();` 来加载父类的init方法。
# 扩展核心
## 扩展核心 class
**请参考原文文档阅读本段。如果你正在通过本文档了解该框架。建议你不要扩展核心class。**
**确保知道您在做什么,内核以及您的应用程序将使用同名的扩展内核方法,这可能会导致意外行为。**
* 扩展但不替代核心类
* 扩展并且替换核心类
* 利用包扩展核心
* 扩展限制
### 扩展但不替代核心类
这些是最简单的,并且可以像您创建的任何其他类一样工作。只需让它们扩展全局命名空间中的核心类即可:
~~~
class MyConfig extends Config {}
~~~
### 扩展并且替换核心类
如果您想让核心扩展以及自己的应用程序使用核心扩展,则需要以相同的名称进行扩展,但要从“ Fuel \ Core”命名空间中获取。以下是您在“ fuel / app / classes / lang.php”中创建的Lang类的示例:
~~~
class Lang extends Fuel\Core\Lang {}
~~~
但是默认情况下会忽略与核心类同名的类。为了使自动装带器能够识别您的替换产品,您需要在应用程序引导文件中注册它。搜索以下行:
~~~
Autoloader::add_classes(array(
// Add classes you want to override here
// Example: 'View' => APPPATH.'classes/view.php',
));
~~~
如注释中所述,您需要添加新的Lang类,如下所示:
~~~
Autoloader::add_classes(array(
// Add classes you want to override here
// Example: 'View' => APPPATH.'classes/view.php',
'Lang' => APPPATH.'classes/lang.php',
));
~~~
此后,核心类将被您的扩展替换。
> 与完整名称空间一起使用时,核心类仍然可用。通过上面扩展“ Lang”的示例,您仍然可以通过调用“ Fuel \\ Core \\ Lang”来使用原始版本。
### 利用包扩展核心
通过将软件包添加为核心命名空间,自动加载器将尝试从软件包中加载任何类,然后再从核心中尝试。但是,您必须在自动加载器中注册这些类才能检测到它们(文件系统自动加载器不支持全局别名)。下面是扩展View类的示例。
~~~
Autoloader::add_core_namespace('Example');
Autoloader::add_classes(array(
'Example\\View' => __DIR__.'/classes/view.php',
));
~~~
### 扩展限制
可以从应用程序扩展所有类。大多数类都可以从包中扩展,但有一些例外:
* Fuel
* Config
* Config_Php
* Config_File
* Config_Interface
* Finder
* Arr
* Input
* Security
* Event
* Event\_Instance
* 以及您在app/config/config.php 中使用的任何class
如果您在配置中激活了事件探查器,则无法从包扩展这些类:
* Cookie
* Session
* Session_Cookie(或其他会话驱动程序类,具体取决于您的会话配置)
* Session_Driver
* Date
* Profiler
您可以app/bootstrap.php通过Package::load('mypackagename');在Fuel::init()调用之前添加来手动将程序包加载到文件中,从而解决其中一些限制。如果这样做,则您的软件包只能扩展:
* Fuel
* Config
* Package
* Arr
* Finder
#### 自动装带器
Autoloader类是一种特殊情况,您只能将`Autoloader`扩展一次并使用。扩展它之后,你必须在 app/bootstrap.php 手动配置关于`Fuel\Core\Autoloader`的信息,不要忘记删除将核心类别名为 global 的行。