PHP动态类加载

时间:2010-09-10 15:24:05

标签: php class

假设我有一个我想要转换为值对象的数组。

我的值对象类如下:

/* 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,而不是多个'包含'

,它也会是超级冷却

任何帮助都非常感激。

4 个答案:

答案 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);

?>