PHP में ऑब्जेक्ट को कैसे जोड़ें> = त्रुटि उत्पन्न किए बिना 5.3 सख्त मोड


82

यह सरल होना है, लेकिन मैं एक जवाब खोजने के लिए प्रतीत नहीं कर सकते हैं ....

मैं एक सामान्य stdClass वस्तु है $fooजिसमें कोई गुण नहीं है। मैं इसमें एक नई संपत्ति जोड़ना चाहता हूं $barजो पहले से परिभाषित नहीं है। अगर मैं ऐसा करता हूं:

$foo = new StdClass();
$foo->bar = '1234';

PHP सख्त मोड में शिकायत करती है।

पहले से तात्कालिक वस्तु में संपत्ति जोड़ने का उचित तरीका (वर्ग घोषणा के बाहर) क्या है?

नोट: मैं प्रकार stdClass के सामान्य PHP ऑब्जेक्ट के साथ काम करने के लिए समाधान चाहता हूं।

इस मुद्दे पर थोड़ी पृष्ठभूमि। मैं एक जॉगन स्ट्रिंग को डिकोड कर रहा हूं जो कि जौन वस्तुओं की एक सरणी है। json_decode()StdClass ऑब्जेक्ट की एक सरणी उत्पन्न करता है। मुझे इन वस्तुओं में हेरफेर करने और प्रत्येक में एक संपत्ति जोड़ने की आवश्यकता है।


TRUE2 के पैरामीटर के रूप में पास होने का प्रयास करें json_decode। यह आपको वस्तुओं की एक सरणी के बजाय एक सहयोगी सरणी देगा।
रॉकेट हज़मत

1
PHP सख्त मोड में उस बारे में शिकायत नहीं करता है। 3v4l.org/kn0hi
hakre

3
मुझे नहीं पता कि इसे बंद क्यों किया गया है क्योंकि यह पूरी तरह से वैध सवाल है। मेरे पास अभी एक समान प्रश्न है।
स्टीवन

जवाबों:


132

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

के बजाय:

$foo = new StdClass();
$foo->bar = '1234';

आप ऐसा करेंगे:

$foo = array('bar' => '1234');
$foo = (object)$foo;

या यदि आपके पास पहले से ही एक मौजूदा stdClass ऑब्जेक्ट था:

$foo = (array)$foo;
$foo['bar'] = '1234';
$foo = (object)$foo;

एक लाइनर के रूप में भी:

$foo = (object) array_merge( (array)$foo, array( 'bar' => '1234' ) );

1
एक जगह जब आपका सामना स्टडक्लास से होता है, जब आप जैसन को डिकोड करते हैं, जो कि बहुत आम है।
रे

1
@ मैं दुःख में अपना सिर हिला रहा हूँ कि मैंने इसका उल्लेख नहीं किया। =)
क्रेताटब

3
आपका समाधान काम करता है, लेकिन यह मेरे ओओ के दिल को चोट पहुँचाता है :) कुछ आकर्षक प्रतिबिंब कुंग फू या कुछ और की उम्मीद कर रहा था ... सवाल को थोड़ा लंबा रखने के लिए और कुछ ज्ञात पीएचपी जादू की उम्मीद करें।
रे

1
@ रे हेहे ... काश मैं तुम्हारे लिए कुछ और सुरुचिपूर्ण होता। संयोग से, स्पष्ट रूप से सेटिंग करने error_reporting(E_STRICT);पर PHP 5.3.15-1~dotdeb.0 with Suhosin-Patch, मुझे कोई त्रुटि या नोटिस नहीं मिलता है जब एक stdClass ऑब्जेक्ट पर एक गैर-मौजूद संपत्ति सेट करने का प्रयास किया जाता है। आप PHP के किस संस्करण का उपयोग कर रहे हैं?
कोंट्राब

हा, लगभग तीन साल बाद और मुझे किसी कारणवश कोई स्पष्टीकरण न मिलने के कारण मैं ड्राइव-बाय हो गया। धन्यवाद।
Crontab

112

इसको ऐसे करो:

$foo = new stdClass();
$foo->{"bar"} = '1234';

अब प्रयास करो:

echo $foo->bar; // should display 1234

2
आकर्षण के रूप में काम करता है। यह स्वीकृत समाधान होना चाहिए।
तारकिस

आप इस सिंटैक्स का उपयोग करके किसी ऑब्जेक्ट पर फ़ील्ड में कोई संपत्ति कैसे जोड़ सकते हैं?
बिग मनी

'गैर-वस्तु की संपत्ति सौंपने का प्रयास'
लारवेल

यहां तक ​​कि "बार" स्ट्रिंग एक चर में हो सकती है: $ foo -> {$ any_variable} = '1234';
सालार

यह निश्चित रूप से स्वीकृत उत्तर होना चाहिए, क्योंकि यह वस्तु संदर्भ को बरकरार रखता है (जो मेरे मामले में महत्वपूर्ण था)।
जोहान फ्रेड्रिक वर्न

11

यदि आप डीकोड किए गए JSON को संपादित करना चाहते हैं, तो इसे ऑब्जेक्ट की एक सरणी के बजाय एक सहयोगी सरणी के रूप में प्राप्त करने का प्रयास करें।

$data = json_decode($json, TRUE);

2

मैं हमेशा इस तरह से उपयोग करता हूं:

$foo = (object)null; //create an empty object
$foo->bar = "12345";

echo $foo->bar; //12345

1

आपको __Set और __get जादू विधियों का उपयोग करना चाहिए। सरल उदाहरण:

class Foo
{
    //This array stores your properties
private $content = array();

public function __set($key, $value)
{
            //Perform data validation here before inserting data
    $this->content[$key] = $value;
    return $this;
}

public function __get($value)
{       //You might want to check that the data exists here
    return $this->$content[$value];
}

}

बेशक, इस उदाहरण का इस रूप में उपयोग न करें: कोई सुरक्षा नहीं :)

संपादित करें: आपकी टिप्पणियों को देखा, यहाँ प्रतिबिंब और डेकोरेटर के आधार पर एक विकल्प हो सकता है:

 class Foo
 {
private $content = array();
private $stdInstance;

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

public function __set($key, $value)
{
    //Reflection for the stdClass object
    $ref = new ReflectionClass($this->stdInstance);
    //Fetch the props of the object

    $props = $ref->getProperties();

    if (in_array($key, $props)) {
        $this->stdInstance->$key = $value;
    } else {
        $this->content[$key] = $value;
    }
    return $this;
}

public function __get($value)
{
    //Search first your array as it is faster than using reflection
    if (array_key_exists($value, $this->content))
    {
        return $this->content[$value];
    } else {
        $ref = new ReflectionClass($this->stdInstance);

        //Fetch the props of the object
        $props = $ref->getProperties();

        if (in_array($value, $props)) {

        return $this->stdInstance->$value;
    } else {
        throw new \Exception('No prop in here...');
    }
}
 }
}

पुनश्च: मैंने अपने कोड का परीक्षण नहीं किया, बस सामान्य विचार ...


3
बेंजामिन, मैं PHP के जेनेरिक ऑब्जेक्ट क्लास: StdClass का उपयोग करना चाहता हूं। मैं इस वर्ग को संशोधित नहीं कर सकता।
रे

रे, मैंने आपकी आवश्यकता के अनुरूप समाधान के साथ अपना उत्तर अपडेट किया, लेकिन यह बहुत भारी है: - /
बेंजामिन डबॉइस

1

मुझे नहीं पता कि क्या इसका नया संस्करण php है, लेकिन यह काम करता है। मैं php 5.6 का उपयोग कर रहा हूँ

    <?php
    class Person
    {
       public $name;

       public function save()
       {
          print_r($this);
       }
    }

   $p = new Person;
   $p->name = "Ganga";
   $p->age = 23;

   $p->save();

यह परिणाम है। बचत विधि वास्तव में नई संपत्ति प्राप्त करती है

    Person Object
    (
       [name] => Ganga
       [age] => 23
    )

मैंने php संस्करणों में कोड के लिए कई परीक्षण चलाए और परिणाम दिखाता है कि यह केवल php 5 और इसके बाद के संस्करण के लिए काम करता है। php5 के नीचे कोई भी संस्करण एक त्रुटि फेंकता है।
बड़ा पेड़

-6

हां, PHP ऑब्जेक्ट में गुणों को गतिशील रूप से जोड़ना संभव है।

यह तब उपयोगी होता है जब जावास्क्रिप्ट से एक आंशिक वस्तु प्राप्त होती है।

JAVASCRIPT पक्ष:

var myObject = { name = "myName" };
$.ajax({ type: "POST", url: "index.php",
    data: myObject, dataType: "json",
    contentType: "application/json;charset=utf-8"
}).success(function(datareceived){
    if(datareceived.id >= 0 ) { /* the id property has dynamically added on server side via PHP */ }
});

PHP की ओर:

$requestString = file_get_contents('php://input');
$myObject = json_decode($requestString); // same object as was sent in the ajax call
$myObject->id = 30; // This will dynamicaly add the id property to the myObject object

या जावास्क्रिप्ट में एक डमी प्रॉपर्टी भेजें, जिसे आप PHP में भरेंगे।


मुझे लगता है कि JS से डमी प्रॉपर्टी भेजना और PHP की तरफ से भरना सबसे आसान होशियार समाधान है। धन्यवाद!
एड्रियन पी।

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