मेरे पास एक सरणी है जिसका उपयोग मैं एक पेड़ के माध्यम से पथ को स्टोर करने के लिए एक ढेर के रूप में उपयोग कर रहा हूं। प्रत्येक तत्व पेड़ में एक नोड को इंगित करता है और मैं अंतिम तत्व को बंद करना चाहता हूं और उसके बाद उस तत्व द्वारा संदर्भित ऑब्जेक्ट को शून्य पर सेट करना चाहता हूं।क्या PHP में संदर्भ को हटाना संभव है?
मूल रूप से:
$node = array_pop($path);
*$node = null;
यह सोचते हैं कि पीएचपी से '*' के रूप में सी-ish भाषाओं करना ऑपरेटर था। अभी मैं माता पिता के नोड और याद जो बच्चे मैं ले लिया पर शुरू और फिर में अशक्त करने के लिए है कि सेटिंग के रूप में की बदसूरत समाधान है:
if($goLeft) {
$parent->left = null;
} else {
$parent->right = null;
}
मैं कहता हूँ यह बदसूरत है क्योंकि पथ युक्त सरणी एक द्वारा बनाई गई है मेरे पेड़ वर्ग में सार्वजनिक समारोह। मैं PHP में एक idiosyncrasy (सुविधा?) को संबोधित करने वाले कार्यान्वयन विवरण को उजागर किए बिना पेड़ के माध्यम से सीधे रास्ते में नोड्स पर काम करने की क्षमता का खुलासा करना चाहता हूं। एटीएम मुझे वापसी मूल्य में एक बूलियन शामिल करने की आवश्यकता है (इस मामले में $ goLeft) बस मैं संदर्भ को अस्वीकार करने में असमर्थता का काम कर सकता हूं।
यह दूसरी बार है जब मुझे इस समस्या का सामना करना पड़ा, इसलिए यदि कोई तरीका जानता है तो मैं कोड के पहले ब्लॉक के समान कुछ कर सकता हूं कृपया साझा करें!
(संपादित)
& की और सरणियों के कई क्रमपरिवर्तन के साथ प्रयोग करने के बाद, यह पता चला है कि बुनियादी समस्या यह है कि मैं एक त्रुटि मैं हो रही थी के लिए कारण गलत व्याख्या की थी।
मैं
$a = ($x > $y) ? &$foo[$bar] : $blah;
की कोशिश की और "सिंटैक्स त्रुटि, अप्रत्याशित '&'" मिला है। मैंने इसका अर्थ यह बताया कि समस्या - $foo[$bar]
पर ऑपरेटर का उपयोग कर रही थी। यह वास्तव में पता चला है कि दोषी है? -operator,
if($x > $y) {
$a = &$foo[$bar];
} else {
$a = null;
}
काम करता है बिल्कुल ठीक है। इस प्रकार मैं एक जंगली हंस पीछा चला गया जो किसी समस्या के लिए कामकाज की तलाश में था जो अस्तित्व में नहीं था। जब तक मैं & की श्रृंखला को तोड़ता नहीं हूं, तो PHP मैं जो चाहता हूं वह करता है, जो किसी चर द्वारा संदर्भित ऑब्जेक्ट पर संचालित होता है (चर स्वयं नहीं)। उदाहरण
$a1 = new SomeClass;
$a2 = &$a1;
$a3 = &$a2;
$a4 = &$a3;
$a4 = 42; // This actually sets $a1 to 42
var_dump($a1); // Emits 42
मुझे क्या गड़बड़ ऊपर है कि मैंने सोचा था कि वस्तुओं संदर्भ द्वारा आसपास पारित कर रहे हैं वैसे भी (यह गलत है), इसलिए मुझे नहीं लगता था & जरूरी हो गया था अगर अभिव्यक्ति एक वस्तु का संकल्प लिया है। मेरा मतलब है:
class A {
public $b;
}
class B {}
$a = new A;
$a->b = new B;
$c1 = $a->b;
$c2 = &$a->b;
$c1 = 42; // Merely assigns 42 to $c1
$c2 = 42; // Assigns 42 to $a->b
ऐसा लगता है कि इस सटीक मुद्दा http://www.php.net/manual/en/language.oop5.references.php में संबोधित किया जाता है। इच्छा है कि पहली बार मैंने इसे पढ़ा था!
मुझे यकीन नहीं है, यह वही है जो आप चाहते हैं, लेकिन आप 'unset ($ parent-> left) का उपयोग कर सकते हैं;' 'parent-> left = null;' – Leri
@PLB: मुझे लगता है कि आपका मतलब है ' अनसेट ',' अनलिंक 'नहीं। –
@ रॉकेट निश्चित रूप से, मैं करता हूं। बहुत थक गई हूं। – Leri