覆盖核心类

时间:2011-03-29 09:03:20

标签: php oop class override

不知道它是否可能是我想要的,但我正在开发一个需要自定义类来覆盖核心功能的应用程序,如果这些文件存在的话。

举个例子,这是我目前的文件结构(简化,没有'customer_slug')

  • 应用
      • User.php(类用户)
    • 自定义
      • User.php(类用户)

现在我想检查“custom / User.php”是否存在,并相应地包括并使用它。它应该扩展核心(抽象)用户类。

我的“条目”脚本目前看起来像这样:

<?php

function __autoload($class_name) {
    $dispatch = Dispatcher::getInstance();
    $dispatch->get($class_name);
}

class Dispatcher {

    private static $instance;
    private static $customer_slug = 'sony';

    private function __clone() {
        // Empty magic function to prevent cloning
    }

    private function __construct() {
        // Empty magic function to prevent initialization
    }

    public static function getInstance() 
    {
        if (!isset(self::$instance)) {
            $class = __CLASS__;
            self::$instance = new $class;
        }

        return self::$instance;
    }   

    public static function get($class) {
        // Autoload class
        $basepath = $class.'.php';

        // Include bas class
        include('core/'.$basepath);

        // Do we have custom functionality
        if (file_exists('custom/'.self::$customer_slug.'/'.$basepath)) {
            include('custom/'.self::$customer_slug.'/'.$basepath);
        } 
    }
}

$User = new User;

print_r($User);

?>

我试过摆弄命名空间,但似乎无法让它运转起来。我想继续说“$ user = new User;”。不知道我怎么称呼这个类,也许$ user = new $ custom_or_code_classname

所以我也对其他方法持开放态度。也许是一个钩子系统?

1 个答案:

答案 0 :(得分:2)

我们使用__autoload()实现了一个解决方案。基本上你有2个变量,一个用于“app”,一个用于“client”。然后在匹配的目录中构建类。 e.g。

classes/app1/User.php
classes/app2/User.php
classes/app1/client1/User.php

然后在autoload fxn中构建一系列可能的路径。假设app1,client1,array将是:

$paths = array('classes/app1/client1/User.php', 'classes/app1/User.php', 'classes/User.php');

然后遍历查找file_exists()并调用require_once()。

所有课程本身都应根据他们居住的地点命名:

class User__client1__app1 extends User__client1
class User__client1 extends User__base
class User__base

因此,这里棘手的部分实际上是将正确的名称别名到根名称(用户)。

在自动加载器中,找到合适的类后,执行:

eval("class User extends $found_class { }");