我最近回答了
this question.
my answer的最后一部分完美地回答了这个问题,对于未来的读者来说比这里提供的答案更有用.这就是我回答自己问题的原因.
PHP具有在大多数情况下可以避免使用eval的功能:
> PHP是非常动态的语言.它有能力使用strings执行以下操作:
>定义和/或获取变量(从PHP 4.3支持).例如:
$variableName = 'MyVariable';
// Create new variable with the name defined in variable $variableName
${$variableName} = 'MyValue';
//Outputs: string(7) "MyValue"
var_dump($MyVariable);
//Outputs: string(7) "MyValue"
var_dump(${'MyVariable'});
Demo
>调用函数(PHP 4.3支持).例如:
// Create function with the name defined in variable $functionName
function MyFunction($argument) {
return 'Argument passed is: '.$argument;
}
$functionName = 'MyFunction';
// Outputs:
// string(48) "Argument passed is: Calling MyFunction directly."
var_dump(MyFunction('Calling MyFunction directly.'));
// Outputs:
// string(51) "Argument passed is: Calling MyFunction with string."
var_dump($functionName('Calling MyFunction with string.'));
Demo
>创建类的实例(从PHP 5.0支持).例如:
class MyClass {
public function __construct() {
echo 'Constructing MyClass'."\n";
}
}
$className = 'MyClass';
$objFromString = new $className();
// Outputs: object(MyClass)#1 (0) {}
var_dump($objFromString);
Demo
>调用静态方法(从PHP 5.0支持).例如:
class MyClass {
public static function staticMethod() {
return 'MyClass::staticMethod called';
}
}
$staticMethodName = 'staticMethod';
// Outputs: string(28) "MyClass::staticMethod called"
var_dump(MyClass::$staticMethodName());
而从PHP 5.3类名也可以用string定义.例:
class MyClass {
public static function staticMethod() {
return 'MyClass::staticMethod called';
}
}
$className = 'MyClass';
$staticMethodName = 'staticMethod';
var_dump($className::$staticMethodName());
var_dump($className::staticMethod());
Demo
>调用对象的实例方法(从PHP 5.0支持).例如:
class MyClass {
public function instanceMethod() {
return 'MyClass::instanceMethod called';
}
}
$methodName = 'instanceMethod';
$obj = new MyClass();
// Outputs: string(30) "MyClass::instanceMethod called"
var_dump($obj->$methodName());
Demo
>访问对象的静态和实例属性(从PHP 5.0支持).例如:
class MyClass {
public static $myStaticProperty;
public $myInstanceProperty;
}
$staticPropertyName = 'myStaticProperty';
$instancePropertyName = 'myInstanceProperty';
MyClass::${$staticPropertyName} = 'my static value';
$obj = new MyClass();
$obj->{$instancePropertyName} = 'my instance value';
var_dump(MyClass::${$staticPropertyName});
var_dump($obj->{$instancePropertyName});
> PHP有两个函数:call_user_func和call_user_func_array,用于动态函数/方法调用.两者都有完整的文档,所以我不会在这里详细介绍.
>即使上面的所有内容都不够,PHP 5也配备了很棒的Reflection API.不幸的是,文档中只有很少的例子,但反思是一个非常大的主题.基本上,在阅读它的工作原理后使用反射并不是什么大问题.