从外部文件加载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}但这不允许一个类动态扩展另一个类。动态意味着在运行时,这意味着如果在运行时进行扩展,最终将创建一个新类。我明白你的意思。这是远离eval()的一个原因。如果它可以使用include来完成,那么从概念上讲它就不会被动态扩展。实际上,PHP中的一切都是动态发生的。
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");