假设我有一个要转换为值对象的数组。
我的值对象类如下:
/* file UserVO.php*/
class UserVO
{
public $id;
public $email;
public function __construct($data)
{
$this->id = (int)$data['id'];
$this->email = $data['email'];
}
}
然后我按如下方式创建我的值对象数组:
/* file UserService.php*/
$array = array(
array(...),
array(...));
$count = count($array);
for ($i = 0; $i < $count; $i++)
{
$result[] = new UserVO($array[$i]);
}
return $result;
好的,所以一切正常。但是,我想指定要动态创建的 VO,这样我就可以使用一个动态函数来创建我的 VO。
类似于:
$ret = create_vo($array, 'UserVO');
function create_vo($data, $vo)
{
$count = count($data);
for ($i = 0; $i < $count; $i++)
{
$result[] = new $vo($data[$i]); //this obviously wont work...Class name must be a valid object or a string
}
return $result;
}
我意识到我可以使用 switch 语句(遍历我所有的 VO)来做到这一点……但毫无疑问,这是一个更优雅的解决方案。如果我可以根据需要延迟加载 VO,而不是有多个“包含”,那也太酷了
非常感谢任何帮助。
最佳答案
$result[] = new $vo($data[$i]); //this obviously wont work...Class name must be a valid object or a string
你试过了吗?它按预期工作(在 php 5.1 中,我不知道它与 php 4 中的 OOP 有何关系,但如果您使用 __construct
作为构造函数,这应该可以工作)。
为了避免多次包含,在使用任何类之前定义魔法函数__autoload
function __autoload($className)
{
require_once 'myclasses/'.$className.'.php';
}
因此,首先调用 new UserVo
将触发此函数以包含文件 myclasses/UserVo.php。
关于PHP动态类加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3685902/