96 lines
3.8 KiB
Markdown
96 lines
3.8 KiB
Markdown
# 类的加载
|
||
|
||
Kohana 需要使用 PHP 自身的[自动加载](http://php.net/manual/language.oop5.autoload.php)。这个消除了不用调用 [include](http://php.net/include) 和 [require](http://php.net/require) 之前就可以使用类文件。例如,让你想使用 [Cookie::set] 方法时,你只需要:
|
||
|
||
Cookie::set('mycookie', 'any string value');
|
||
|
||
或者要加载一个 [Encrypt] 的实例化,只需要调用 [Encrypt::instance]:
|
||
|
||
$encrypt = Encrypt::instance();
|
||
|
||
类也可以通过 [Kohana::auto_load] 方法加载,这使得从简单的类名称转换为文件名:
|
||
|
||
1. 类必须放置在[文件系统](start.filesystem)的 `classes/` 目录
|
||
2. 任何下划线字符转换为斜线
|
||
2. 文件名必须是小写的
|
||
|
||
当调用一个尚未加载类(比如,`Session_Cookie`),通过使用 [Kohana::find_file] 方法可以让 Kohana 搜索文件系统查找名为 `classes/session/cookie.php` 的文件。
|
||
|
||
## 自动加载器
|
||
|
||
在 `application/bootstrap.php` 配置文件默认使用 [spl_autoload_register](http://php.net/spl_autoload_register) 开启了自动加载器。
|
||
|
||
spl_autoload_register(array('Kohana', 'auto_load'));
|
||
|
||
在此类第一次使用的时候,这让 [Kohana::auto_load] 尝试去加载任意的不存在类。
|
||
|
||
# Transparent Class Extension {#class-extension}
|
||
|
||
The [cascading filesystem](about.filesystem) allows transparent class extension. For instance, the class [Cookie] is defined in `SYSPATH/classes/cookie.php` as:
|
||
|
||
class Cookie extends Kohana_Cookie {}
|
||
|
||
The default Kohana classes, and many extensions, use this definition so that almost all classes can be extended. You extend any class transparently, by defining your own class in `APPPATH/classes/cookie.php` to add your own methods.
|
||
|
||
[!!] You should **never** modify any of the files that are distributed with Kohana. Always make modifications to classes using extensions to prevent upgrade issues.
|
||
|
||
For instance, if you wanted to create method that sets encrypted cookies using the [Encrypt] class:
|
||
|
||
<?php defined('SYSPATH') or die('No direct script access.');
|
||
|
||
class Cookie extends Kohana_Cookie {
|
||
|
||
/**
|
||
* @var mixed default encryption instance
|
||
*/
|
||
public static $encryption = 'default';
|
||
|
||
/**
|
||
* Sets an encrypted cookie.
|
||
*
|
||
* @uses Cookie::set
|
||
* @uses Encrypt::encode
|
||
*/
|
||
public static function encrypt($name, $value, $expiration = NULL)
|
||
{
|
||
$value = Encrypt::instance(Cookie::$encrpytion)->encode((string) $value);
|
||
|
||
parent::set($name, $value, $expiration);
|
||
}
|
||
|
||
/**
|
||
* Gets an encrypted cookie.
|
||
*
|
||
* @uses Cookie::get
|
||
* @uses Encrypt::decode
|
||
*/
|
||
public static function decrypt($name, $default = NULL)
|
||
{
|
||
if ($value = parent::get($name, NULL))
|
||
{
|
||
$value = Encrypt::instance(Cookie::$encryption)->decode($value);
|
||
}
|
||
|
||
return isset($value) ? $value : $default;
|
||
}
|
||
|
||
} // End Cookie
|
||
|
||
Now calling `Cookie::encrypt('secret', $data)` will create an encrypted cookie which we can decrypt with `$data = Cookie::decrypt('secret')`.
|
||
|
||
## Multiple Levels of Extension {#multiple-extensions}
|
||
|
||
If you are extending a Kohana class in a module, you should maintain transparent extensions. Instead of making the [Cookie] extension extend Kohana, you can create `MODPATH/mymod/encrypted/cookie.php`:
|
||
|
||
class Encrypted_Cookie extends Kohana_Cookie {
|
||
|
||
// Use the same encrypt() and decrypt() methods as above
|
||
|
||
}
|
||
|
||
And create `MODPATH/mymod/cookie.php`:
|
||
|
||
class Cookie extends Encrypted_Cookie {}
|
||
|
||
This will still allow users to add their own extension to [Cookie] with your extensions intact. However, the next extension of [Cookie] will have to extend `Encrypted_Cookie` instead of `Kohana_Cookie`.
|