dongwei4096 2015-05-05 09:41
浏览 28
已采纳

什么是PHP中的函数GLOBAL的范围?

i have 3 Files, declaring a namespace (minimalistic example):

<?php //f1.php
  namespace Sheet;
  $base = [1,2,3];
?>

<?php // f2.php
  namespace Sheet;
  require_once('f1.php');
  var_dump($base);                                 // ----> array(1,2,3)
  class Reader {
    public static function get($pos) {
      GLOBAL $base;
      var_dump($base);                             // ---->  NULL
      foreach ($base as $idx => $val) {
        if ($pos == ($idx +1)) return $base[$idx];
      }
      return null;
    }
  }
?>

<?php //test.php
  namespace Test;
  require_once('f2.php');
  print \Sheet\Reader::get(1);   // expected:  '2'
?>

Somehow, i get an invalid argument exception in foreach.

I wonder whats the scope for the GLOBAL declaration is - any ideas?

edit: how can i access that variable within the function get() in a more convenient way?

  • 写回答

2条回答 默认 最新

  • douzhe3516 2015-05-05 10:40
    关注

    Push the variable into the $GLOBALS array to be accessed. Just make sure, there is no name clash. Casting to object overwrites previous stuff, so make sure, you optimise this part. I used __NAMESPACE__ in both places, since the accessing class is in the same.

    <?php //f1.php
      namespace Sheet;
      $base = [1,2,3];
    
      // globalise objectified var!
      $GLOBALS['NSvars'] = [__NAMESPACE__ => (object)['base' => $base]]; 
    ?>
    
    <?php // f2.php
      namespace Sheet;
      require_once('f1.php');
      var_dump($base);                                 // ----> array(1,2,3)
      class Reader {
        public static function get($pos) {
          GLOBAL $NSvars;
          $base = $NSvars[__NAMESPACE__]->base;        // use the global
          var_dump($base);                             // ---->  array(1,2,3)
          foreach ($base as $idx => $val) {
            if ($pos == ($idx +1)) return $base[$idx];
          }
          return null;
        }
      }
    ?>
    
    <?php //test.php
      namespace Test;
      require_once('f2.php');
      print \Sheet\Reader::get(1);   // expected:  '2'
    ?>
    

    a more object oriented approach:

    <?php //f1.php
      namespace Sheet;
      abstract class Defs {
        public static $base = [1,2,3];
      }
    ?>
    
    <?php // f2.php
      namespace Sheet;
      require_once('f1.php');
      class Reader {
        public static function get($pos) {
          foreach (Defs::$base as $idx => $val) {
            if ($pos == ($idx +1)) return Defs::$base[$idx];
          }
          return null;
        }
      }
    ?>
    
    <?php //test.php
      namespace Test;
      require_once('f2.php');
      print \Sheet\Reader::get(1);   // expected:  '2'
    ?>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示