假设我有一个我想要转换为值对象的数组。
我的值对象类如下:
/* 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,而不是多个'包含'
,它也会是超级冷却任何帮助都非常感激。
答案 0 :(得分:13)
$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 。
答案 1 :(得分:1)
似乎是include_once()'s and require_once()'s performance is pretty bad。
我的建议:
杀死所有“require_once”和“include_once”并创建自动加载器。注册此implementation
答案 2 :(得分:0)
首先,应使用ArrayObject
将数据转换为UserVO的数组对象所以
class UserVO extends ArrayObject
{
}
您正在尝试使用factory method pattern并且您的代码似乎是正确的,尽管您似乎忘记将$ result定义为数组($ result = array())。
您还可以使用ReflectionClass传递构造函数参数以及:
$rc = new ReflectionClass($vo);
$rc->newInstanceArgs($data[$i]);
要“自动加载”您的UserVO对象,您应该使用带有php include路径的spl_autoload_register函数。
答案 3 :(得分:0)
这有效
<?
class UserVO
{
public $id;
public $email;
public function loadData($data)
{
$this->id = (int)$data['id'];
$this->email = $data['email'];
}
}
function create_vo($data, $vo)
{
$count = count($data);
for ($i = 0; $i < $count; $i++)
{
$tmpObject = new $vo;
$tmpObject->loadData($data[$i]);
$result[] = $tmpObject;
unset($tmpObject);
}
return $result;
}
$data = array();
$data[] = array('id'=>1,'email'=>'data@example.com');
$data[] = array('id'=>2,'email'=>'data@example.com');
$data[] = array('id'=>3,'email'=>'data@example.com');
$data[] = array('id'=>4,'email'=>'data@example.com');
$data[] = array('id'=>5,'email'=>'data@example.com');
$data[] = array('id'=>6,'email'=>'data@example.com');
$result = create_vo($data,'UserVO');
var_dump($result);
?>