PHP中的变量与常量详解

几乎所有的编程语言都会涉及到变量和常量这两个概念,PHP也不例外。本节将介绍PHP语言中的变量和常量的应用方法。

一、什么是变量和常量

在程序执行的过程中,变量存储的值可以随时改变,而常量存储的值是不可以改变的。

变量用于存储临时数据信息。某一变量被定义的时候,系统会自动为该变量分配一个存储空间存放变量的值。我们可以在定义变量的时候对其赋值,如果需要改动变量的值,只需再次对其进行赋值即可。对于那些临时数据信息或者处理过程,都可以存放在变量中。

常量用于存储不经常改变的数据信息。定义常量的时候可以对其赋值,在程序的整个执行期间内,这个赋值都有效且不可再次对该常量进行赋值操作。

二、变量的定义与赋值

前面讲解了下变量,但我们还没有系统地讲解变量的应用。下面我们开始讲解如何在PHP中实现变量的定义与赋值操作。

1.变量的定义

在PHP中定义一个变量的语法格式如下:

$变量名称 = 变量的值

在为一个变量命名时,需要遵循以下命名规则:

  • 变量名以字母或下画线开头,可以由字母、下画线或数字构成。
  • 变量名区分大小写,“$var”和“$VAR”分别代表了两个不同的变量。
  • 自定义变量名称不可与PHP提供的默认变量名称相同。
  • 在为变量命名时,尽量使用有意义的字符串。

符合规定的变量命名如下:

$name;
$_password;
$no1;

不符合规定的变量命名如下:

$1book;
$*a;

2.变量的赋值

为变量赋值有两种方式:传值赋值和引用赋值,这两种赋值方式在对数据处理上存在很大差别。

1)传值赋值

这种赋值方式使用“=”直接将一个变量(或表达式)的值赋给另一个变量。使用这种赋值方式,等号两边的变量值互不影响,任何一个变量值的变化都不会影响到另一个变量。从根本上来说,传值赋值是通过在存储区域复制一个变量的副本来实现的。应用传值赋值的示例代码如下:

<?php
$a = 33;
$b = $a;
$b = 44;
echo "变量a的值为" . $a . "<br>";
echo "变量b的值为" . $b;
?>

在上面代码中,执行“$a = 33”语句时,系统会在内存中为变量a开辟一个存储空间,并将33这个数值存入到该存储空间。实现过程如图2-14所示。执行“$b = $a”语句时,系统会在内存中为变量b开辟一个存储空间,并将变量a指向存储空间的内容复制到变量b所指向的存储空间。实现过程如图2-15所示。

                       

图2-14  开辟变量a的存储空间               图2-15  开辟变量b的存储空间

当执行“$b = 44”语句时,系统将变量b指向存储空间保存的值更改为44,而变量a指向存储空间保存的值仍然是33。实现过程如图2-16所示。当代码2-14中的程序被执行时,得到结果如图2-17所示。

                

图2-16  更改变量b的值                        图2-17  传值赋值方式

2)引用赋值

引用赋值同样是使用“=”将一个变量的值赋给另一个变量,但是需要在等号右边的变量前面加上一个“& ”符号。实际上这种赋值方式并不是真正意义上的赋值,而是一个变量引用另一个变量。在使用引用赋值的时候,两个变量将会指向内存中同一存储空间, 因此任何一个变量的变化都会引起另外一个变量的变化。应用引用赋值的示例代码如下:

<?php
$a = 33;
$b = &$a;
$b = 44;
echo "变量a的值为" . $a . "<br>";
echo "变量b的值为" . $b;
?>

在上面代码中执行“$a = 33”语句时,对内存操作的过程与传值赋值相同,这里就不再说明了。执行“$b = &$a”语句后,变量b将会指向变量a所占有的存储空间。实现过程如图2-18所示。

执行“$b = 44”语句后,变量b所指向的存储空间保存的值变为44。此时由于变量a也指向此存储空间,所以变量a的值也会变为44。

当代码2-15中的程序被执行时,得到结果如图2-19所示。

              

图2-18  变量b指向变量a的存储空间                 图2-19  引用赋值方式

三、变量作用域

使用PHP语言开发的时候,我们几乎可以在任何位置声明变量,但是变量声明位置及声明方式的不同决定了变量作用域的不同。所谓的变量作用域,指的是变量在哪些范围能被使用,在哪些范围不能被使用。在PHP中,按照变量作用域的不同可以分为局部变量和全局变量。

1.局部变量

局部变量是声明在某一函数体内的变量,该变量的作用范围仅限于其所在函数体的内部。如果在该函数体外部引用这个变量,系统将会认为引用的是另外一个变量。

应用局部变量的示例代码如下:

<?php
function local(){
	$a = "local variable"; //在函数内部声明一个变量a并赋值
	echo "函数内部变量a的值为" .$a . "<br>";
}

local(); //调用函数local(),用来打印出变量a的值
$a = "outside variable."; //在函数外部再次声明变量a并赋另一个值
echo "函数外部变量a的值为" . $a;
?>

该程序被执行时,得到结果如图2-20所示。

图2-20  局部变量的应用

2.全局变量

全局变量可以在程序的任何地方被访问,这种变量的作用范围是最广泛的。要将一个变量声明为全局变量,只需在这个变量前面加上“global”关键字(不区分大小写,也可以是GLOBAL)。使用全局变量,我们就能够在函数内部引用函数外部参数,或者在函数外部引用函数内部的参数了。

应用全局变量的示例代码如下:

<?php
$a = "outside"; //定义一个变量a(注意:此时$a是全局变量)

function local(){ //定义一个函数local
	global $a; //将变量a声明为全局变量
	echo "在local函数内部获得变量a的值为" . $a . "<br>";
	global $b; //将变量b声明为全局变量
	$b = "inside"; //local函数内部对变量b进行赋值
}

local(); //输出local函数内部变量a的值
echo "在local函数外部获得变量b的值为" . $b; //在函数local外部输出变量b的值
?>

该程序被执行时,得到结果如图2-21所示。

图2-21  全局变量的应用

注意:应用全局变量虽然能够使我们更加方便地操作变量,但有的时候变量作用域的扩大,会给开发带来麻烦,可能会产生一些预料不到的问题。在通常情况下,我们不建议使用全局变量。

四、静态变量

变量不仅有其特定的作用范围,还有其存活的周期——生命周期。变量的生命周期指的是变量可被使用的一个时间段,在这个时间段内变量是有效的;而一旦超出这个时间段变量将会失效,我们就不能够再访问到该变量的值了。

PHP对于变量的生命周期规定如下:

  • 局部变量的生命周期为其所在函数被调用的整个过程。当局部变量所在的函数结束时,局部变量的生命周期也随之结束。
  • 全局变量的生命周期为其所在“.php”脚本文件被调用的整个过程。当全局变量所在脚本文件结束调用时,全局变量的生命周期结束。

有时某个自定义函数结束后,我们希望该函数内的变量仍然存在,就需要将这个变量声明为静态变量。将一个变量声明为静态变量的方法为,在变量前面加“static”关键字。

应用静态变量的示例代码如下:

<?php
function test(){
	static $a = 0; //定义一个静态变量a,并赋初始值为0
	echo $a . "<br>"; //输出变量a的值
	$a = $a+1; //将变量a的值加1再次赋给变量a
}
test(); //调用函数test()
test();
test();
echo $a; //变量a的生命周期结束,不会输出任何值
?>

该程序被执行时,得到结果如图2-22所示。

图2-22  静态变量的应用

从上面得到的结果可以看出,每次调用函数test()的时候,变量a的值都会增加1。也就是说每次调用函数结束以后,变量a仍然存在。再次调用函数test()时,变量a的值将会使用上一次调用该函数后得到的值。同时从上面的例子我们也可以得出这样的结论,静态变量的作用范围与局部变量相同,但是生命周期与全局变量相同

我们可以这样理解静态变量:只有该函数首次被调用时,取函数体内静态变量的初始值。以后再次调用该函数时,静态变量取值将是上次调用这个函数后得到的值。

注意:在为静态变量赋初值时,不可以将一个表达式赋给这个静态变量。

五、可变变量

通过前面的介绍我们已经知道,在PHP中定义一个变量时,变量必须有一个固定的名称。实际上PHP还支持一种特殊的变量使用方式——可变变量,这种变量的变量名称是由其他变量的值决定的,因此这个变量的名称是可变的。声明一个可变变量的语法格式如下:

$$可变变量的名称 = 可变变量的值

应用可变变量的示例代码如下:

<?php
$a = "Hello"; //定义一个变量a,并赋值为Hello
$$a = "World"; //定义一个可变变量,该变量名称为变量a的值
echo $a . "<br>"; //输出变量a的值
echo $$a . "<br>"; //输出可变变量的值
echo $Hello; //输出可变变量值的另一种方式
?>

该程序被执行时,得到结果如图2-23所示。

图2-23  可变变量的应用

六、默认系统变量

PHP提供了很多的默认系统变量,用于获得系统配置信息、网络请求相关信息等。PHP默认的系统变量的名称及其作用如表2-9所示。

表2-9  PHP默认系统变量

变 量 作 用
$GLOBALS 存储当前脚本中的所有全局变量,其KEY为变量名,VALUE为变量值
$_SERVER 当前Web服务器变量数组
$_GET 存储以GET方法提交表单中的数据
$_POST 存储以POST方法提交表单中的数据
$_COOKIE 取得或设置用户浏览器Cookies中存储的变量数组
$_FILES 存储上传文件提交到当前脚本的数据
$_ENV 存储当前Web环境变量
$_REQUEST 存储提交表单中的所有请求数组,其中包括$_GET、$_POST、$_COOKIE和$_SESSION中的所有内容
$_SESSION 存储当前脚本的会话变量数组

关于PHP所提供的默认系统变量,可以通过调用phpinfo()函数进行查看。但是由于操作系统版本、服务器版本及PHP配置文件的差异,在不同环境下显示的内容可能会有所不同。

七、常量的定义

在PHP中是通过define()函数来定义一个常量的,其语法格式为:

bool define ( string $name, mixed $value [, bool case_$insensitive] )

在上述语法中涉及到的参数说明如下。

  • name:指定常量的名称。
  • value:指定常量的值。
  • insensitive:指定常量名称是否不区分大小写。如果设置为true则不区分大小写;如果设置为false则区分大小写。如果没有设置该参数,则取默认值false。

应用常量的示例代码如下:

<?php
define("COLOR", "red"); //定义一个常量COLOR,值为red
echo COLOR . "<br>"; //输出常量COLOR的值
echo color . "<br>"; //不能正确输出常量COLOR的值
define("SHAPE", "round", TRUE); //定义常量SHAPE,值为round,不区分名称大小写
echo shape . "<br>"; //输出常量SHAPE的值
echo SHape; //输出常量SHAPE的值
?>

该程序被执行时,得到的结果如图2-24所示。

图2-24  常量的应用

注意:为常量命名的时候,同样需要遵循变量的命名规则,并且建议全部使用大写字母。另外,常量与变量的使用方法不同,使用常量的时候并不需要在常量前面加“$”符号。

八、默认系统常量

与默认系统变量一样,PHP也提供了一些默认的系统常量供用户使用。在程序中可以随时应用PHP的默认系统常量,但是我们不能任意更改这些常量的值。PHP中常用的一些默认系统常量名称及其作用如表2-10所示。

表2-10  PHP默认系统常量

常 量 作 用
__FILE__ 存储当前脚本的(物理地址)绝对路径及文件名称
__LINE__ 存储该常量所在行号
__FUNCTION__ 存储该常量所在函数名称

__CLASS__

存储该常量所在类的名称
PHP_VERSION 存储当前PHP的版本号
PHP_OS 存储当前服务器的操作系统


几个 PHP 的“魔术常量”

名称 说明
__LINE__ 文件中的当前行号。
__FILE__ 文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自 PHP 4.0.2 起,__FILE__总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。
__FUNCTION__ 函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
__CLASS__ 类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
__METHOD__ 类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
时间: 2024-10-12 22:50:10

PHP中的变量与常量详解的相关文章

C 变量和常量详解

  C语言提供了下列几种基本数据类型: char         字符型    占用一个字节,可以存放本地字符集中的一个字符 int            整型      通常反映了所用及其中证书的最自然长度 float        单精度浮点型 double    双精度浮点型 此外:还可以在基本数据类型前加上一些限定字符: short 和 long 用于限定整型 short通常为16位,long通常为32位,int可以选择为16或者32位,但必须满足以下规定: short和int至少为16

PHP100-第三讲 PHP5.4 语法、常量、变量、数据类型详解

内容摘要: ①PHP5.4 的基本语法与写作格式 ②PHP5.4 的变量与变量数据类型 ③PHP5.4 的系统常量与自定义常量 PHP5.4 的基本语法与写作格式: 任何程序语言都有自己的语言风格,PHP语言也有自己独特的风格,虽然也继承了许多Perl和C的语言特色.但经过多年的发展PHP已经成为了一个成熟 的编程语言,所以我们还需要认真的学习PHP的独特语法.PHP一个很大的特色就是与HTML标签语言进行混编,这种模式是今后很长一段学习过程中所用到 的格式,因此我们先来通过一个例子来认识一下P

PHP5.4 语法、常量、变量、数据类型详解

1.php5.4的基本语法与写作格式 短标签模式的开启: ; short_open_tag php语句的分隔符: <?php $php=true; if($php){     echo "It is true";//分号介绍 }    //大括号结束: ?> 函数的使用格式: 1.返回值 函数名() 2.返回值 函数名(参数,参数...) 3.函数名 (参数,参数..,返回变量) 4.返回值 函数名(...)调用符 2.php5.4的变量与变量数据类型 变量用$开头,只能是

深入MySQL用户自定义变量:使用详解及其使用场景案例

一.前言 在前段工作中,曾几次收到超级话题积分漏记的用户反馈.通过源码的阅读分析后,发现问题出在高并发分布式场景下的计数器上.计数器的值会影响用户当前行为所获得积分的大小.比如,当用户在某超级话题下连续第n(n即计数器的值)次进行转发帖子时,将会获得与n相关的分数.然而,在第一次改进后问题依然存在.所以,这次在之前的基础上,通过使用MySQL变量的途径来解决该问题. 二.到底MySQL的变量分哪几类? MySQL变量一共分为两大类:用户自定义变量和系统变量.如下: 用户自定义变量 局部变量 会话

VC++中MessageBox的常见用法详解

消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合.         1.MessageBox("这是一个最简单的消息框!");         2.MessageBox("这是一个有标题的消息框!","这是标题");         3.MessageBox("这是一个确定 取消的消息框!","这是标题", MB_OKCANCEL );         4.Messa

Java中static作用及用法详解

1.1概述: static是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就会一直存在.这样做有什么意义呢?在Java程序里面,所有的东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员,那么普通情况下必须先实例化对象后,通过对象的引用才能够访问这些成员,但是用static修饰的成员可以通过类名加".&q

JDK中的Timer和TimerTask详解

目录结构: Timer和TimerTask 一个Timer调度的例子 如何终止Timer线程 关于cancle方式终止线程 反复执行一个任务 schedule VS. scheduleAtFixedRate 一些注意点 1. Timer和TimerTask Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次. TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务. 2.

【Unity编程】Unity中关于四元数的API详解

Unity中关于四元数的API详解 Quaternion类 Quaternion(四元数)用于计算Unity旋转.它们计算紧凑高效,不受万向节锁的困扰,并且可以很方便快速地进行球面插值. Unity内部使用四元数来表示所有的旋转. Quaternion是基于复数,并不容易直观地理解. 不过你几乎不需要访问或修改单个四元数参数(x,y,z,w); 大多数情况下,你只需要获取和使用现有的旋转(例如来自"Transform"),或者用四元数来构造新的旋转(例如,在两次旋转之间平滑插入). 大

&quot;静态方法里只能调用静态变量和静态方法&quot;详解

静态方法里可以调用静态方法和静态变量,同时也能调用非静态方法和非静态变量. public class Test { public Test() {}; public Test(int i) {this.n = i;} public static int m = 5; public int n = 10; public void fun1() {System.out.println("非静态方法fun1");} public static void fun2() {System.out.