क्या PHP में किसी वस्तु की संपत्ति को हटाना संभव है?


196

अगर मैं एक है stdObjectकहते हैं, $a

यकीन है कि एक नई संपत्ति आवंटित करने के लिए कोई समस्या नहीं है $a,

$a->new_property = $xyz;

लेकिन तब मैं इसे दूर करना चाहता हूं, इसलिए unsetयहां कोई मदद नहीं है।

इसलिए,

$a->new_property = null;

यह एक तरह का है। लेकिन क्या एक और 'सुरुचिपूर्ण' तरीका है?


क्या आप कोड को पोस्ट कर सकते हैं कि आपने कैसे परेशान होने की कोशिश की? मेरे लिहाज से अनसेट काम करना चाहिए। लेकिन संभवतः आप संदर्भ को दोहरा रहे हैं
अर्शदीप

वास्तव में यकीन नहीं है कि कैसे परेशान () अशक्त = से अधिक सुरुचिपूर्ण है, लेकिन हो सकता है कि मैं सिर्फ हूं
रॉबर्ट सिनक्लेयर

जवाबों:


353
unset($a->new_property);

यह ऐरे एलीमेंट्स, वेरिएबल्स और ऑब्जेक्ट विशेषताओं के लिए काम करता है।

उदाहरण:

$a = new stdClass();

$a->new_property = 'foo';
var_export($a);  // -> stdClass::__set_state(array('new_property' => 'foo'))

unset($a->new_property);
var_export($a);  // -> stdClass::__set_state(array())

10
nb एक पूर्णांक कुंजी वाली संपत्ति को सीधे अनसेट करना संभव नहीं है। उदाहरण के लिए $o=(object)array('a','b','c'); (आपको ऑब्जेक्ट (बैक) को एक सरणी में परिवर्तित करना है, यहाँ तक कि ऐसी संपत्तियों तक पहुँचने के लिए भी !)
danorton

4
@YanickRochon, मेरी टिप्पणी ए के बारे में है, ए objectनहीं array। ;-)
डानोर्टन

1
@danorton, कोई अपने सही दिमाग में, एक arrayको एक में objectक्यों परिवर्तित करेगा ? यह सिर्फ कोई मतलब नहीं है (भले ही PHP यह अनुमति देता है)। मैं इस पर टिप्पणी करके खराब प्रोग्रामिंग की आदतों का प्रसार और प्रसार नहीं करूंगा :) कोई अपराध नहीं।
यानिक रोचोन

8
@YanickRochon यह समझ सकता है कि क्या आप दो वस्तुओं के गुणों को मिलाना चाहते हैं (जिनके पास कोई तरीका नहीं है, वे सिर्फ भंडारण माध्यम के रूप में उपयोग किए जाते हैं): इस मामले में, सबसे तेज़ और सरल मार्ग दोनों ऑब्जेक्ट्स को सरणी में बदलने के लिए है array_replace_recursive () और बाद में वस्तुओं पर वापस। जैसे कि कोई व्यक्ति केवल संपत्तियों को संग्रहीत करने के लिए किसी ऑब्जेक्ट का उपयोग क्यों करेगा, यह अक्सर डेटाबेस से प्राप्त होने वाले अनुप्रयोगों में होता है जैसे कि MySQL एक सरणी के बजाय ऑब्जेक्ट के रूप में रिकॉर्ड करता है (मानक कार्यों जैसे mysql_fetch_object () का उपयोग करके)।
गाबोरस

1
@danorton FYI करें, 7.2 के बाद से आप कर सकते हैं unset($o->{0});या कर सकते हैं $k = 0; unset($o->$k);
सरके

43

यह भी विशेष रूप से काम करता है अगर आप एक वस्तु पर पाशन कर रहे हैं।

unset($object[$key])

अपडेट करें

PHP के नए संस्करणों में Fatal error: Cannot use object of type Object as array@CXJ द्वारा उल्लिखित घातक त्रुटि है । उस स्थिति में आप इसके बजाय कोष्ठक का उपयोग कर सकते हैं

unset($object{$key})

क्या आप निर्दिष्ट कर सकते हैं कि कौन से "नए" संस्करण वर्णित हैं? मेरे लिए, PHP 7.1 के साथ unset($object[$key])काम करता है और unset($object->{$key})अधिक सटीक नहीं है, unset($object['literal_key'])और unset($object->{'literal_key'}))। PS हम्म, मैं गलत हो सकता हूँ, हालाँकि, मैं जिस चीज का संपादन कर रहा हूँ, वह एक वस्तु है, न कि एक सरणी
याकोव्ल

वस्तुओं के संग्रह से एक संपत्ति को परेशान नहीं करता है।
विक्टर जोरास

1

यदि आप किसी ऑब्जेक्ट पर लूपिंग कर रहे हैं तो यह भी काम करता है।

unset($object->$key);

कोष्ठक का उपयोग करने की आवश्यकता नहीं है।


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