php替代eval_php – eval函数的替代方法是什么?

我最近回答了

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.不幸的是,文档中只有很少的例子,但反思是一个非常大的主题.基本上,在阅读它的工作原理后使用反射并不是什么大问题.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值