php中可变变量名使用的作用域问题

可变变量名指的是使用一个变量的值作为这个变量的名称

使用中例子如下

$a=array('fantasy','android');
$b='a';
print_r($$b);

但是在函数跟类中使用的话要注意作用域:

$a=array('fantasy','android');
test();
function test()
{
	$b='a';
	print_r($$b);
}

这里会出现Notic:

Notice: Undefined variable: a in

也就是说 函数体外部声明的变量$a是全局变量

函数内部的$$b 其实是函数作用内部的变量 $a 函数内部没变量$a 报错如上,若我们将代码修改如下:

$a=array('fantasy','android');
test();
function test()
{
	$a = 'inner var';
	$b='a';
	print_r($$b);
}

输出结果是 : inner var ;由此证明了设想中的变量作用域问题

若想在函数里面访问全局变量需要这样:

$a=array('fantasy','android');
test();
function test()
{
	$b='a';
	global $$b;
	print_r($$b);
}

输出结果是 全局变量 $a

Array ( [0] => fantasy [1] => android )

在class中若要是用这种方式访问全局变量也是这样的方法,如果是想访问class内部的属性则不需要这样,如下:

$t = new test;
class test
{
	public $a=array('fantasy','android');
	public function test()
	{
		$b='a';
		print_r($this->$b);
	}
}

打印结果:

Array ( [0] => fantasy [1] => android )

由此,类的一个特性是,属性是可以被各种方法使用的,并且不用传递参数给方法,在类范围内全局可用


整个问题归结出来就是变量在函数 类中的作用域问题


---------------update @2014-12-16------------------

值得注意的是,当我们在局部 通过可变变量名的方式访问全局变量的时候 是 访问的这个变量的引用

// 全局变量
$a = 'name';
// 通过可变变量名访问全局变量 并且修改变量值
function a(){
	$var = 'a';
	global $$var;
	$$var = 'other';
}
a();
// 输出
echo $a;


输出结果是 : other 说明个时候访问的是变量的引用


但是当我们对这个变量进行unset操作的时候情况就会发生改变


以下引用手册说明


unset() 在函数中的行为会依赖于想要销毁的变量的类型而有所不同。

如果在函数中 unset() 一个全局变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。

如果您想在函数中  unset()  一个全局变量,可使用  $GLOBALS  数组来实现:


与可变变量无关的,如果我们想要用 unset 删除一个全局变量是行不通的,我们只能通过对 $GLOBALS 的值进行销毁才能真正的去销毁一个全局变量






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值