PHP变量作用域(花括号、global、闭包)

花括号

很多语言都以花括号作为作用域界限,PHP中只有函数的花括号才构成新的作用域。

<?php
if (True) {
	$a = ‘var a‘;
}

var_dump($a);

for ($i = 0; $i < 1; $i++) {
	$b = ‘var b‘;
	for ($i = 0; $i < 1; $i++) {
		$c = ‘var c‘;
	}
	var_dump($c);
}

var_dump($b);
var_dump($c);
?>

运行结果是:

string(5) "var a" string(5) "var c" string(5) "var b" string(5) "var c"

可见if和for的花括号并无构成新的作用域。

而函数:

<?php
function test() {
	$test = ‘var test‘;
}

test();
var_dump($test);
?>

结果是:

NULL

global关键字

PHP的执行是以一个.php脚本为单位,在一个.php脚本的执行过程中,可以include和require其他PHP脚本进来执行。

执行的.php脚本与include/require进来的脚本共享一个全局域(global scope)。

global关键字无论在哪层,所引用的都是全局域的变量。

<?php
$test = ‘global test‘;
function a() {
	$test = ‘test in a()‘;
	function b() {
		global $test;
		var_dump($test);
	}
	b();
}

a();
?>

执行结果是:

string(11) "global test"

闭包

闭包作用域跟函数类似,内层访问外层变量,外层不能访问内层变量。

<?php
function a() {
	$test = ‘test in a()‘;
	function b() {
		var_dump($test); // $test不能被访问
		$varb = ‘varb in b()‘;
	}

	b();
	var_dump($varb); // $varb也不能被访问
}

a();
?>

执行结果:

NULL NULL

延伸阅读:

时间: 2024-10-11 09:17:33

PHP变量作用域(花括号、global、闭包)的相关文章

如何在switch case中定义变量(不用花括号)

这个周末有幸见到了几位神交已久的库友(天天/迪迪/丁丁),大家一起扯了些有的没的,很开森! 天天考了我一个问题,在C语言里面,如何在switch case中定义一个变量?要求是不用花括号. 这个问题是背景是,下面的代码是编译不过的,因为在case后面不能直接定义变量. switch (v) {    case 1:       int a;       get_value_of_xx(&a);       set_yy(a);       break;    case 2:       //do

JavaScript变量作用域(Variable Scope)和闭包(closure)的基础知识

在这篇文章中,我会试图讲解JavaScript变量的作用域和声明提升,以及许多隐隐藏的陷阱.为了确保我们不会碰到不可预见的问题,我们必须真正理解这些概念. 基本定义 作用范围是个“木桶”,里面装着变量.变量可以是局部或者全局性的,但在子范围中定义的变量是可以访问父范围的,这一点可能会造成一些困扰. 在JavaScript中使用"var"关键字声明变量.一旦在父范围宣声明,就会作为各自子范围的一部分.即在本地范围内有效,但本地定义的变量不可在全局范围内访问. 让我们来看一个例子.执行下面

js最基础知识回顾3(字符串拼接,数据类型,变量类型,变量作用域和闭包,运算符,流程控制,)

一.javaScript组成     1.ECMAScript:解释器.翻译 ---------------------------------------------------------几乎没有兼容性问题     2.DOM:Document Object Model --------操作HTML的能力----document--------有一些兼容性问题     3.BOM:Browser Object Model -------------浏览器---------------wind

javascript 闭包与函数变量作用域

浏览器事件循环工作原理 浏览器有一个事件循环用于检查事件队列,处理延时的事件.UI事件(例如:点击,滚动等),ajax回调,以及提供给setTimeout()和setInterval()的回调,都会依次被事件循环处理. 因此,当调用setTimeout()函数时,即使延迟的时间被设置为0,提供的回调也会被排队 回调会呆在队列中,直到指定的时间用完后,引擎开始执行动作(如果它当前不执行其他动作) 因此,即使setTimeout()回调被延迟0ms,它仍然会被排队,并且直到函数中其他非延迟的语句被执

javaScript的闭包 js变量作用域

js的闭包 js的变量作用域: var a=90; //定义一个全局变量 function test(){ a=123; //使用外层的 a变量 } test(); document.write("a="+a); var a=90; //定义一个全局变量 function test(){ var a=123; //定义一个局部变量 } test(); document.write("a="+a); a=90; //没有var ,就会试着去找(父函数 的 a),如果找

Python--高阶函数、函数嵌套、名称空间及变量作用域、闭包、装饰器

1.高阶函数(map/reduce/filter) 高阶函数是指函数的参数可以是函数 这篇总结几个常用的高阶函数:map/reduce/filter map函数.reduce函数.filter函数都是Python中的内建函数. map函数 map函数的作用是将一个函数作用于一个序列的每一个元素,一行代码即可完成,不需要用我们平常喜欢用的循环.map将运算进行了抽象,我们能一眼就看出这个函数是对一个序列的每个元素进行了同样的一个操作.map()函数接收两个参数,一个是函数,一个是Iterable,

原型模式故事链(5)--JS变量作用域、作用域链、闭包

上一章 JS执行上下文.变量提升.函数声明 传送门:https://segmentfault.com/a/11... 本次我们主要讲讲变量作用域和闭包变量作用域:顾名思义:变量起作用的范围.变量分为全局变量和局部变量.全局变量:在任何地方都能用,在所有函数之外.局部变量:只能在定义它的函数中,以及它的子函数中使用. 当前作用域没有定义的变量,称为自由变量. 举例子: <!DOCTYPE html> <html> <head> <title>dsfg</

Javascript的那些硬骨头:作用域、回调、闭包、异步……

终于到了神话破灭的时刻-- 这注定是一篇"自取其辱"的博客,飞哥,你们眼中的大神,Duang,这次脸朝下摔地上了. 故事得从这个求助开始:e.returnValue 报错:未定义,"一起帮"现在人气还不够旺,碰到了我勉勉强强能够解决的问题,硬着头皮也得上啊!远程一看,问题不是e.returnValue没值,是e本身就没值.而更核心的问题是:这段代码,是被放在setTimeout()里面的.(这里插一句:很多问题,就得远程,求助人贴出来的代码,根本就没抓住重点.话说,

Sass学习笔记 -- 变量及变量作用域历史遗留问题

sass有两种后缀名文件: 一种后缀名为sass,写选择器时不能使用大括号和分号 一种后缀名为scss,使用大括号和分号 //后缀名为sass的语法,不能出现大括号和分号 $highlight-color: #abcdef .selected   border: 1px $highlight-color solid    //后缀名为scss的语法,跟css一样,需要大括号和分号 $highlight-color: #abcdef; .selected{   border:1px solid $