PHP 中的每个变量都有一个针对它的作用域,它是指可以在其中访问变量(从而访问它的值)的一个领域。对于初学者来说,变量的作用域是它们所驻留的页面。因此, 如果你定义了 $var,页面余下部分就可以访问 $var,但是,其它页面一般不能访问它(除非使用特殊的变量)。

因为包含文件像它们是原始(包含)脚本的一部分那样工作,所以在 include() 那一行之前定义的变量可供包含文件使用。此外,包含文件内定义的变量可供 include() 那一行之后的父(包含)脚本使用。

当使用你自己定义的函数时,所有这些都将变得不那么明显。这些函数具有它们自己的作用域,这意味着在一个函数内使用的变量不能在其外部使用,在一个函数 外部定义的变量不能在其内部使用。由于这个原因,函数内部的变量可以具有与其外部的变量相同的名称,但是它们仍然是完全不同的变量,并且具有不同的值。对 于大多数初级程序员来说,这是一个使人糊涂的概念。

要改变一个函数内的变量的作用域,可以使用 global 语句。

<?php
function function_name() {
global $var;
} $var = 20;
function_name(); // Function call.
?>

在这个示例中,函数内部的 $var 现在与函数外部的 $var 相同。这意味着变量 $var 已经具有一个值20,如果在函数内部改变了这个值,外部的 $var 值也会改变。

避开变量作用域的另一个方法是利用超全局变量:$_GET、$_POST、$_REQUEST 等。这些变量在你的函数内是自动可访问的(因此,它们是超全局变量)。也可以添加元素到 $GLOBALS 数组中,使得可以在函数内使用它们。

也就是说,最好不要在函数内使用全局变量。在设计函数时,应该使它们根据需要接受每个值作为参数,并根据需要返回任何值。依靠函数内的全局变量将使得它们更依赖于上下文,因而不太有用。

在PHP中变量主要有:内置超级全局变量,一般的变量,常量,全局变量,静态变量等.

内置超级全局变量可以在脚本的任何地方使用和可见。即如果我们在一个PHP页面中改变了其中的一个值,那么在其他PHP页面中使用时,它的值也会发生改变。

  • 常量一旦被声明将可以在全局可见,也就是说,它们可以函数内外使用,但是这仅仅限于一个页面之中(包含我们通过include和include_once)包含进来的PHP脚本,但是在其他的页面中就不能使用了。
  • 在一个脚本中声明的全局变量在整个脚本中是可见的,但不是在函数内部,在函数内部的变量如果与全局变量名称相同,以函数内部的变量为准。
  • 函数内部使用的变量声明为全局变量时,其名称要与全局变量的名称一致,在这样的情况下,我们就可以在函数中使用函数外部的全局变量了,这样就可以避免上一种因为函数内部的变量与外部的全局变量名称相同而覆盖了外部变量这样的情况。
  • 在函数内部创建并声明为静态的变量无法在函数外部可见,但是可以在函数的多次执行过程中保持该值,最常见的情况就是在函数的递归执行的过程之中。
  • 在函数内部创建的变量对函数来说是本地的,而当函数终止时,该变量也就不存在了。

超级全局变量(共个)的完整列表如下

  • $GOBALS: 所有全局变量数组
  • $_SERVER: 服务器环境变量数组
  • $_POST: 通过POST方法传递给该脚本的变量数组
  • $_GET: 通过GET方法传递给该脚本的变量数组
  • $_COOKIE: cookie变量数组
  • $_FILES: 与文件上传相关的变量数组
  • $_ENV: 环境变量数组
  • $_REQUEST: 所有用户输入的变量数组包括$_GET、$_POST 、$_COOKIE 所包含的输入内容
  • $_SESSION: 会话变量数组

实例讲解:

<?php
$a = 4;
function sendValue($x) {
echo $x;
}
sendValue($a);
?>

讲解: $a定义在函数外,函数定义了参数,当函数被调用时,$a将以参数的形式被传递。因此上面代码能够正常运行。

<?php
$a = 4;
function sendValue() {
echo $a;
}
sendValue();
?>

讲解:当函数被调用时,$a不能以参数的形式被传递。所以上面代码不能够正常运行。

附:PHP变量作用域详解(二)

PHP常量、变量作用域详解(一)的更多相关文章

  1. PHP变量作用域详解(二)

    学过C的人用PHP的时候一般会相当顺手,而且感到PHP太方便太轻松.但在变量作用域这方面却与C有不同的地方,搞不好会相当郁闷,就找不到错误所在.昨晚就与到这么一个问题,是全局变量在函数中的问题.今天搜 ...

  2. JavaScript 变量作用域 详解

    变量作用域要点 - 在JavaScript中没有块级作用域,只有函数作用域 - 在函数体内,局部变量的优先级高于同名的全局变量 - 在全局作用域编写代码时可以不写var语句,但声明局部变量时必须使用v ...

  3. (转载)Java变量作用域详解

    转载自http://www.cnblogs.com/AlanLee/p/6627949.html 大多数程序设计语言都提供了"作用域"(Scope)的概念. 对于在作用域里定义的名 ...

  4. python3 之 变量作用域详解

    作用域: 指命名空间可直接访问的python程序的文本区域,这里的 ‘可直接访问’ 意味着:对名称的引用(非限定),会尝试在命名空间中查找名称: L:local,局部作用域,即函数中定义的变量: E: ...

  5. Java基础-变量的定义以及作用域详解

    Java基础-变量的定义以及作用域详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字面量 常量(字面量)表示不能改变的数值(程序中直接出现的值).字面量有时也称为直接量,包 ...

  6. Python中的变量和作用域详解

    Python中的变量和作用域详解 python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部 ...

  7. JS变量对象详解

    JS变量对象详解 开年之后工作热情一直不是很高,这几天一直处于消极怠工状态.早上不想起床,起床了不想上班.明明放假之前工作热情还一直很高,一直心心念念的想把小程序项目怼出来,结果休假回来之后画风完全不 ...

  8. JAVA环境变量配置详解(Windows)

    JAVA环境变量配置详解(Windows)   JAVA环境变量JAVA_HOME.CLASSPATH.PATH设置详解  Windows下JAVA用到的环境变量主要有3个,JAVA_HOME.CLA ...

  9. “全栈2019”Java异常第六章:finally代码块作用域详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

随机推荐

  1. ACM练手

    #include<iostream> #include<string.h> using namespace std; #define N 100 class stack { c ...

  2. 并查集补集作法 codevs 1069 关押罪犯

    1069 关押罪犯 2010年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description ...

  3. QuickHit项目(输出字符串游戏)

    public class leve { private int leveNo; private int strLength; private int strTimes; private int tim ...

  4. 洛谷P1415 拆分数列[序列DP 状态 打印]

    题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时 ...

  5. AC日记——C’s problem(c) TYVJ P4746 (清北学堂2017冬令营入学测试第三题)

    P4746 C’s problem(c)   时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描述 小C是一名数学家,由于它自制力比 ...

  6. winform记事本(基本功能)

    本题主要考察各种控件的应用 using System; using System.Collections.Generic; using System.ComponentModel; using Sys ...

  7. 由于log太多导致ubuntu硬盘空间满了,进入不了系统解决办法

    具体现象是在图形界面输入用户名和密码之后,再次提示需要输入用户名和密码. 步骤一:按快捷键进入命令行界面.ctrl+alt+f1. 步骤二:清空文件 clear log cd /var/log sud ...

  8. POJ 2914 Minimum Cut

    Minimum Cut Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 9319   Accepted: 3910 Case ...

  9. 让easyui 的alert 消息框中的确定按钮支持空格键

    var _messager = $.extend({},$.messager);$.extend($.messager,{ alert:function(title, msg, icon, fn){ ...

  10. 利用缓存实现APP端与服务器接口交互的Session控制

    与传统B/S模式的Web系统不同,移动端APP与服务器之间的接口交互一般是C/S模式,这种情况下如果涉及到用户登录的话,就不能像Web系统那样依赖于Web容器来管理Session了,因为APP每发一次 ...