Jonob Posted September 10, 2010 Share Posted September 10, 2010 Lets say that I have an array that I want to convert to a value object My value object class is as follows: /* file UserVO.php*/ class UserVO { public $id; public $email; public function __construct($data) { $this->id = (int)$data['id']; $this->email = $data['email']; } } And I create my array of value objects as follows: /* file UserService.php*/ $array = array( array(...), array(...)); $count = count($array); for ($i = 0; $i < $count; $i++) { $result[] = new UserVO($array[$i]); } return $result; OK, so this all works fine. However, I'd like to specificy the VO that is to be created dynamically, so that I can have a single dynamic function to create my VO's. Something like: $ret = create_vo($array, 'UserVO'); function create_vo($data, $vo) { $count = count($data); for ($i = 0; $i < $count; $i++) { $result[] = new $vo($array[$i]); //this obviously wont work...Class name must be a valid object or a string } return $result; } I realise that I could do this with a switch statement (iterating through all my VO's)...but there is no doubt a much much more elegant solution. It would also be supercool if I could lazy load the VO's as needed, instead of having multiple 'includes' Any help much appreciated. Quote Link to comment https://forums.phpfreaks.com/topic/213069-flexible-class-loading/ Share on other sites More sharing options...
ignace Posted September 10, 2010 Share Posted September 10, 2010 You clearly misunderstood the use of Value Object's. A Value Object does not contain an identity. Value Object's are to keep your domain model simple while still being able to fully encapsulate your model (and not breaking the client contract in the future). Eric Evan defines a Value Object as: When you care only about the attributes of an element of the model, classify it as a Value Object. Make it express the meaning of the attributes it conveys and give it related functionality. Treat the Value Object as immutable. Don't give it any identity and avoid the design complexities necessary to maintain Entities. Quote Link to comment https://forums.phpfreaks.com/topic/213069-flexible-class-loading/#findComment-1109718 Share on other sites More sharing options...
AbraCadaver Posted September 10, 2010 Share Posted September 10, 2010 I'm not an OOP wizard so I'll leave that to ignace, but your code works fine for me except that: $result[] = new $vo($array[$i]); Should be: $result[] = new $vo($data[$i]); And I would foreach it as it's easier: function create_vo($data, $vo) { foreach($data as $arg) { $result[] = new $vo($arg); } return $result; } Quote Link to comment https://forums.phpfreaks.com/topic/213069-flexible-class-loading/#findComment-1109731 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.