2013-08-06 7 views
5

मुझे पूरा यकीन नहीं है कि यह क्यों हो रहा है, या इसे सही ढंग से कैसे समझाया जाए, लेकिन शायद कोई इस पर कुछ प्रकाश डाल सकता है।पुन: असाइन किए जाने तक परिवर्तनीय खाली

मेरे पास एक रजिस्ट्री, नियंत्रक और मॉड्यूल का उपयोग करने वाले कोडइग्निटर/ओपनकार्ट फ्रेमवर्क के आधार पर एक सीएमएस सिस्टम है। ..

echo empty($this->application_page)?'yes':'no'; 
//Returns Yes 

लेकिन जब मैं पुन: असाइन करें:

$this->application_page = 'current/page'; 

लेकिन किसी कारण जब मैं आवेदन में इसे कहते के लिए: मैं एक परिदृश्य में जहाँ मैं पहले के रूप में रजिस्ट्री करने के लिए एक चर बचाया है में चलाने की है यह:

echo empty($this->application_page)?'yes':'no'; 
//Returns Yes 

$page = $this->application_page; 
echo empty($page)?'yes':'no'; 
//Returns No 

एक var_dump रिटर्न:

var_dump($this->application_page); 
string 'current/page' (length=12) 

मैं $page का उपयोग कर इसे आसानी से प्राप्त कर सकता हूं लेकिन मुझे यह जानकर उत्सुकता है कि यह क्यों हो रहा है?

अद्यतन:

तो मैं _isset समारोह के साथ चारों ओर गड़बड़ लेकिन यह काम करने के लिए, संभवतः मेरी त्रुटि, संभवतः नहीं नहीं मिला .. यहाँ यह सब कैसे काम करता है:

class Registry { 
    private $data = array(); 
    public function get($key){ return (isset($this->data[$key]) ? $this->data[$key] : NULL); } 
    public function set($key,$val){ $this->data[$key] = $val; 
} 

abstract class Controller { 
    protected $registry; 
    public function __construct($registry){ $this->registry = $registry; } 
    public function __get($key){ return $this->registry->get($key); } 
    public function __set($key,$value){ $this->registry->set($key, $value); } 
} 

class Applications { 
    private $registry; 
    function __construct($Registry){ $this->registry = $Registry; } 
    function __get($key){ return $this->registry->get($key); } 
    function __set($key,$val){ return $this->registry->set($key,$val); } 
    public function buildApplication(){ 
     $this->application_page = 'current/page'; 
     $application = new application($this->registry); 
    } 

} 

class Application extends Controller { 
    public function index(){ 
    echo empty($this->application_page)?'yes':'no'; 
    //Returns Yes 

    $page = $this->application_page; 
    echo empty($page)?'yes':'no'; 
    //Returns No 
    } 
} 

उम्मीद है कि इससे मदद मिलती है? एक टाइपो था, रजिस्ट्री के कार्य जादू तरीके नहीं हैं। एप्लिकेशन में $ रजिस्ट्री भी घोषित की गई थी।

+0

क्या आप 100% सुनिश्चित हैं कि इसका परीक्षण करते समय आपके पास अलग-अलग नाम नहीं हैं? – NDM

+0

देरी के बारे में क्षमा करें! हां, मुझे यकीन है, मैंने पोस्ट करने से पहले लगभग 5 बार चेक किया है =) – Corey

+0

@Corey कृपया मेरा अपडेट किया गया जवाब देखें। – ComFreek

उत्तर

4

वर्ग शायद जादू __isset() विधि है जो दुर्गम गुणों पर isset() या empty() फोन करके शुरू हो रहा है को लागू नहीं किया।


उदाहरण:

Live demo I:

<?php 

class Test { 
    private $a = '42'; 

    public function __get($name) { 
     return $this->a; 
    } 
} 

$obj = new Test(); 
var_dump($obj->a);  // string(2) "42" 
var_dump(empty($obj->a)); // bool(true) 

इस प्रकार __isset() विधि को लागू करने (Live demo II) सही परिणाम निकलेगा:

public function __isset($name) { 
    if ($name == 'a') { 
     return true; 
    } 
    return false; 
} 

// ... 
var_dump($obj->a);  // string(2) "42" 
var_dump(empty($obj->a)); // bool(false) 


यहाँ एक नया है v __isset() तरीकों को लागू करने के लिए अपने कोड की ersion: http://ideone.com/rJekJV

बदलें लॉग:

  • जोड़ा गया __isset() विधि को नियंत्रक वर्ग जो आंतरिक रूप से Registry::has() कहता है।
  • has()विधि कक्षा के लिए विधि जोड़ा गया।

  • [केवल परीक्षण के लिए: ऑब्जेक्ट प्रारंभिकता और Application::index() विधि चलाना।]

वहाँ एक मुद्दा (अपने जवाब को अद्यतन करने के बाद) था:

  • आप आवेदन कक्षा में एक सदस्य चर के रूप में $registry घोषित नहीं किया है।
    क्योंकि यह वास्तविक सदस्य चर (जादू __set() विधि!) तक नहीं जाते

  • इसके अलावा, आप अपने कोड में काफी कुछ अतिरेक था कोड अन्यथा विफल रहता है (सूखी नहीं)। मुझे उम्मीद है कि यह उत्पादन कोड नहीं है;)

+0

क्षमा करें, मेरे पोस्ट में कुछ टाइपो थे: __set और __get वास्तव में सेट हो गए थे और प्राप्त हो गए थे। एप्लिकेशन में $ रजिस्ट्री सेट भी था। क्या आप रजिस्ट्री में "डेटा" चर से छुटकारा पाने और बस __isset का उपयोग करने की सलाह देते हैं। इस भाग को ओपनकार्ट फ्रेमवर्क – Corey

+0

@ कॉरी से कॉपी किया गया था, मैंने अपना जवाब अपडेट कर लिया है। यदि आप 'रजिस्ट्री :: $ डेटा' से छुटकारा पाना चाहते हैं, तो आप रजिस्ट्री डेटा को और कहां से सहेजना चाहते हैं? मेरी सिफारिश: या तो '__get(), __set(), __isset()' या 'get(), set(), जैसे कुछ() 'का उपयोग करें। – ComFreek

+0

सुंदर! यह सब अब काम करता है! आपकी मदद के लिए धन्यवाद!!! – Corey

संबंधित मुद्दे

 संबंधित मुद्दे