当前位置: 首页 > 文档资料 > FuelPHP 中文文档 >

擴充核心 - 一般

优质
小牛编辑
118浏览
2023-12-01

确认你知道自己在做什幺,扩充核心的方法在相同名称下,不仅会被核心使用, 也会被你的应用程序使用,而这可能导致无法预期的行为。

扩充但不取代核心类别

这些是最简单且像任何其他你建立的类别一样运作; 就让它们扩充在全域命名空间的核心类别:

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 之后手动请求它。 别忘了移除别名核心类别到全域的那一行。