2015-05-20 5 views
5

कक्षा गुण प्राप्त करने और (array) कास्टिंग का उपयोग करके इसे परिवर्तित करने का एक तरीका है।क्या कोई सरणी क्लास गुणों में कनवर्ट करने का कोई तरीका है?

$user = (array) get_object_vars($userObject) 

लेकिन मुझे आश्चर्य है, मुझे सरणी को कक्षा गुणों में परिवर्तित करने के लिए कोई सीधी विधि नहीं मिली है।

class User 
{ 
    private $id = 0; 
    private $fname = ''; 
    private $lname = ''; 
    private $username = ''; 
} 

मैं सरणी निम्नलिखित है:

$user = array(
    'id'=> 2, 
    'fname' => 'FirstName', 
    'lname' => 'LastName', 
    'username' => 'UserName' 
); 

मैं एक प्रकार डाली रहा हूँ जैसे हम (object) है

मान लीजिए मैं निम्नलिखित कार्यान्वयन के साथ उपयोगकर्ता वर्ग की है। समस्या (object) टाइप कास्ट कनवर्ट्स सरणी stdClass ऑब्जेक्ट पर है, लेकिन यहां मैं चाहता हूं कि मेरी सरणी को मेरी निर्दिष्ट कक्षा में परिवर्तित किया जाए।

उदाहरण की तरह कहा जाना चाहिए: (।। मेरी धारणा, पीएचपी इस है चाहिए या यह पहले से ही इस तरह की कुछ बात हो सकती है और मैं नहीं जानता)

$userobj = (object User) $user; 

और इसके बाद के संस्करण वाक्य रचना का परिणाम चाहिए जैसे ही:

$userobj->id = $user['id']; 
$userobj->fname = $user['fname']; 
$userobj->lname = $user['lname']; 
$userobj->username = $user['username']; 

मैं जानना चाहता हूं कि मैपिंग का तर्क नहीं है या नहीं। भाषा स्तर की चाल खोज रहे हैं।

नोट: मुझे उपर्युक्त होने के लिए foreach के उपयोग से अवगत है। यदि PHP में उपलब्ध है तो मैं कुछ सीधी विधि ढूंढ रहा हूं लेकिन अभी तक फोकस नहीं कर सकता (हो सकता है!)।

मेरे सवाल का समाधान नहीं करता है के बाद: Convert/cast an stdClass object to another class

+3

वैसा करने के लिए अपने स्वयं के कस्टम विधि लिखने के लिए होगा। इसका कारण यह है कि ऑब्जेक्ट नहीं जानता कि विभिन्न गुणों या गुणों को कैसे प्रबंधित किया जाए जिन्हें परिभाषित नहीं किया गया है। कुछ ऑब्जेक्ट-> लोड ($ सरणी) की तरह कुछ। –

+0

संभावित डुप्लिकेट [एक PHP सरणी को कक्षा चर में कनवर्ट करना] (http://stackoverflow.com/questions/2715465/converting-a-php-array-to-class-variables) –

+0

संभावित डुप्लिकेट [कनवर्ट/stdClass कास्ट करें किसी अन्य वर्ग पर ऑब्जेक्ट] (http://stackoverflow.com/questions/3243900/convert-cast-an-stdclass-object-to-another-class) – Richard

उत्तर

0

एक सरणी एक वस्तु नहीं है। तो आप इसे एक भाषा निर्माण के साथ नहीं डाल सकते हैं। PHP में उपयोगकर्ता परिभाषित ऑब्जेक्ट्स कास्टिंग भी संभव नहीं है।

तो आपको अपना तर्क लिखना होगा। serialize() ऑब्जेक्ट द्वारा कुछ फैंसी दृष्टिकोण हैं, कक्षा का नाम बदलें और unserialize() फिर से प्रक्रिया को स्वचालित करने के लिए इसे बदलें।

इसके अलावा आप प्रतिबिंब का उपयोग करके एक कास्ट फ़ंक्शन लिख सकते हैं। लेकिन सब कुछ उपयोगकर्ता तर्क की जरूरत है।

इतने पर भी यह पोस्ट देखें: Type casting for user defined objects

तो अगर आप वास्तव में इस समारोह (see it in action) के साथ वस्तुओं मैं समाप्त हो गया कास्ट करना:

function cast($to, $obj) 
{ 
    $toLength = strlen($to); 
    $serializedObj = preg_replace('/^O:\\d+:"[^"]+"/', 'O:' . $toLength . ':"' . $to . '"', serialize($obj)); 

    $serializedObj = preg_replace_callback('/s:(\\d+):"([^"]+)";(.+?);/', function($m) use($to, $toLength) { 
     $propertyName = $m[2]; 
     $propertyLength = $m[1]; 

     if(strpos($m[2], "\0*\0") === false && ($pos = strrpos($m[2], "\0")) !== false) { 
      $propertyName = "\0" . $to . "\0" . substr($m[2], $pos + 1); 
      $propertyLength = ($m[1] + $toLength - $pos + 1); 
     } 

     return 's:' . $propertyLength . ':"' . $propertyName . '";' . $m[3] . ';'; 
    }, $serializedObj); 

    return unserialize($serializedObj); 
} 

$user = array(
    'id'=> 2, 
    'fname' => 'FirstName', 
    'lname' => 'LastName', 
    'username' => 'UserName' 
); 

$userObj = cast(User::class, (object)$user); 

print_r($userObj); 

लेकिन मैं कभी में इस सुविधा का उपयोग कभी नहीं होगा उत्पादन। यह सिर्फ एक प्रयोगात्मक बात है।

अद्यतन

ठीक है, मैं पुन: कल्पना कैसे कास्टिंग जावा में नियंत्रित किया जाता है। जावा में आप वास्तव में किसी ऑब्जेक्ट से इसे किसी ऑब्जेक्ट में डाल सकते हैं। आप किसी वस्तु से किसी अन्य वस्तु में नहीं डाले जा सकते हैं।

तो तुम जावा में ऐसा कर सकता है:

$apple = new Apple(); 
$macintoshApple = (MacintoshApple)$apple; 

यह देखते हुए कि MacintoshApple extends Apple

लेकिन आप की तरह दो असंबंधित वस्तुओं कास्ट नहीं कर सकते हैं:

$apple = new Apple(); 
$pear = (Pear)$apple; 
+0

बहुत अच्छा काम है, लेकिन यहां आपके उत्तर के साथ एक और सवाल है; 'foreach' तर्क के साथ प्रदर्शन तुलना के बारे में क्या? –

+0

मैं केवल अनुमान लगा सकता हूं लेकिन मेरे अनुभव से मैं कहूंगा कि न तो धारावाहिकता और न ही प्रतिबिंब दृष्टिकोण प्रदर्शन में foreach धड़कता है। – TiMESPLiNTER

+0

आप सही हैं, मैंने बस तुलना की है और पाया है कि 'foreach' विधि गति में लगभग दोगुनी है। –

0

आपकी प्रतिक्रिया @AbraCadaver द्वारा टिप्पणी करने के लिए मैं अपनी पसंद का एक instantiated वर्ग में डीबी परिणाम लोड करने के कुछ इस तरह का उपयोग करने में लगेगा के आधार पर:

// using MySQLi 
$mysqli_result = ...; // your mysqli_result object 
while($class_obj = $mysqli_result->fetch_object('your_class_name')) { 
    // do something 
} 

// using PDO 
$pdo_statement = ...; // your PDOStatement object 
while($class_obj = $pdo_statement->fetch_object('your_class_name')) { 
    // do something 
} 
+0

हैलो माइक, मेरी टिप्पणी कुछ प्राप्त करने के लिए है जैसे हमारे पास 'fetch_object' है लेकिन मैं डीबी से डेटा का उपयोग/उपयोग नहीं कर रहा हूं। मेरा उदाहरण यह अच्छी तरह से बताता है। :) –

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

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