【问题标题】:Define a variable in one function and access it in another在一个函数中定义一个变量并在另一个函数中访问它
【发布时间】:2015-07-10 10:23:07
【问题描述】:

我正在使用 Drupal,在我的 .module 文件中,我有两个函数,它们被称为 hook_block_view 的“内容”,如下所示:

function modulename_block_view($block_name = '')

    {
        $block = array();
        global $form_st;

        switch($block_name){
            case 'first':
                $block['subject'] = t("files from ".$_SESSION['form_state1']['values']['appName']);
                $block['content'] = first_block_contents($block_name) ;
                return $block;
            break;

            case 'second':
                $block['subject'] = t("page view");
                $block['content'] = second_block_contents($block_name);

                return $block;
                break;
        }

所以在 'first_block_contents()' 函数中,定义了一个对象。我需要包含相同信息的相同对象,以便在“second_block_contents()”函数中访问。类似问题有很多答案,但我找不到这个特定的问题。

【问题讨论】:

    标签: php variables drupal scope


    【解决方案1】:

    如果是在同一个请求期间,您可以声明一个静态变量。 Drupal 7 多次使用这个。检查drupal_static函数的documentation

    static $drupal_static_fast;
    if (!isset($drupal_static_fast)) {
        $drupal_static_fast ['whatever'] = &drupal_static(__FUNCTION__);
    }
    $whatever = &$drupal_static_fast ['whatever'];
    
    switch($block_name){
        case 'first':
            $block['subject'] = t("files from ".$_SESSION['form_state1']['values']['appName']);
            $block['content'] = first_block_contents($block_name) ;
    
            // Set the static variable contents
            $whatever = "Your Value";
    
            return $block;
            break;
    
        case 'second':
            // Use the $whatever variable now
    
            $block['subject'] = t("page view");
            $block['content'] = second_block_contents($block_name);
    
            return $block;
            break;
        }
    

    作为替代方案,您可以将 Drupal 的缓存系统与 cache_getcache_set 一起使用。

    【讨论】:

      【解决方案2】:

      为了在函数内部可以访问,必须将变量声明为全局变量。示例:

      function first_block_contents() {
          global $aGlobalObject;
          $aGlobalObject = new StdClass();
          $aGlobalObject->val = 1;
      }
      
      function second_block_contents() {
          global $aGlobalObject;
          echo aGlobalObject->val; // will print "1"
      }
      

      注意函数first_block_contents()必须在second_block_contents()之前调用才能初始化变量。

      【讨论】:

      • 这是我一开始尝试的,得到一个“调用非对象上的成员函数”错误。在 second_block_contents() 函数中调用时变量为空。
      • 这听起来像是在 first_block_contents() 之前调用了 second_block_contents()。您的代码中没有任何内容决定创建块的顺序。
      猜你喜欢
      • 2012-03-18
      • 2022-12-06
      • 1970-01-01
      • 2012-07-31
      • 1970-01-01
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      相关资源
      最近更新 更多