从外部文件加载PHP类主体

时间:2011-06-24 04:29:14

标签: php include eval

我希望将外部文件包含为类主体,如下所示:

//$key is alphanumeric
$className='_Module_'.$key;
if(!class_exists($className))
{
    eval(' class '.$className.' extends ModuleContext');
    {
        ...include the file here...
    }
}
eval('$instance=new '.$className.'();');

这就是我想要的:

//$key is alphanumeric
$className='_Module_'.$key;
if(!class_exists($className))
{
    //There's got to be a better way to do this
    $contents=rtrim(ltrim(trim(file_get_contents($fileName.'.php',true)),'<?php'),'?>');
    //All on one line to preserve line numbering for errors
    eval(' class '.$className.' extends ModuleContext{ '.$contents.' }');
}
eval('$instance=new '.$className.'();');

我不喜欢使用eval来包含整个文件,因为它会生成令人困惑的错误消息:

PHP Fatal error:  Call to undefined function doFoo() in test/test.php(57) : eval()'d code on line 7

我在其他帖子中读过eval()代码没有利用php加速器。 此外,它需要一些修剪来删除'&lt;?php'和'?&gt;'标签,因为它们在类定义中不能很好地工作。

包含的文件需要对熟悉PHP但不是面向对象编程的人“友好” - 它将有一些预定义的函数由模块实现者填写。

有没有办法做到这一点,不使用eval作为包含?

2 个答案:

答案 0 :(得分:2)

如果我理解你的话,理想情况下你会扩展你的课程,而不是试图为你的班级评估一个机构:

class ClassA {
  public function greet( $msg ) {
    echo $msg;
  }
}

class ClassB extends ClassA {
  public function wave( $times ) {
    echo sprintf("Waves %s times!", $times);
  }
}

$instance = new ClassB();
$instance->greet("Hello World");
$instance->wave("five");

请注意我如何构建我的课程,为其“正文”添加新的功能和属性。

答案 1 :(得分:0)

非使用短开标签可能会出现问题吗?