2010-09-10 23 views
11

आइए कहें कि मेरे पास एक सरणी है जिसे मैं एक मूल्य वस्तु में परिवर्तित करना चाहता हूं।PHP गतिशील वर्ग लोडिंग

/* 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; 

ठीक है, तो यह सब ठीक काम करता है

मेरे मूल्य वस्तु वर्ग इस प्रकार है। हालांकि, मैं वीओ को निर्दिष्ट करना चाहता हूं जिसे गतिशील रूप से बनाया जाना है, ताकि मेरे वीओ बनाने के लिए मेरे पास एक गतिशील कार्य हो।

कुछ की तरह:

$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; 
} 

मुझे पता है मैं एक स्विच बयान के साथ ऐसा कर सकते हैं (के माध्यम से पुनरावृत्ति सब मेरी VO के) ... लेकिन इसमें कोई शक नहीं है एक बहुत बहुत अधिक सुरुचिपूर्ण है समाधान। अगर मैं कई 'शामिल'

किसी भी मदद की बहुत सराहना करता हूं तो यह सुपरकोल भी होगा।

उत्तर

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 में ओओपी के साथ कैसा था, लेकिन यदि आप कन्स्ट्रक्टर के लिए __construct का उपयोग कर रहे हैं तो यह काम करना चाहिए)।

कई से बचने के लिए किसी भी वर्ग

function __autoload($className) 
{ 
    require_once 'myclasses/'.$className.'.php'; 
} 

तो पहली कॉल new UserVo का उपयोग कर फ़ाइल myclasses/UserVo.php शामिल करने के लिए इस समारोह को गति प्रदान करेगा से पहले जादू समारोह __autoload को परिभाषित भी शामिल है।

0

पहले, UserVO के लिए एक सरणी वस्तु के लिए डेटा का रूपांतरण है, ArrayObject

तो

class UserVO extends ArrayObject 
{ 
} 

आप factory method pattern और अपने कोड का उपयोग करने की कोशिश कर रहे सही प्रतीत हो रहा है के साथ किया जाना चाहिए, हालांकि आप लग रहे हैं एक परिणाम के रूप में $ परिणाम परिभाषित करने के लिए भूल गए हैं ($ परिणाम = सरणी())।

तुम भी इस तरह के रूप निर्माता तर्क पारित करने के लिए और साथ ही ReflectionClass उपयोग कर सकते हैं:

$rc = new ReflectionClass($vo); 
$rc->newInstanceArgs($data[$i]); 

"autoload" अपने UserVO वस्तु, आप spl_autoload_register समारोह एक php के साथ उपयोग करना चाहिए करने के लिए पथ शामिल करें।

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'=>'[email protected]'); 
$data[] = array('id'=>2,'email'=>'[email protected]'); 
$data[] = array('id'=>3,'email'=>'[email protected]'); 
$data[] = array('id'=>4,'email'=>'[email protected]'); 
$data[] = array('id'=>5,'email'=>'[email protected]'); 
$data[] = array('id'=>6,'email'=>'[email protected]'); 

$result = create_vo($data,'UserVO'); 

var_dump($result); 

?> 
1

ऐसा नहीं है कि include_once()'s and require_once()'s performance is pretty bad प्रकट होता है काम करता है।

मेरे सुझाव:

को मार डालो सभी "require_once" और "include_once" और एक autoloader पैदा करते हैं।इसे पंजीकृत करें implementation

+0

आपका ऑटो लोडर अभी भी उपयोग करता है या इसकी आवश्यकता होती है, यह आवश्यक होने पर केवल हर चीज को लोड नहीं करता है, इसलिए आपका तर्क सबसे मान्य नहीं है। जैसे ऑटोलोडर का उपयोग करना अधिक भार है। –

संबंधित मुद्दे