1

我知道这听起来可能有点奇怪,但是否可以创建一个超类或全局类,可以从任何页面/类调用而无需包含/使用?

我想在我的网站上有一个活动跟踪器和一个自定义错误日志,记录用户的活动和错误,但我在每个页面和每个班级都非常需要它们。您可以创建一个始终可用的项目,而不是必须导入所有项目吗?比如PHP的核心类?(mysql_ 、ftp_、include_* 等)

谢谢!

4

2 回答 2

2

如果您可以至少包含一个文件,您可以将自动加载器放入包含中,并让它为您处理所有加载。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);
    }
}
于 2012-11-09T14:18:11.153 回答
0

并非没有深入研究源代码或添加模块(或使用 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,当我尝试调用它时,自动加载器会自动包含该文件。

于 2012-11-09T14:17:47.987 回答