2013-04-27 60 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,如果是,那么你做记录,否则你不这样做。