你能用PHP创建一个超级/全局类吗?

时间:2012-11-09 14:07:53

标签: php class global super

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

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

谢谢!

2 个答案:

答案 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中,当我尝试调用它时,自动加载器会自动包含该文件。