我知道这听起来可能有点奇怪,但是否可以创建一个超类或全局类,可以从任何页面/类调用而无需包含/使用?
我想在我的网站上有一个活动跟踪器和一个自定义错误日志,记录用户的活动和错误,但我在每个页面和每个班级都非常需要它们。您可以创建一个始终可用的项目,而不是必须导入所有项目吗?比如PHP的核心类?(mysql_ 、ftp_、include_* 等)
谢谢!
如果您可以至少包含一个文件,您可以将自动加载器放入包含中,并让它为您处理所有加载。spl_autoload_register
您可以在此处阅读更多详细信息。
从文档中,示例设置可能是:
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);
}
}
并非没有深入研究源代码或添加模块(或使用 mario 提到的 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
,当我尝试调用它时,自动加载器会自动包含该文件。