扩充但不取代核心类别
这些是最简单且像任何其他你建立的类别一样运作; 就让它们扩充在全域命名空间的核心类别:
class MyConfig extends Config {}
确认你知道自己在做什幺,扩充核心的方法在相同名称下,不仅会被核心使用, 也会被你的应用程序使用,而这可能导致无法预期的行为。
这些是最简单且像任何其他你建立的类别一样运作; 就让它们扩充在全域命名空间的核心类别:
class MyConfig extends Config {}
如果你想要你的核心扩充,被核心和你的应用程序使用一样好, 你需要以相同名称但不在 "Fuel\Core" 命名空间下扩充它。以下是一个範例, 你建立在 "fuel/app/classes/lang.php" 的 Lang 类别:
class Lang extends Fuel\Core\Lang {}
但与核心类别同名的类别预设会被忽略,要让 Autoloader 承认你的取代, 你需要在应用程序的 bootstrap 档案注册它。搜寻以下几行:
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',
));
所有来自应用程序的类别可以被扩充。大部份来自套件的类别可以被扩充,但也有少数例外:
如果你已经在你的配置中启动分析器,你也不能从套件扩充这些类别:
你可以透过在 app/bootstrap.php 档案中手动载入你的套件来绕过这些限制, 透过在 Fuel::init() 呼叫前添加 Package::load('mypackagename'); 如果你这样做,你的套件只不能扩充:
Autoloader 类别是个特例,你只能一次性扩充它做为 Autoloader
及使用。 扩充后你必须在 app/bootstrap.php 档案里原本的 Fuel\Core\Autoloader
之后手动请求它。 别忘了移除别名核心类别到全域的那一行。