2011-11-20 40 views
2

我在PHP中使用ZendFramework,我想設置並獲取變量作爲全局變量。 I.E.我將它設置在Zend Controller的類中,並在該類中進行任何操作。在PHP中設置和獲取全局變量(ZendFramework)

例如:

<?php 

class SubscriptionController extends Zend_Controller_Action 
{ 
    private $EMAIL = false; 
    private $USERNAME = false; 

首先我驗證電子郵件ADDRES與Ajax調用

public function checkusernameAction() 
    { 
     $email = //query to find email;  
     if($email){ 
     $EMAIL = true; 
     }else{ 
     $EMAIL = false; 
     } 
    } 

然後我想用AJAX調用再次訂閱用戶私有變量的基礎上

public function subscribeAction 
    { 
     if($EMAIL == true) 
     { 
     //some stuff 
     }   
    } 

我收到$ this-> EMAIL的私有變量,但無法訪問它

+0

除了非常有限的情況下,通常應該避免全局變量(太長進入評論......),相反,也許你應該回頭查看前端控制器以獲取數據(儘管不知道你的確切位置我可能會給你不好的建議。) – Corbin

+0

@Corbin ...我修改並簡要描述了我的問題。請檢查並幫助我 –

回答

6

您可以使用Zend_Registry在整個應用程序中使用該變量。

你可以設置一個變量這樣

Zend_Registry::set('email', $EMAIL); 

以後可以得到它這樣

$email= Zend_Registry::get('email'); 
+0

Thanx好友....這是不錯的選擇,但我面臨一個問題我。e我使用:: set('email'false)在init()中初始化註冊表,然後在使用ajax as :: set('email',true)調用的其他操作中再次聲明它,然後在第三個函數爲真或假,每次我都變得虛假。是否有其他選項可以執行相同的操作 –

+0

我不確定它是否會緩解您的生活,但您可以在註冊表中傳遞配置對象,該對象只處理配置選項的子集? –

+0

您提到的關於Zend_Registry的鏈接不起作用 –

0

像您這樣的兩個不同的請求調用,分別checkusernameAction()subscribeAction()在我看來。由於這些是不同的請求,您在checkusernameAction()期間在控制器中設置的電子郵件值將在第二次請求中失效,該請求調用subscribeAction()。這是相同的控制器,但您正在查看兩個不同的實例,每個請求中有一個。

在我看來,您可以:

  1. 傳遞在每個AJAX請求的電子郵件地址,但因爲你從第一次調用checkusernameAction()獲得的電子郵件地址,這似乎不太可能。

  2. 在第一次呼叫checkusernameAction()期間保存會話中的電子郵件,然後在第二次subscribeAction()呼叫期間接聽電話。

  3. 將「從用戶名中獲取電子郵件」代碼解壓縮到單獨的類或方法中,然後在兩個地方調用它。畢竟,你不想被一個「競爭條件」所困擾,在這種競爭條件下,系統狀態在兩個AJAX請求之間發生變化(也許用戶的電子郵件通過某個其他進程發生更改,或者通過另一個發生在包含呼叫checkusernameAction()第一AJAX請求。

0

也可以用於設置的函數,並得到一個值。

// Setter function 
public function setConsumerKey($key) 
{ 
    $this->_consumerKey = $key; 
    return $this; 
} 

// Getter function 

public function getConsumerKey() 
{ 
    return $this->_consumerKey; 
} 
+0

這是爲了訪問類中的變量..但是我想訪問來自不同控制器和模型的變量。就像催化劑框架中的催化劑對象 –