我知道这听起来有点奇怪,但是有可能创建一个超类或全局类,可以从任何页面/类调用而无需包含/使用吗?
我希望在我的网站上有一个活动跟踪器和一个自定义错误日志,用于记录用户的活动和错误,但我非常需要它们在每个页面和每个类上。而不是必须导入所有项目,你可以创建一个始终可用的项目吗?比如PHP的核心类? (mysql_ ,ftp _ ,include_ *等)
谢谢!
答案 0 :(得分:2)
如果您可以包含至少一个文件,则可以将自动加载器放入包含中,并让 为您处理所有加载。您可以详细了解spl_autoload_register
here。
从文档中,示例设置可以是:
function my_autoloader($class) {
include 'classes/' . $class . '.class.php';
}
spl_autoload_register('my_autoloader');
此代码将进入您的文件,包含在每个页面上。有了它,您将能够在不手动包含类文件的情况下执行以下操作:
$superClass = new SuperClass();
现在,这样做假设您有一个位于classes/SuperClass.class.php
的文件,实际上它确实包含class SuperClass {
声明(不是必需,但您会得到如果不是则会出错。
您始终可以更改自动装带器功能中定义的路径以及文件命名架构。此外,您可以使用多个不同的位置/逻辑或任何需要的设置来适合您的设置。
例如:
function adv_autoloader($class) {
if (file_exists('classes/' . $class . '.class.php') {
require('classes/' . $class . '.class.php');
} else if (file_exists('includes/' . $class . '.inc.php') {
require('includes/' . $class . '.inc.php');
} else {
// can't locate the class
throw new Exception('Class not found: ' . $class);
}
}
答案 1 :(得分:0)
不是没有深入研究源代码或添加模块(或使用马里奥提到的auto_prepend_file)。但是,您可以使用自动装带器在需要时自动包含类文件。这是我使用的代码(使用命名空间):
// Autoload any classes
spl_autoload_register(function ($class)
{
// Throw an exception if the file does not exist or cannot be included
if (!is_file($file = APPLICATION . ltrim(str_replace('\\', '/', $class), '/') . '.php') || !include $file)
{
throw new Exception(PAGE_NOT_FOUND);
}
}
);
所以,假设我有一个名为(使用命名空间)\Models\EmailAddressValidator
的类,我将其保存在/application/Models/EmailAddressValidator.php
中,当我尝试调用它时,自动加载器会自动包含该文件。