2013-08-06 11 views
5

kadar Boş Değişken. bu oluyor, ya da ne kadar düzgün anlatmaya ama belki birisi bu konuda bazı ışık tutabilir neden olduğunu tam olarak emin değilim yeniden

Ben CodeIgniter/Opencart Çerçeve bir Sicili, Kontrolör ve Modülü kullanan dışına göre CMS sistemi var. Ben yeniden atama zaman ..

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

Ama:

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

Ama uygulamada diyoruz nedense: Ben daha önce olduğu gibi kayıt defterine bir değişkeni kaydettiğiniz bir senaryo haline çalıştırmak o:

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

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

bir var_dump döner:

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

Sadece $page kullanarak kolayca bu sorunun üstesinden gelebilirsiniz ama bu neden oluyor merak ediyorum?

GÜNCELLEME: Hepsi birlikte nasıl çalıştığını yüzden _isset fonksiyonu ile etrafında haberci ama burada .. o muhtemelen benim hata işe muhtemelen değil alamadım

geçerli:

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 
    } 
} 

Bu yardımcı olur mu? Bir Yazım hatası vardı, Kayıt Defteri'nin işlevleri sihirli yöntemler değildir. Ayrıca Başvurularda $ kayıt defteri beyan edildi.

+0

% 100 Are); bu üretim kodu değil umut? – NDM

+0

Gecikme için özür dilerim! Evet eminim, gönderilmeden önce yaklaşık 5 kez çifte kontrol ettim =) – Corey

+0

@Corey Lütfen güncellenmiş cevabımı görün. – ComFreek

cevap

4

sınıf muhtemelen erişilemeyen özellikler isset() veya empty() arayarak tetiklenir sihirli __isset() yöntemini uygulamak vermedi.


Örnek:

Live demo I aşağıdaki gibidir:

<?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() yöntemi uygulamak (Live demo II) doğru sonucu verecektir: Burada


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) 
yeni, v __isset() yöntemleri uygulayan kodunuzun ürüm: http://ideone.com/rJekJV

Değişiklik günlüğü:

  • Eklendi __isset() yöntem için Kontrolör dahili Registry::has() çağırır sınıfı.
  • Eklendi Registy sınıfı. Nesne ilk kullanıma hazırlama ve Application::index() yöntem çalışan:

  • [Sadece test için

    .]

(cevabınızı güncellemeden sonra) bir sorun oluştu: Sen Uygulamalar sınıf bir üye değişkeni olarak $registry ilan etmedik

  • .
    o (sihirli __set() yöntem!) Gerçek üye değişkeni erişmez

  • Ayrıca kodunuzda oldukça uzun bir fazlalık vardı çünkü kod aksi başarısız (KURU değil). Bu test ederken emin size var adlarında bir yazım hatası yoktu

+0

Maalesef benim sonrası birkaç yazım hatası en vardı: __set & aslında set & olsun olsun edildi __get. Ayrıca Uygulamalarda $ kayıt defteri ayarlandı. Kayıt defterinde "data" değişkeninden kurtulmanızı ve sadece __isset'i kullanmanızı öneririz. Bu bölüm, – Corey

+0

@ Corey opencart çerçevesinden kopyalandı. Cevabımı güncelledim. Eğer kayıt defteri verilerini kaydetmek istediğiniz 'Kayıt Defteri :: $ data'dan kurtulmak istiyorsanız? Benim önerim: '__get(), __set(), __isset()' veya 'get(), set(), has()' gibi bir şey kullanın. – ComFreek

+0

Güzel! Her şey şimdi çalışıyor! Tüm yardımların için teşekkür ederim!!! – Corey

İlgili konular