擴充但不取代核心类別
这些是最简单且像任何其他你建立的类別一樣運作; 就让它們擴充在全域命名空間的核心类別:
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
之後手动請求它。
別忘了移除別名核心类別到全域的那一行。