我有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()
中的变量?
答案 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'
?>