擴充核心类別

確認你知道自己在做什么,擴充核心的方法在相同名稱下,不僅会被核心使用, 也会被你的应用程序使用,而这可能導致無法預期的行为。

擴充但不取代核心类別

这些是最简单且像任何其他你建立的类別一樣運作; 就让它們擴充在全域命名空間的核心类別:

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',
));

擴充限制

所有來自应用程序的类別可以被擴充。大部份來自套件的类別可以被擴充,但也有少数例外:

  • Fuel
  • Config
  • Config_Php
  • Config_File
  • Config_Interface
  • Finder
  • Arr
  • Input
  • Security
  • Event
  • Event_Instance
  • 以及在你主要的 app/config/config.php 中使用的任何类別

如果你已经在你的配置中啟动分析器,你也不能從套件擴充这些类別:

  • Cookie
  • Session
  • Session_Cookie(或其他 session 驅动类別,根據你的 session 配置)
  • Session_Driver
  • Date
  • Profiler

你可以透過在 app/bootstrap.php 档案中手动載入你的套件來繞過这些限制, 透過在 Fuel::init() 呼叫前添加 Package::load('mypackagename'); 如果你这樣做,你的套件只不能擴充:

  • Fuel
  • Config
  • Package
  • Arr
  • Finder

自动載入器

Autoloader 类別是个特例,你只能一次性擴充它做为 Autoloader 及使用。 擴充後你必須在 app/bootstrap.php 档案裡原本的 Fuel\Core\Autoloader 之後手动請求它。 別忘了移除別名核心类別到全域的那一行。