PHP में खाली वस्तु को कैसे परिभाषित करें


383

एक नए सरणी के साथ मैं यह करता हूं:

$aVal = array();

$aVal[key1][var1] = "something";
$aVal[key1][var2] = "something else";

क्या किसी वस्तु के लिए एक समान वाक्यविन्यास है

(object)$oVal = "";

$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";

13
$var = (object) (boolean) (string) (int) (array) new StdClass; तुम्हें पता है, सिर्फ सुरक्षित होने के लिए।
एक्सोनक्रॉस

1
गूगल के रूप में इस सवाल का शीर्षक द्वारा इंडेक्स किए: Arrays - How to define an empty object in PHP। सरणियों के साथ कुछ नहीं करना है
Kolob Canyon

जवाबों:


848
$x = new stdClass();

मैनुअल में एक टिप्पणी यह सबसे अच्छा है:

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

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


5
$ o = (वस्तु) शून्य; - यदि कोई वस्तु किसी वस्तु में परिवर्तित हो जाती है, तो उसे संशोधित नहीं किया जाता है। यदि किसी अन्य प्रकार का मान किसी ऑब्जेक्ट में कनवर्ट किया जाता है, तो अंतर्निहित क्लास में एक नया उदाहरण बनाया जाता है। यदि मान NULL था, तो नया उदाहरण रिक्त होगा। एरे, ऑब्जेक्ट्स द्वारा नामित गुणों और इसी मूल्यों के साथ एक ऑब्जेक्ट में परिवर्तित हो जाते हैं। किसी अन्य मान के लिए, स्केलर नाम के सदस्य चर में मान शामिल होगा।
DDS

11
मैं सिर्फ stdClassअपने सिर में "मानक वर्ग" के रूप में कहता हूं
sjagr

1
अगर आप भूल जाते हैं तो मेरे उत्तर का उपयोग करें :)
राफाशी

26
अगर आपको "नहीं मिला": new \stdClass(); PHP नेमस्पेस डॉस
2540625

3
@IvanCastellanos आपको समझा सकता है कि आप stdClass()शब्द से कैसे याद रख सकते हैं AIDS?
एडम

117

"खाली" ऑब्जेक्ट बनाने का मानक तरीका है:

$oVal = new stdClass();

लेकिन, PHP> = 5.4 के साथ, मैं व्यक्तिगत रूप से उपयोग करना पसंद करता हूं :

$oVal = (object)[];

यह छोटा है और मैं व्यक्तिगत रूप से इसे स्पष्ट मानता हूं क्योंकि stdClass नौसिखिया प्रोग्रामर को भ्रामक हो सकता है (यानी "मुझे एक वस्तु चाहिए, एक वर्ग नहीं!" ...)।

PHP <5.4 के साथ भी यही है:

$oVal = (object) array();

(object)[]के बराबर है new stdClass()

PHP मैनुअल ( यहाँ देखें ):

stdClass : ऑब्जेक्ट को टाइपकास्ट करके बनाया गया।

और ( यहाँ ):

यदि कोई वस्तु किसी वस्तु में परिवर्तित हो जाती है, तो उसे संशोधित नहीं किया जाता है। यदि किसी अन्य प्रकार का मान किसी ऑब्जेक्ट में कनवर्ट किया जाता है, तो अंतर्निहित क्लास में एक नया उदाहरण बनाया जाता है


हालाँकि याद रखें कि खाली ($ oVal) गलत है , जैसा कि @PaPP ने कहा:

बिना किसी गुण वाली वस्तुएँ अब खाली नहीं मानी जाती हैं।

अपने उदाहरण के बारे में, यदि आप लिखते हैं:

$oVal = new stdClass();
$oVal->key1->var1 = "something"; // PHP creates  a Warning here
$oVal->key1->var2 = "something else";

PHP निम्नलिखित वार्निंग बनाता है, जो कि स्पष्ट रूप से संपत्ति बनाता है key1(एक ऑब्जेक्ट ही)

चेतावनी: रिक्त मान से डिफ़ॉल्ट ऑब्जेक्ट बनाना

यह एक समस्या हो सकती है यदि आपका कॉन्फ़िगरेशन ( त्रुटि रिपोर्टिंग स्तर देखें ) ब्राउज़र को यह चेतावनी दिखाता है। यह एक और संपूर्ण विषय है, लेकिन चेतावनी को अनदेखा करने के लिए त्रुटि नियंत्रण ऑपरेटर (@) का उपयोग एक त्वरित और गंदा तरीका हो सकता है :

$oVal = new stdClass();
@$oVal->key1->var1 = "something"; // the warning is ignored thanks to @
$oVal->key1->var2 = "something else";

3
समस्या को ठीक करने के बजाय, आप एक नया निर्माण कर रहे हैं। जिस समस्या को ठीक करने की आवश्यकता है वह यह है कि लोगों को पता होना चाहिए कि क्या stdClassकरता है।
पैशियर

2
मैंने लिखा क्या stdClassकरता है। मैंने stdClassउस कोड का उपयोग किया जो प्रश्न का उत्तर देता है। मुझे खेद है, लेकिन मैं एक नई समस्या नहीं बना रहा हूं, यह मेरी निजी राय थी (जैसा कि मैंने लिखा)।
cgldiolo

6
"व्यक्तिगत वरीयता"! = "समस्या"
clogdiolo

4
@ स्पेसियर, मैं आपकी जिद नहीं समझता। सवाल था 'PHP में खाली वस्तु को कैसे परिभाषित करें'। मेरा उत्तर सही है और मैंने "नया stdClass ()" का उपयोग करने के लिए लिखा है। उपयोगकर्ता 'ed209' को प्रदान किया गया कोड सही है और मैंने "new stdClass ()" का उपयोग किया है। इसके अलावा, मैंने एक व्यक्तिगत राय जोड़ी और मैंने स्पष्ट रूप से "व्यक्तिगत" का उपयोग किया, यह स्पष्ट था कि जाने के लिए "मानक" तरीका नहीं था। मेरी विनम्र राय में एक समस्या जो इतनी टिप्पणियों की हकदार है, कम से कम एक गलत उत्तर होना चाहिए। इसके बजाय यदि आप एक व्यक्तिगत राय को एक समस्या मानते हैं, तो शायद यह विचारों के रचनात्मक बंटवारे के लिए एक समस्या है।
cgaldiolo

9
मुझे वास्तव में शॉर्टहैंड पसंद है(object) []
राहिल वज़ीर

35

मैं बताना चाहता हूं कि PHP में खाली वस्तु जैसी कोई चीज नहीं है:

$obj = new stdClass();
var_dump(empty($obj)); // bool(false)

लेकिन निश्चित रूप से $ obj खाली हो जाएगा।

दूसरी तरफ खाली एरे का मतलब दोनों मामलों में खाली है

$arr = array();
var_dump(empty($arr));

चैंज फंक्शन से उद्धरण खाली

बिना किसी गुण वाली वस्तुएँ अब खाली नहीं मानी जाती हैं।


मुझे खाली के लिए चैंज में वह बोली नहीं मिली।
powpow12

@ powpow12 यह वहां हुआ करता था । इसे 5.0.0 में बदला गया था।
स्टेनली उमेनोजी


14

मुझे पसंद है कि जावास्क्रिप्ट में गुमनाम प्रकार की वस्तुओं का निर्माण करना बहुत आसान है:

//JavaScript
var myObj = {
    foo: "Foo value",
    bar: "Bar value"
};
console.log(myObj.foo); //Output: Foo value

इसलिए मैं हमेशा PHP में इस तरह की वस्तुओं को लिखने की कोशिश करता हूं जैसे जावास्क्रिप्ट करता है :

//PHP >= 5.4
$myObj = (object) [
    "foo" => "Foo value",
    "bar" => "Bar value"
];

//PHP < 5.4
$myObj = (object) array(
    "foo" => "Foo value",
    "bar" => "Bar value"
);

echo $myObj->foo; //Output: Foo value

लेकिन जैसा कि यह मूल रूप से एक सरणी है, आप ऐसे काम नहीं कर सकते जैसे संपत्ति के लिए बेनामी कार्यों को असाइन करते हैं:

//JavaScript
var myObj = {
    foo: "Foo value",
    bar: function(greeting) {
        return greeting + " bar";
    }
};
console.log(myObj.bar("Hello")); //Output: Hello bar

//PHP >= 5.4
$myObj = (object) [
    "foo" => "Foo value",
    "bar" => function($greeting) {
        return $greeting . " bar";
    }
];
var_dump($myObj->bar("Hello")); //Throw 'undefined function' error
var_dump($myObj->bar); //Output: "object(Closure)"

ठीक है, आप यह कर सकते हैं, लेकिन IMO व्यावहारिक / स्वच्छ नहीं है:

$barFunc = $myObj->bar;
echo $barFunc("Hello"); //Output: Hello bar

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


1
यह स्वीकार किया जाना चाहिए जवाब
माइक एरोन

11

ज़ोम्बैट के जवाब के अलावा अगर आप भूल जाते हैं stdClass

   function object(){

        return new stdClass();

    }

अब आप कर सकते हैं:

$str='';
$array=array();
$object=object();

मैं इस तकनीक से प्यार करता हूं, हालांकि अधिकांश आईडीई "ऑब्जेक्ट" शब्द को एक फ़ंक्शन के रूप में उजागर नहीं करेंगे, जो अन्य प्रोग्रामर को भ्रमित कर सकता है। लेकिन हे, यह मेरे लिए काम करता है!
ब्रिक्सस्टर

7

आप उपयोग कर सकते हैं new stdClass()(जो अनुशंसित है):

$obj_a = new stdClass();
$obj_a->name = "John";
print_r($obj_a);

// outputs:
// stdClass Object ( [name] => John ) 

या आप किसी खाली सरणी को किसी ऐसी वस्तु में बदल सकते हैं जो कि निर्मित वर्ग में stdClass का नया खाली उदाहरण प्रस्तुत करती है:

$obj_b = (object) [];
$obj_b->name = "John";
print_r($obj_b);

// outputs: 
// stdClass Object ( [name] => John )  

या आप nullकिसी ऑब्जेक्ट के लिए मान को परिवर्तित कर सकते हैं जो निर्मित वर्ग में stdClass का एक नया खाली उदाहरण प्रस्तुत करता है:

$obj_c = (object) null;
$obj_c->name = "John";
print($obj_c);

// outputs:
// stdClass Object ( [name] => John ) 

5

इसी तरह के एक फैशन में डेटा तक पहुँचने के लिए आप एक ऐशोआरामिक सरणी के साथ बस {$ var} सिंटैक्स का उपयोग करते हैं।

$myObj = new stdClass;
$myObj->Prop1 = "Something";
$myObj->Prop2 = "Something else";

// then to acces it directly

echo $myObj->{'Prop1'};
echo $myObj->{'Prop2'};

// or what you may want

echo $myObj->{$myStringVar};

4

जैसा कि दूसरों ने बताया है, आप stdClass का उपयोग कर सकते हैं। हालाँकि मुझे लगता है कि यह बिना क्लीनर () है, जैसे:

$obj = new stdClass;

हालांकि प्रश्न के आधार पर, ऐसा लगता है कि आप वास्तव में क्या चाहते हैं, जो कि मक्खी पर किसी वस्तु में गुण जोड़ने में सक्षम हो। इसके लिए आपको stdClass का उपयोग करने की आवश्यकता नहीं है, हालाँकि आप कर सकते हैं। वास्तव में आप किसी भी वर्ग का उपयोग कर सकते हैं। बस किसी भी वर्ग का एक वस्तु उदाहरण बनाएं और गुण सेट करना शुरू करें। मुझे अपनी खुद की क्लास बनाना पसंद है जिसका नाम बस कुछ बुनियादी विस्तारित कार्यक्षमता के साथ ओ है जो मुझे इन मामलों में उपयोग करना पसंद है और अन्य वर्गों से विस्तार के लिए अच्छा है। मूल रूप से यह मेरा अपना आधार ऑब्जेक्ट क्लास है। मुझे ओ () नाम से एक फंक्शन भी करना पसंद है। इस तरह:

class o {
  // some custom shared magic, constructor, properties, or methods here
}

function o() {
  return new o;
}

यदि आपको अपना आधार ऑब्जेक्ट टाइप करना पसंद नहीं है, तो आप बस ओ () एक नया stdClass वापस कर सकते हैं। एक फायदा यह है कि ओ स्टैडक्लास की तुलना में याद रखना आसान है और कम है, भले ही आप इसे क्लास नाम, फ़ंक्शन नाम या दोनों के रूप में उपयोग करते हों। यहां तक ​​कि अगर आपके पास अपने ओ क्लास के अंदर कोई कोड नहीं है, तब भी अजीब से पूंजीकृत और नामित stdClass (जो 'यौन संचारित रोग वर्ग' के विचार को आमंत्रित कर सकता है) की तुलना में याद रखना आसान है। यदि आप ओ क्लास को कस्टमाइज़ करते हैं, तो आपको कंस्ट्रक्टर सिंटैक्स के बजाय ओ () फ़ंक्शन के लिए उपयोग मिल सकता है। यह एक सामान्य फ़ंक्शन है जो एक मान लौटाता है, जो एक कंस्ट्रक्टर की तुलना में कम सीमित है। उदाहरण के लिए, एक फ़ंक्शन नाम को एक फ़ंक्शन के लिए स्ट्रिंग के रूप में पारित किया जा सकता है जो एक कॉल करने योग्य पैरामीटर को स्वीकार करता है। एक फंक्शन चैनिंग का भी समर्थन करता है। तो आप कुछ ऐसा कर सकते हैं:

पूर्ण आंतरिक DSLs में लिखी जा रही शीर्ष परत के साथ अन्य भाषा परतों के निर्माण के लिए एक आधार "भाषा" के लिए यह एक शानदार शुरुआत है। यह विकास की लिस्प शैली के समान है, और PHP ज्यादातर लोगों को एहसास होने से बेहतर तरीके से इसका समर्थन करता है। मुझे एहसास है कि यह सवाल के लिए एक स्पर्शरेखा है, लेकिन सवाल यह है कि मुझे क्या लगता है कि यह पूरी तरह से PHP की शक्ति का उपयोग करने के लिए आधार है।


2
@ स्पेसियर का मतलब है आप कोष्ठकहीनता? ;) cis.upenn.edu/~matuszek/General/JavaSyntax/parentheses.html
still_dreaming_1

1
यह एक टाइपो है, यह कोष्ठकहीनता होनी चाहिए।
पचेरियर

@ स्पेसर अच्छी बात english.stackexchange.com/questions/130219/…
still_dreaming_1

4

यदि आप अपरिभाषित संपत्ति की चेतावनी प्राप्त किए बिना, गतिशील गुणों के साथ ऑब्जेक्ट (जैसे जावास्क्रिप्ट) बनाना चाहते हैं।

class stdClass {

public function __construct(array $arguments = array()) {
    if (!empty($arguments)) {
        foreach ($arguments as $property => $argument) {
            if(is_numeric($property)):
                $this->{$argument} = null;
            else:
                $this->{$property} = $argument;
            endif;
        }
    }
}

public function __call($method, $arguments) {
    $arguments = array_merge(array("stdObject" => $this), $arguments); // Note: method argument 0 will always referred to the main class ($this).
    if (isset($this->{$method}) && is_callable($this->{$method})) {
        return call_user_func_array($this->{$method}, $arguments);
    } else {
        throw new Exception("Fatal error: Call to undefined method stdObject::{$method}()");
    }
}

public function __get($name){
    if(property_exists($this, $name)):
        return $this->{$name};
    else:
        return $this->{$name} = null;
    endif;
}

public function __set($name, $value) {
    $this->{$name} = $value;
}

}

$obj1 = new stdClass(['property1','property2'=>'value']); //assign default property
echo $obj1->property1;//null
echo $obj1->property2;//value

$obj2 = new stdClass();//without properties set
echo $obj2->property1;//null


4

एक जेनेरिक ऑब्जेक्ट का उपयोग करें और इसके लिए मुख्य मूल्य जोड़े को मैप करें।

$oVal = new stdClass();
$oVal->key = $value

या किसी ऑब्जेक्ट में एक सरणी डाली

$aVal = array( 'key'=>'value' );
$oVal = (object) $aVal;

3

यदि आप ऐसा नहीं करना चाहते हैं:

$myObj = new stdClass();
$myObj->key_1 = 'Hello';
$myObj->key_2 = 'Dolly';

आप निम्न में से किसी एक का उपयोग कर सकते हैं:

PHP> = 5.4

$myObj = (object) [
    'key_1' => 'Hello',
    'key_3' => 'Dolly',
];

PHP <5.4

$myObj = (object) array(
    'key_1' => 'Hello',
    'key_3' => 'Dolly',
);

3

यहाँ एक उदाहरण पुनरावृत्ति के साथ:

<?php
$colors = (object)[];
$colors->red = "#F00";
$colors->slateblue = "#6A5ACD";
$colors->orange = "#FFA500";

foreach ($colors as $key => $value) : ?>
    <p style="background-color:<?= $value ?>">
        <?= $key ?> -> <?= $value ?>
    </p>
<?php endforeach; ?>

0

आपके पास यह खराब लेकिन उपयोगी टेक्निक है:

$var = json_decode(json_encode([]), FALSE);

0

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

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

<?php
// ways of creating stdClass instances
$x = new stdClass;
$y = (object) null;        // same as above
$z = (object) 'a';         // creates property 'scalar' = 'a'
$a = (object) array('property1' => 1, 'property2' => 'b');
?>

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

<?php
// CTest does not derive from stdClass
class CTest {
    public $property1;
}
$t = new CTest;
var_dump($t instanceof stdClass);            // false
var_dump(is_subclass_of($t, 'stdClass'));    // false
echo get_class($t) . "\n";                   // 'CTest'
echo get_parent_class($t) . "\n";            // false (no parent)
?>

आप अपने कोड में 'stdClass' नामक वर्ग को परिभाषित नहीं कर सकते। वह नाम सिस्टम द्वारा पहले से ही उपयोग किया गया है। आप 'ऑब्जेक्ट' नाम के एक वर्ग को परिभाषित कर सकते हैं।

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

(PHP 5.2.8 पर परीक्षण किया गया)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.