2013-08-06 49 views
5

我不太清楚爲什麼會發生這種情況,或者如何正確地解釋它,但也許有人可以對此進行說明。變量爲空直到重新分配

我有一個基於CodeIgniter/Opencart框架利用註冊表,控制器和模塊的CMS系統。我遇到了,我以前保存的變量到註冊表的情景:

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

但由於某些原因,當我把它叫做中的應用:

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

但是..當我重新分配它:

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即可輕鬆解決此問題,但我很想知道爲什麼會發生這種情況?

UPDATE:

所以我用_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 
    } 
} 

希望這有助於? 有一個錯字,註冊表的功能不是神奇的方法。在應用程序中還聲明瞭$ registry。

+0

你是否100%確定你沒有在你的var名錯誤,而測試呢? – 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()方法: http://ideone.com/rJekJV

更改日誌:

  • 新增__isset()方法控制器類內部調用Registry::has()
  • 添加has()方法到註冊類。

  • [僅限測試:對象初始化和運行Application::index()方法。]

有一個問題(更新你的答案後):

  • 您還沒有宣佈$registry作爲應用類的成員變量。
    代碼,否則失敗,因爲它不訪問實際的成員變量(魔術__set()方法!)

  • 此外,您在代碼中有相當長的一段冗餘(未乾)。我希望這不是生產代碼;)

+0

對不起,我的文章中出現了一些錯字:__set&__get實際上已被設置並獲得。應用程序中還有$註冊表集。你建議擺脫註冊表中的「數據」變量,並使用__isset。這部分是從opencart框架中複製的 – Corey

+0

@Corey我已經更新了我的答案。如果你想擺脫'Registry :: $ data',你還想要保存註冊表數據嗎?我的建議是:使用'__get(),__set(),__isset()'或類似'get(),set(),has()'。 – ComFreek

+0

美麗!現在一切正常!謝謝你的幫助!!! – Corey