2013-04-27 48 views
0

讓我們假設我想自動加載類,到目前爲止這是正常的。現在,讓我們假設我們處於「測試」環境。我想要加載其他類,而這些類與其他類一樣,但有一些修改。所以,最初就是自動加載爲「模擬」類在php

class A 
{ 
    public function method() 
    { 
     return rand(1,10); 
    } 

$a = new A(); // in the meantime autoloader finds and load class A 
$a->method(); 

什麼,我想:

class Adev 
{ 
    public function method() 
    { 
     something::log ('method running'); 
     return rand(1,10); 
    } 
} 

$a = new A(); // and then I dont need "A" class but "Adev" 
$a->method(); 

所以有點「重命名」方法應該是用來代替重構代碼。

+0

你最終可以做一些勾選功能來分析回溯? – bwoebi 2013-04-27 15:43:36

回答

2

使用get_declared_classeseval例如

$classes = get_declared_classes(); 
foreach ($classes as $class) 
    eval("\$".$class." = new ".$class."();"); 
+0

「Monkeyinsight」和「Denis」解決方案都非常好,我只是覺得這個更短。對不起,我不能接受兩個答案:S – user1929946 2013-04-27 16:00:48

+0

@ user1929946:編輯我的答案一下,用一個更短的修復/建議,而不必使用_evil_'eval'。請也閱讀我對此事的個人想法,因爲我真的覺得你遲早會遇到麻煩 – 2013-04-27 16:17:17

+0

@monkeyinsight我改變了這個答案,它實際上破壞了解決方案:'PHP Catchable致命錯誤:'實例化'關閉'不允許在PHP shell代碼中使用(2)'我已經刪除了eval並添加了備註以供將來使用。 – 2013-11-14 11:37:37

2

更新(和雜亂)
一對夫婦的解決您的問題可能的方式 - 可能是值得細看。最底層還有個人考慮/建議。

最短短期修復可能只是適用於您的情況:不是有PHP的自動加載尋找.php擴展,你可以設置它,這樣,測試代碼時,你其實找對dev.php結尾的文件,所以該類A,當作爲一個字符串傳遞autoloarder成爲Adev.php

if (RUNNING_ENV=== 'test') 
{ 
    spl_autoload_extensions('dev.php'); 
} 

不知道,但也許使用getenv()來確定,如果你對測試/開發或生產環境中運行,並基於該寄存器不同的自動加載器? spl_autoload_register是一個方便的功能:

function prodAutoload($class) 
{ 
    //normal loading 
} 
function tstAutoload($class) 
{ 
    $class .='Dev'; 
    //add Dev to className, proceed as you normally would? 
} 
if (getenv('RUN_ENV') === 'prod') 
{ 
    spl_autoload_register('prodAutoload'); 
} 
else 
{ 
    spl_autoload_register('tstAutoload'); 
} 

當然,會有多一點吧,不僅僅是這幾行。但是,使用這種方法,你不需要命名不同類:A將根據自動加載磁帶機/擴展裝載形式無論是開發或實況文件。
這樣,你至少可以保持類型暗示,沒有任何問題。當然,可維護性將更像是一場噩夢:編輯1個文件,確保也編輯另一個文件。

這就是爲什麼我必須說,就個人而言,我不會去通過這一切麻煩測試&現場環境中編寫不同的類。有一次,你會遇到麻煩......
假設你修正了測試中的錯誤,但未能編輯生產版本?或其他方式「圓......我認爲你是在建立一個體面的調試和測試環境,工作,相同的代碼,但(例如)而不是實際生產數據庫關花一點時間好。

相關鏈接:

1

你有沒有考慮一個簡單的解決方案,而不是一個複雜的問題?

使A類做ADev做的事情,即包括記錄功能,忘記重複所有的類。

使something :: class測試一個環境變量或一個簡單的配置變量。 所以something :: debug測試$ DO_I_WANT_DEBUGGING_ON = TRUE,如果是,那麼你做記錄,否則你不這樣做。