从外部文件加载PHP类主体

从外部文件加载PHP类主体,php,include,eval,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))
{
    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()d代码没有利用php加速器。 此外,它还需要一些修剪来删除“”标记,因为它们在类定义中工作得不太好

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


有没有一种方法不使用eval进行包含?

如果我理解正确,理想情况下,您应该扩展您的类,而不是尝试为您的类评估特定的主体:

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");

请注意,我是如何在类的基础上进行构建的,在类的“主体”中添加了新的功能和属性。

不使用简短的开头标记可能会有问题?

@user492983这是正确的答案。不要动态创建类。不完全是这样。有两个问题:一,。从第二个文件加载类主体。我已经更改了项目要求,因此不再需要这样做。2.加载一个直到运行时才知道其名称的类。要加载的类扩展了一个已知的类。有没有不使用eval的方法来实例化它?我现在要做的是eval(“$instance=new”。$name.”(();)@user492983如果需要,可以将类声明拆分为多个文件。只需确保需要任何需要扩展的类。是的,但是类声明可以与其主体分离吗,即,类x扩展y{}-可以从第二个文件加载吗?@Jon这是一种非常非正统的方法,我想不出除了好奇之外的任何理由来采用它。你有充分的理由这样做吗?@user492983-首先,你不应该泄露代码(这很危险,以后很难阅读)。第二,为什么要动态创建类,这不是OOP的工作方式。第三,还有另一个问题,人们希望扩展“变量”类:但问题是为什么要动态创建类?我不确定这就是OOP的全部内容。我同意评估点。这就是为什么我在寻找另一个解决方案。显然,没有其他方法可以从第二个文件加载类主体,因此我已经更改了项目要求,允许将整个类放在一个文件中(这是我的首选)。这些类不是动态创建的,而是动态加载的。在这种情况下,要加载的类直到运行时才知道。@Jon-在这种情况下,
$unknown=new{$class}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");