Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中全局函数的作用域是什么?_Php - Fatal编程技术网

PHP中全局函数的作用域是什么?

PHP中全局函数的作用域是什么?,php,Php,我有3个文件,声明了一个名称空间(最简单的示例): 不知怎的,我在foreach中得到了一个无效的参数异常 我想知道全球宣言的范围是什么——有什么想法吗 编辑:如何更方便地访问函数get()中的变量?在Reader::get方法中使用global$base,允许方法本身使用$base变量(在f1.php中声明),否则,代码将在foreach中生成一个未定义的变量通知和一个无效参数警告,并将变量推入要访问的$GLOBALS数组中。确保没有名字冲突。强制转换到对象会覆盖以前的内容,所以请确保优化

我有3个文件,声明了一个名称空间(最简单的示例):


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

我想知道全球宣言的范围是什么——有什么想法吗


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

Reader::get
方法中使用
global$base
,允许方法本身使用
$base
变量(在f1.php中声明),否则,代码将在foreach中生成一个未定义的变量通知和一个无效参数警告,并将变量推入要访问的
$GLOBALS
数组中。确保没有名字冲突。强制转换到对象会覆盖以前的内容,所以请确保优化此部分。我在这两个地方都使用了
\uuuuuu名称空间\uuuuu
,因为访问类位于同一个位置

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


@PedroLobito谁会想到它这么合乎逻辑呢?:)更好的表述:如何从同一名称空间中的函数中访问带名称空间的
$base
变量?应将其作为get方法
print\Sheet\Reader::get(1,\Sheet\$base)的参数传递似乎不起作用。。我如何在另一个名称空间中访问它?
<?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'
?>