PHP में stdClass क्या है?


जवाबों:


785

stdClassPHP का सामान्य खाली वर्ग है, Objectजावा में या objectपाइथन की तरह है ( संपादित करें: लेकिन वास्तव में सार्वभौमिक आधार वर्ग के रूप में उपयोग नहीं किया जाता है; धन्यवाद @Ciaran इस ओर इशारा करते हुए )।

यह अनाम वस्तुओं, गतिशील गुणों आदि के लिए उपयोगी है।

StdClass पर विचार करने का एक आसान तरीका साहचर्य सरणी के विकल्प के रूप में है। नीचे दिए गए इस उदाहरण को देखें कि कैसे json_decode()एक StdClass उदाहरण या एक सहयोगी सरणी प्राप्त करने की अनुमति मिलती है। इसके अलावा, लेकिन इस उदाहरण में नहीं दिखाया गया है, SoapClient::__soapCallएक StdClass उदाहरण देता है।

<?php
//Example with StdClass
$json = '{ "foo": "bar", "number": 42 }';
$stdInstance = json_decode($json);
echo $stdInstance->foo . PHP_EOL; //"bar"
echo $stdInstance->number . PHP_EOL; //42
//Example with associative array
$array = json_decode($json, true);
echo $array['foo'] . PHP_EOL; //"bar"
echo $array['number'] . PHP_EOL; //42

अधिक उदाहरणों के लिए PHP और StdClass में गतिशील गुण देखें ।


7
शायद उसने mysql_fetch_object का उपयोग किया। अगर im गलत नहीं है तो stdlcass का एक उदाहरण बनाता है।
गैलन

69
यह जावा के ऑब्जेक्ट के तरीके में काफी आधार वर्ग नहीं है, नीचे मेरा उत्तर देखें।
सियारन मैकनीकलर

1
मुझे आशा है कि आप जानते हैं कि
पिथॉन

11
मुझे लगता है कि लोगों को यह कहना चाहिए कि stdClass जावास्क्रिप्ट के {}निर्माण की तरह है ।
पृथ्वी इंजन

महोदय, आपका उत्तर आंशिक रूप से गलत है क्योंकि लेख गलत है। एकमात्र (और यह गलत भी है) बात यह है कि इस वर्ग का विस्तार आपको यह संकेत देने का विकल्प देता है अर्थात वस्तु या वस्तु की function(StdClass $a, array $params)जाँच करना । $ainstanceof
देजन मार्जनोविक

1114

stdClassसिर्फ एक सामान्य 'खाली' वर्ग है जो वस्तुओं के अन्य प्रकारों को कास्टिंग करते समय उपयोग किया जाता है। अन्य दो जवाब क्या कहते हैं के बावजूद, stdClassहै नहीं PHP में वस्तुओं के लिए आधार वर्ग। यह काफी आसानी से प्रदर्शित किया जा सकता है:

class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N';
// outputs 'N'

मेरा मानना ​​है कि PHP में आधार ऑब्जेक्ट की अवधारणा नहीं है


4
std किस लिए खड़ा है?
एडम वेट

47
std = standard -
टॉमस प्राडो

1
यह एक उपयोगिता वर्ग है! Btw यह असली टिप्पणी है!
गुस्ताव

16
दरअसल, कोड स्निपेट के बाद पहला वाक्य प्रश्न का उत्तर देता है।
मगनराणा

2
@ मेरो मार्कार्वेंस: गतिशील विशेषताएँ PHP में किसी भी वर्ग को सौंपी जा सकती हैं, न कि केवल stdClass।
स्टेनी

95

stdClass एक और बेहतरीन PHP फीचर है। आप एक अनाम PHP वर्ग बना सकते हैं। एक उदाहरण की जाँच करें।

$page=new stdClass();
$page->name='Home';
$page->status=1;

अब सोचें कि आपके पास एक अन्य वर्ग है जो एक पृष्ठ ऑब्जेक्ट के साथ आरंभ करेगा और उस पर आधार निष्पादित करेगा।

<?php
class PageShow {

    public $currentpage;

    public function __construct($pageobj)
    {
        $this->currentpage = $pageobj;
    }

    public function show()
    {
        echo $this->currentpage->name;
        $state = ($this->currentpage->status == 1) ? 'Active' : 'Inactive';
        echo 'This is ' . $state . ' page';
    }
}

अब आपको Page Page के साथ एक नया PageShow ऑब्जेक्ट बनाना है।

यहां आपको इसके लिए एक नया क्लास टेम्प्लेट लिखने की आवश्यकता नहीं है आप बस मक्खी पर क्लास बनाने के लिए stdClass का उपयोग कर सकते हैं।

    $pageview=new PageShow($page);
    $pageview->show();

3
उपयोगी कार्यों के साथ एक खाली वर्ग जो पंक्तियों के साथ काम करता है, इसका एक बेहतर कोडिंग मानक भी है
बोरेल

1
यह सरणी का उपयोग करने के समान होगा। वास्तव में STDclass, सरणी रूपांतरण से ऑब्जेक्ट रूपांतरण जैसे टाइपिंग के समय उत्पन्न होता है।
वारुग

1
कृपया अपने कोड में एक टाइपो को ठीक करें: ($ यह-> वर्तमान पृष्ठ-> नाम == 1) होना चाहिए ($ यह-> वर्तमान पृष्ठ-> स्थिति == १)
Enriqe

7
"आप एक अनाम PHP वर्ग बना सकते हैं" - यह एक अनाम वर्ग नहीं है । आप instof, get_class का उपयोग कर सकते हैं ...
जॉन स्मिथ

2
यह उत्तर विशेष रूप से अब भ्रमित कर रहा है कि PHP में वास्तव में अनाम कक्षाएं हैं , जो बहुत अलग हैं stdClass
IMSoP

59

इसके अलावा ध्यान देने योग्य है, एक stdClassवस्तु के उपयोग से भी बनाया जा सकता है json_decode()


5
सच। मैं अक्सर json_encode और json_decode का उपयोग करके सरणी को ऑब्जेक्ट से सरणी में बदलने के लिए उपयोग करता हूं, जब आवश्यक हो।
पिंकल वंसिया

6
$ x = json_decode (json_encode ($ ऑब्जेक्ट), True) किसी सरणी में ऑब्जेक्ट को डिकोड करेगा, लेकिन यह बाइनरी सुरक्षित नहीं है। अनिवार्य रूप से अगर यह सादे नहीं है तो यह JSON में टूट सकता है।
सिमोंटप्लर

@simontemplar PHP में आपको लिखना नहीं चाहिए True। बूलियन लोअर केस हैं trueया false
BadHorsie

2
@simontemplar मैनुअल नहीं करता है, लेकिन PSR-2 करता है, इसलिए यदि आप किसी भी तरह के मानकों का पालन कर रहे हैं तो यह लोअर-केस में होना चाहिए। ज़रूर, अगर आप इसे इस तरह से लिखना चाहते हैं तो यह मान्य है लेकिन आपको मानकों का पालन करना चाहिए। बूलियंस के लिए मैनुअल प्रलेखन बहुत पुराना होगा, शायद मानकों के बनने से पहले लिखा गया था। आइए ईमानदार रहें, PHP को मूल रूप से बिना किसी मानकों के पूर्ण गड़बड़ी के रूप में लिखा गया था (चर / फ़ंक्शन / ऑब्जेक्ट नामकरण परंपराओं की विस्तृत श्रृंखला देखें)। मैंने ईमानदारी से कभी कोई PHP कोड नहीं देखा है जहाँ डेवलपर ने आपके प्रारूप का उपयोग किया है।
BadHorsie

2
मैं पीएसआर -2 का पालन करता हूं सिवाय ट्रू / फाल्स / नल को छोड़कर और कक्षाओं के लिए अपनी तर्ज पर ओपनिंग ब्रेसेस लगाने का। इसके अलावा, मैं सिर्फ परवाह नहीं है। यदि कभी किसी और के कोड को संपादित करना, हालांकि, मैं जो भी मानक (यदि कोई हो, आमतौर पर कोई भी नहीं) का उपयोग कर रहा हूं और विफल रहता हूं कि मैं PSR-2 को "सही" तरीके से करता हूं। वहाँ भगवान भयानक कोड के अन्य समस्याओं के टन के साथ वहाँ है कि तीन खोजशब्दों का पूंजीकरण मेरी चिंताओं का कम से कम है।
सिमोंटप्लर

26

StdClass का उपयोग करके आप अपने गुणों के साथ एक नई वस्तु बना सकते हैं। निम्नलिखित उदाहरण पर विचार करें जो उपयोगकर्ता के विवरण को एक सहयोगी सरणी के रूप में दर्शाता है।

$array_user = array();
$array_user["name"] = "smith john";
$array_user["username"] = "smith";
$array_user["id"] = "1002";
$array_user["email"] = "smith@nomail.com";

यदि आपको किसी वस्तु के गुणों के समान विवरण का प्रतिनिधित्व करने की आवश्यकता है, तो आप नीचे दिए अनुसार stdClass का उपयोग कर सकते हैं ।

$obj_user = new stdClass;
$obj_user->name = "smith john";
$obj_user->username = "smith";
$obj_user->id = "1002";
$obj_user->email = "smith@nomail.com";

यदि आप एक जूमला डेवलपर हैं तो आगे की समझ के लिए जूमला डॉक्स में इस उदाहरण को देखें ।


24

इसी तरह,

$myNewObj->setNewVar = 'newVal'; 

एक stdClass वस्तु पैदावार - ऑटो डाली

मुझे आज यह गलत वर्तनी से पता चला:

$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';

ठंडा!


9
लेकिन यह एक E_NOTICE
पेटा

3
@Petah केवल PHP 5.3+ में ही सही है? लेकिन हाँ यह सुनिश्चित करने के लिए बुरा अभ्यास है।
क्रिस्टोकिवी

15

stdClass एक अनाम वर्ग या अनाम ऑब्जेक्ट नहीं है

यहां उत्तर में ऐसे भाव शामिल हैं जो stdClassएक अनाम वर्ग या यहां तक ​​कि अनाम वस्तु है। यह सच नहीं है।

stdClassबस एक नियमित पूर्वनिर्धारित वर्ग है। आप instanceofऑपरेटर या फ़ंक्शन का उपयोग करके इसे देख सकते हैं get_class। यहां कुछ खास नहीं चला। PHP इस वर्ग का उपयोग तब करता है जब अन्य मानों को ऑब्जेक्ट में डालना।

कई मामलों में जहां stdClassप्रोग्रामर द्वारा उपयोग किया जाता है, सरणी बेहतर विकल्प है, क्योंकि उपयोगी कार्यों और इस तथ्य के कारण कि यह यूज़ेस डेटा संरचना का प्रतिनिधित्व करता है वास्तविक वस्तु नहीं है।


8

यह भी ध्यान देने योग्य है कि कास्टिंग का उपयोग करके आपको वास्तव में @Bandula द्वारा दिए गए उत्तर के रूप में एक ऑब्जेक्ट बनाने की आवश्यकता नहीं है। इसके बजाय आप बस अपने सरणी को किसी ऑब्जेक्ट में डाल सकते हैं और stdClass वापस आ जाते हैं। उदाहरण के लिए:

$array = array(
    'Property1'=>'hello',
    'Property2'=>'world',
    'Property3'=>'again',
);

$obj = (object) $array;
echo $obj->Property3;

Output: again


इसे प्यार करना। बहुत क्लीनर!
वेबसैनर

7

वास्तव में मैंने खाली stdClass बनाने की कोशिश की और गति की तुलना खाली वर्ग से की।

class emp{}

फिर 1000 stdClasses और emps बनाते हुए आगे बढ़े ... लगभग 1100 माइक्रोसेकंड में खाली कक्षाएं की गईं जबकि stdClasses ने 1700 से अधिक माइक्रोसेकंड ले लिए। इसलिए मैं डेटा स्टोर करने के लिए अपनी खुद की डमी क्लास बनाने के लिए इसका बेहतर अनुमान लगाता हूं अगर आप वस्तुओं को इतनी बुरी तरह से उपयोग करना चाहते हैं (लिखने और पढ़ने दोनों के लिए सरणियां बहुत तेज हैं)।


22
स्पष्ट रूप से अंतर नाम की लंबाई के अंतर के कारण होता है। यदि आप कक्षा को "averylongclassnamefornoapparentreason" कहते हैं, तो इसे बनाने में बहुत अधिक समय लगेगा। तो जाओ आंकड़ा।
ऋषि

27
हम्म् ... समय से पहले अनुकूलन। यदि मैं 600 माइक्रोसेकंड बचाने में समय बिताने के बजाय गति के साथ चिंतित हूं तो मैं जटिल एसक्यूएल प्रश्नों या अन्य नेटवर्क बाधाओं को ढूंढूंगा। वास्तव में, मैं पहले जाँच करूँगा कि यदि जावास्क्रिप्ट फ़ुटवियर पर है तो सिर पर देखभाल के बजाय यदि कोई 600 माइक्रोकैन्ड्स दूसरे की तुलना में तेज़ है।
आर्डी अराम

6
विश्वसनीय बेंचमार्क के लिए 1000 बहुत छोटा है। एक अरब कोशिश करो।
दक्षिणपूर्वी

1
PHP की दुनिया में सरणियों का उपयोग करना लगभग हमेशा बेहतर होता है।
वाहिद अमीरी

^ निश्चित रूप से ऐसा नहीं है। एक बड़े प्रोजेक्ट पर एक टीम में काम करने पर ऐरे नरक एक बुरा सपना है।
डेवी डेव

6

उपयोग में stdClass ऑब्जेक्ट

StdClass आपको अनाम कक्षाएं बनाने की अनुमति देता है और ऑब्जेक्ट कास्टिंग के साथ आप OOP शैली में एक सहयोगी सरणी की कुंजियों तक भी पहुंच सकते हैं। ठीक वैसे ही जैसे आप रेगुलर ऑब्जेक्ट प्रॉपर्टी को एक्सेस करेंगे।

उदाहरण

class Example {

  private $options;

  public function __construct(Array $setup)
  {
    // casting Array to stdClass object
    $this->options = (object) $setup;

    // access stdClass object in oop style - here transform data in OOP style using some custom method or something...
    echo $this->options->{'name'}; // ->{'key'}
    echo $this->options->surname;  // ->key
  }

}

$ob1 = new Example(["name" => "John", "surname" => "Doe"]);

गूंज उठेगी

जॉन डो


5

यदि आप किसी पुस्तक के बारे में कुछ डेटा रखने के लिए जल्दी से एक नया ऑब्जेक्ट बनाना चाहते हैं। आप ऐसा कुछ करेंगे:

$book = new stdClass;
$book->title = "Harry Potter and the Prisoner of Azkaban";
$book->author = "J. K. Rowling";
$book->publisher = "Arthur A. Levine Books";
$book->amazon_link = "http://www.amazon.com/dp/0439136369/";

कृपया अधिक जानकारी के लिए साइट - http://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array/ देखें।


4

कृपया ध्यान रखें कि 2 खाली stdClasses कड़ाई से बराबर नहीं हैं। नकली उम्मीदों को लिखते समय यह बहुत महत्वपूर्ण है।

php > $a = new stdClass();
php > $b = new stdClass();
php > var_dump($a === $b);
bool(false)
php > var_dump($a == $b);
bool(true)
php > var_dump($a);
object(stdClass)#1 (0) {
}
php > var_dump($b);
object(stdClass)#2 (0) {
}
php >

क्योंकि यह एक ही उदाहरण नहीं है, एर्गो एक दूसरे के बराबर नहीं हो सकता। उदाहरण की पहचान के साथ कक्षाओं की सख्त तुलना काम करती है। किसी भी वर्ग के प्रत्येक उदाहरण में विशिष्ट आईडी होती है।
बेदनिक

3

php.net मैनुअल की कुछ ठोस व्याख्या और उदाहरण हैं जो stdClass के उपयोगकर्ताओं द्वारा योगदान दिया गया है, मुझे विशेष रूप से यह एक http://php.net/manual/en/language.oop5.basic.php#92123 , https: // पसंद है। stackoverflow.com/a/1434375/2352773

stdClass डिफ़ॉल्ट PHP ऑब्जेक्ट है। stdClass का कोई गुण, विधियाँ या अभिभावक नहीं है। यह जादू के तरीकों का समर्थन नहीं करता है, और कोई इंटरफेस लागू नहीं करता है।

जब आप एक स्केलर या सरणी को ऑब्जेक्ट के रूप में रखते हैं, तो आपको stdClass का एक उदाहरण मिलता है। जब भी आपको जेनेरिक ऑब्जेक्ट इंस्टेंस की आवश्यकता हो आप stdClass का उपयोग कर सकते हैं।

stdClass एक बेस क्लास नहीं है! PHP कक्षाएं स्वचालित रूप से किसी भी वर्ग से विरासत में नहीं आती हैं। सभी कक्षाएं स्टैंडअलोन हैं, जब तक कि वे स्पष्ट रूप से किसी अन्य वर्ग का विस्तार नहीं करते हैं। PHP इस संबंध में कई ऑब्जेक्ट-ओरिएंटेड भाषाओं से अलग है।

आप एक वर्ग को परिभाषित कर सकते हैं जो stdClass का विस्तार करता है, लेकिन आपको कोई लाभ नहीं मिलेगा, क्योंकि stdClass कुछ भी नहीं करता है।


3

एक तरीका है जिसमें जब कुछ डेटा को किसी कक्षा में रखा जाना चाहिए, तो स्क्रिप्ट की व्याख्या करने से रोकना चाहिए, लेकिन दुर्भाग्य से यह वर्ग परिभाषित नहीं था

उदाहरण :

 return $statement->fetchAll(PDO::FETCH_CLASS  , 'Tasks');

यहां डेटा पूर्वनिर्धारित 'टास्क' में डाला जाएगा। लेकिन, अगर हमने कोड इस प्रकार किया है:

 return $statement->fetchAll(PDO::FETCH_CLASS );

फिर में परिणाम डाल देंगे

केवल वह कहता है: देखो, हमारे पास एक अच्छा किड्स है [ऑब्जेक्ट्स] यहाँ पर पेरेंट्स के बिना। इसलिए, हम उन्हें एक शिशु शिशु गृह भेजेंगे :)


2

आप objectअपनी पसंद के किसी ऑब्जेक्ट में एरेज़ डालने के लिए भी उपयोग कर सकते हैं :

Class Example
{
   public $name;
   public $age;
}

अब एक प्रकार की वस्तु बनाने के लिए Exampleऔर इसे शुरू करने के लिए आप इनमें से कोई भी कर सकते हैं:

$example = new Example();
$example->name = "some name";
$example->age = 22;

या

$example = new Example();
$example = (object) ['name' => "some name", 'age' => 22];

दूसरी विधि कई गुणों के साथ वस्तुओं को प्रारंभिक करने के लिए ज्यादातर उपयोगी है।


1

stClass स्वयं php द्वारा बनाया गया एक खाली वर्ग है, और इसका उपयोग केवल php द्वारा किया जाना चाहिए, क्योंकि यह सिर्फ एक "खाली" वर्ग नहीं है, php stdClass का उपयोग ऑब्जेक्ट शैली में सरणियों को बदलने के लिए करता है यदि आपको stdClass का उपयोग करने की आवश्यकता है, तो मैं दो बेहतर विकल्पों की सलाह देता हूं : 1- सरणियों का उपयोग करें (कक्षाओं की तुलना में बहुत तेजी से) 2- अपना खुद का खाली वर्ग बनाएं और इसका उपयोग करें

//example 1
$data=array('k1'=>'v1' , 'k2'=>'v2',....);

//example 2
//creating an empty class is faster than instances an stdClass
class data={}
$data=new data();
$data->k1='v1';
$data->k2='v2';

किसी को सरणी शैली के बजाय ऑब्जेक्ट शैली का उपयोग करने के बारे में सोचने के लिए क्या बनाता है ???


0

हमारे पास stdClass का कारण है क्योंकि PHP में एक सहयोगी सरणी से एक सामान्य सरणी को अलग करने का कोई तरीका नहीं है (जैसे जावास्क्रिप्ट में आपके पास {}ऑब्जेक्ट के लिए है और []सरणी के लिए उन्हें अलग करने के लिए है)।

तो यह खाली वस्तुओं के लिए एक समस्या पैदा करता है। उदाहरण के लिए इसे लें।

पीएचपी:

$a = [1, 2, 3]; // this is an array
$b = ['one' => 1, 'two' => 2]; // this is an associate array (aka hash)
$c = ['a' => $a, 'b' => $b]; // this is also an associate array (aka hash)

मान लेते हैं कि आप JSON को चर $ c को सांकेतिक शब्दों में बदलना चाहते हैं

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {one: 1, two: 2}}

अब मान लें कि आपने सभी कुंजियों को $bखाली करने से हटा दिया है। चूंकि $bअब खाली है (आपने सभी कुंजियों को याद रखा है?), ऐसा दिखता है कि []यदि आप इसे देखते हैं तो यह एक सरणी या वस्तु हो सकती है।

इसलिए यदि आप फिर से एक json_encode करते हैं, तो आउटपुट अलग होगा

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': []}

यह एक समस्या है क्योंकि हम जानते हैं bकि एक सहयोगी सरणी होना चाहिए था, लेकिन PHP (या json_encode जैसे किसी भी फ़ंक्शन) नहीं करता है।

तो stdClass बचाव के लिए आता है। फिर से उसी उदाहरण को लेते हुए

$a = [1, 2, 3]; // this is an array
$b = (object) ['one' => 1, 'two' => 2]; // this makes it an stdClass
$c = ['a' => $a, 'b' => $b]; // this is also an associate array (aka hash)

तो अब भले ही आप सभी कुंजियों को हटा दें $bऔर इसे खाली कर दें, क्योंकि यह एक stdClass है, इससे कोई फर्क नहीं पड़ेगा और जब आप इसे json_encode करेंगे तो आपको यह मिलेगा:

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {}}

यही कारण है कि क्यों json_encodeऔर json_decodeडिफ़ॉल्ट रिटर्न stdClass द्वारा।

 $c = json_decode('{"a": [1,2,3], "b": {}}', true); //true to deocde as array
 // $c is now ['a' => [1,2,3], 'b' => []] in PHP
 // if you json_encode($c) again your data is now corrupted
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.