我想动态创建一个PHP对象,参数是可选的.
例如,而不是这样做:
$test = new Obj($param);
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情(创建新的ob是虚构的):
$test = create_new_obj('Obj', $param);
Run Code Online (Sandbox Code Playgroud)
php中有这样的功能吗?类似于call_user_func_array的东西,但代替对象.
小智 25
从PHP 5.6开始,您现在可以使用新的Argument Unpacking运算符(...)通过一行代码实现此目的.
这是一个简单的例子.
$className='Foo';
$args=['arg1','arg2','arg3'];
$newClassInstance=new $className(...$args);
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅PHP可变长度参数列表.
goa*_*oat 16
由于某些构造函数可能采用可变数量的参数,因此应使用以下方法来适应它.
$r = new ReflectionClass($strClassName);
$myInstance = $r->newInstanceArgs($arrayOfConstructorArgs);
Run Code Online (Sandbox Code Playgroud)
例如,如果你的Car构造函数采用了3个args
$carObj = new Car($color, $engine, $wheels);
Run Code Online (Sandbox Code Playgroud)
然后
$strClassName = 'Car';
$arrayOfConstructorArgs = array($color, $engine, $wheels);
$r = new ReflectionClass($strClassName);
$carObj = $r->newInstanceArgs($arrayOfConstructorArgs);
Run Code Online (Sandbox Code Playgroud)
http://php.net/manual/en/class.reflectionclass.php
http://php.net/manual/en/reflectionclass.newinstanceargs.php
小智 7
在这种情况下,我使用工厂方法.它们可以在抽象类中轻松定义:
class Foobar {
public function __construct($foo, $bar)
{
// do something
}
static public function factory($foo, $bar)
{
return new self($foo, $bar);
}
}
Run Code Online (Sandbox Code Playgroud)
有了它你可以使用call_user_func_array():
$my_foobar_obj = call_user_func_array('Foobar::factory', array($foo, $bar));
Run Code Online (Sandbox Code Playgroud)
只要知道类名,就可以动态创建对象:
$objName = 'myClass';
$test = new $objName($param);
Run Code Online (Sandbox Code Playgroud)
如果这是构造逻辑的要求,您可以轻松定义一个__construct()函数来获取默认参数.
[编辑注释]:这是一个称为变量变量的概念,手册中有一些引入新命令的例子.
| 归档时间: |
|
| 查看次数: |
20644 次 |
| 最近记录: |