2011-03-29 53 views
2

沒有,如果有可能我想要的,但我工作的需要自定義類覆蓋了核心功能,如果存在這些文件的應用程序的想法。重寫核心類

因此,作爲一個例子,這是我的當前文件結構(簡化,而不 'customer_slug')

  • 應用
      • user.php的(類用戶)
    • 定製
      • user.php的(類用戶)

現在我要檢查,如果 「自定義/ 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;」。不知道我是怎麼回事調用類的,也許是$用戶=新的$ custom_or_code_classname

所以我開放給其他的辦法爲好。也許是一個鉤子系統?

+0

如何看起來你user.php的班? – Liutas 2011-03-29 09:19:03

+0

<?php namespace core; class用戶{ \t public function __construct(){ \t \t echo __FILE__; \t} } ?> – 2011-03-29 09:25:54

+0

已經給出了一個很好的答案,但你可能想看看Kohana如何處理它。他們稱之爲級聯文件系統,並且完全按照你的意願進行:http://kohanaframework.org/3.3/guide-api/Kohana#find_file – giorgio 2013-08-12 14:00:28

回答

2

我們實現了一個解決這個使用__autoload()。基本上你有2個變量,一個用於「應用程序」,另一個用於「客戶端」。然後你在匹配的目錄中構建你的類。例如

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

然後,在自動加載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 { }");