kus*_*tus 3 php oop dynamic object
我们可以在PHP中动态创建和初始化对象吗?这是正常的代码:
class MyClass{
var $var1 = null;
var $var2 = null;
.
.
public function __construct($args){
foreach($args as $key => $value)
$this->$key = $value;
}
}
---------------------
$args = ($_SERVER['REQUEST_METHOD'] == "POST") ? $_POST : $_REQUEST;
$obj = new MyClass($args);
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常.请注意,REQUEST参数的名称与MyClass类的成员准确对应.
但我们可以做这样的事情:
$class = "MyClass";
$obj = new $class;
Run Code Online (Sandbox Code Playgroud)
如果我们可以这样做,那么我们可以使用$ args初始化$ obj.
根据这篇文章,$ obj = $ class应该有效.但它对我不起作用.我试过get_class_vars($ obj).它引发了一个例外.
谢谢
这是一个评论,但我更加突出地留在这里:
$class = "MyClass";
$obj = new $class($args);
Run Code Online (Sandbox Code Playgroud)
这确实有效.见new文档.
您可以使用Reflection来使用参数实例化对象.
<?php
class Foo {
protected $_foo;
protected $_bar;
public function __construct($foo, $bar)
{
$this->_foo = $foo;
$this->_bar = $bar;
}
public function run()
{
echo $this->_foo . ' ' . $this->_bar . PHP_EOL;
}
}
$objectClass = 'Foo';
$args = array('Hello', 'World');
$objectReflection = new ReflectionClass($objectClass);
$object = $objectReflection->newInstanceArgs($args);
$object->run();
Run Code Online (Sandbox Code Playgroud)
请参阅php手册上的反思.
你必须重载一些其他魔术方法:
请查看此键盘以查看您的代码是否已重写以符合您的要求:
<?php
class MyClass{
var $properties = array();
public function __construct($args){
$this->properties = $args;
}
public function __get($name) {
echo "Getting '$name'\n";
if (array_key_exists($name, $this->properties)) {
return $this->properties[$name];
}
return null;
}
}
$args = array("key1" => "value1", "key2" => "value2");
$class = "MyClass";
$obj = new $class($args);
echo "key1:". $obj->key1;
?>
Run Code Online (Sandbox Code Playgroud)