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

时间:2015-05-05 09:41:30

标签: php

我有3个文件,声明一个命名空间(简约示例):

<?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'
?>

不知怎的,我在foreach中得到了一个无效的参数异常。

我想知道GLOBAL声明的范围是什么 - 任何想法?

编辑:如何以更方便的方式访问函数get()中的变量?

2 个答案:

答案 0 :(得分:0)

global $base方法中使用Reader::get允许方法本身使用$base变量(在f1.php中声明),否则代码将产生未定义的变量通知和无效的参数foreach中的警告

答案 1 :(得分:0)

将变量推送到要访问的$GLOBALS数组中。只要确保,没有名字冲突。转换为对象会覆盖以前的内容,因此请确保优化此部分。我在两个地方使用了__NAMESPACE__,因为访问类是相同的。

<?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'
?>

更面向对象的方法:

<?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'
?>