2011-11-20 42 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

这是为了访问类中的变量..但是我想访问来自不同控制器和模型的变量。就像催化剂框架中的催化剂对象 –