在程序执行的过程中,变量存储的值可以随时改变,而常量存储的值是不可以改变的。变量用于存储临时数据信息,对于那些临时数据信息或者处理过程,都可以存放在变量中。常量用于存储不经常改变的数据信息。定义常量的时候可以对其赋值,在程序的整个执行期间内,这个赋值都有效且不可再次对该常量进行赋值操作。
PHP变量
PHP变量与与数学中的代数类似,可以给 PHP 变量赋予某个值(x=5)或者表达式(z=x+y)。
变量的命名规则
- 变量以 $ 符号开始,后面跟着变量的名称
- 变量名必须以字母或者下划线字符开始
- 变量名只能包含字母数字字符以及下划线(A-z、0-9 和 _ ),不能包含空格
- 变量名是区分大小写的($y 和 $Y 是两个不同的变量)
变量的创建与使用
PHP 没有声明变量的命令。变量在您第一次赋值给它的时候被创建。PHP是一门弱类型语言,所以不必向 PHP 声明该变量的数据类型。PHP 会根据变量的值,自动把变量转换为正确的数据类型。在强类型的编程语言(比如java语言)中,我们必须在使用变量前先声明(定义)变量的类型和名称。
<?php
$test='hello php';
$number=10;
?>
变量的赋值
<?php
$a=10;
$b=$a;
$a=5;
echo $b,"\n";
$c=&$a;
$a=6;
echo $c;
?>
结果:
10
6
首先变量a的值是10,将a的值赋值给变量b,再将a的值赋值为5,输出变量b的值为10,因为变量b的值与变量a无关。
第7行中使用的是引用赋值,从PHP4开始,PHP引入了“引用赋值”的概念,就是用不同的名字访问同一个变量内容。当改变其中一个变量的值,另一个也会发生变化,两者在内存中指向的是同一个地址。引用赋值使用“&”来表示引用。因此,变量c与变量a的值一致,当变量a重新赋值为6时,变量c的值也变成了6。
变量的作用域
PHP变量有4种作用域
- local
- global
- static
- parameter
下面我们就具体来看一下这4种作用域
局部作用域和全局作用域
在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,需要使用 global 关键字。
在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问 。
<?php
$x = 2;#全局变量
function test(){
$y = 3;#局部变量
global $x;#在局部作用域访问全局变量
echo $x;
echo "\n";
echo $y;
echo "\n";
}
test();
echo $x;
echo "\nddd";
echo $y;
?>
结果:
2
3
2
ddd
在局部作用域访问全局变量时,需要使用global关键字,当然方法不止一种。
局部变量访问全局变量的三种方法
<?php
//方法1 : using superglobal(超全局变量)
$_POST['a']=100;
function call1()
{
echo $_POST['a']."\n";
}
call1();
// 方法2 : using $GLOBALS to define the variable
$a=99;
function call2()
{
echo $GLOBALS['a']."\n";
}
call2();
//方法3 : using global to define the variable
$a=98;
function call3()
{
global $a;
echo $a;
}
call3();
?>
全局变量访问局部变量的三种方法
<?php
//函数外部调用局部变量
//方法1 :using superglobal(超全局变量)
function call1()
{
$_GET['$A']=100;
}
call1();
echo $_GET['$A'];
//方法2 :using $GLOBALS to define variable
function call2()
{
$GLOBALS['A']=99;
}
call2();
echo $A;
//方法3 : using global to define variable
function call3()
{
global $a ;
$a=98;
}
call3();
echo $a;
?>
static作用域
当一个函数完成时,它的所有变量通常都会被删除。然而,有时候您希望某个局部变量不要被删除。
要做到这一点,只需在第一次声明变量时使用 static 关键字。
<?php
function test(){
$x = 0;
echo $x;
$x++;
}
test(); //输出0
test(); //输出0
test(); //输出0
?>
<?php
function test(){
static $x = 0;
echo $x;
$x++;
}
test(); //输出0
test(); //输出1
test(); //输出2
?>
每次调用该函数时,该变量将会保留着函数前一次被调用时的值。但是该变量仍然是函数的局部变量。
parameter 参数作用域
参数是通过调用代码将值传递给函数的局部变量(值传递),参数是在参数列表中声明的,作为函数声明的一部分。
<?php
function test($x){
echo $x;
}
test(1); //输出1
test(2); //输出2
?>
PHP常量
PHP常量的命名规则和变量类似,不能以数字开始,由英文字母,下划线,数字组成。不过一般情况下常量都是以大写字母和下划线组成。
常量的define()定义
在PHP中我们使用define()函数来定义常量,define()函数的语法如下:
bool define ($name , $value ,$case_insensitive = false)
$name:常量的名称,必须有
$value : 常量的值,必须有
$case_insensitive 用来控制常量名是否大小写敏感(默认是敏感),设定true,表示不敏感。可选参数,有两个值,true和false
常量的const关键字定义
在PHP 5.3.0之后,除了使用函数define()之外,我们还可以使用PHP关键字const来定义常量。
<?php
const PI = 3.14159; //使用const关键字定义一个名为PI的常量
echo PI; //输出:3.14159
?>
两种定义常量方式的区别
1.版本差异
首先,毫无疑问的是,两种定义常量的方式之间存在版本差异,函数define()在PHP4和PHP5中均可使用,关键字const只能在PHP 5.3.0及其后的版本中使用。
2.定义位置的区别
由于函数define()定义的常量是在执行define()函数时定义的,因此可以在函数内、循环内、if语句内等函数能够被调用的任何地方使用define()函数定义常量。与define()不同的是,由于const关键字定义的常量是在编译时定义的,因此const关键字定义常量必须处于最顶端的作用区域。这也就意味着不能在函数内、循环内以及if语句之内用const来定义常量。
<?php
//使用const关键字定义常量必须处于最顶端的作用区域
//也就是可以在编译时直接解析定义的地方
const DEMO = 'DEMO';
class Person{
const MAN = '男';
const WOMAN = '女';
}
interface USB{
const VERSION_2 = '2.0';
const VERSION_3 = '3.0';
}
?>
3.对值的表达式支持的差异
虽然关键字const和define()定义的常量值都只能为null或标量数据(boolean,integer,float和string类型)以及resource类型(不推荐定义resource类型的常量,否则可能出现无法预知的结果)。不过,由于关键字const定义常量是在编译时定义的,因此const关键字定义的常量值的表达式中不支持算术运算符、位运算符、比较运算符等多种运算符,而这些运算符在define()函数定义常量时都是可以直接使用的。
例如:
<?php
define('DEFINE_VAR1', 1 << 1);
//const CONST_VAR1 = (1 << 1); //const不支持位运算符,PHP会报语法错误
define('DEFINE_VAR2', 1 + 1);
//const CONST_VAR2 = 1 + 1 ; //const不支持算术运算符,PHP会报语法错误
define('DEFINE_VAR3', 1 == 1);
//const CONST_VAR3 = 1 == 1 ; //const不支持比较运算符,PHP会报语法错误
$value = 3;
define('DEFINE_VAR4', $value);
//const CONST_VAR4 = $value ; //const不支持变量形式的值,PHP会报语法错误
define('DEFINE_VAR5', true || false);
//const CONST_VAR5 = true || false ; //const不支持逻辑运算符,PHP会报语法错误
define('DEFINE_VAR6', 'Hello'.' World!');
//const CONST_VAR6 = 'Hello'.' World!' ; //const不支持字符串运算符,PHP会报语法错误
class User{
}$user = new User();define('DEFINE_VAR7', $user instanceof User);
//const CONST_VAR7 = $user instanceof User ; //const不支持类型运算符,PHP会报语法错误
?>
4.对字符大小写敏感的支持差异
除上述3个区别外,还有一个不太起眼的区别。函数define()可以接收第3个参数,如果该参数为true,则表示常量名的大小写不敏感。而使用const关键字定义常量却没有提供类似的功能。
<?php
//define()的第3个参数为true时,表示大小写不敏感
define('SITE_NAME', 'CodePlayer', true);
echo SITE_NAME; //输出:CodePlayer
echo site_name; //输出:CodePlayer
echo SiTe_NamE; //输出:CodePlayer
const DOMAIN_NAME = '365mini.com';
echo DOMAIN_NAME; //输出:365mini.com
echo domain_name; //PHP提示常量未定义
echo DomaIN_nAMe; //PHP提示常量未定义
?>
常量的获取
获取常量有2种方法,一种是使用常量名直接获取
<?php
define("TEST","测试");
echo TEST;
?>
另一种是使用constant()函数,constant()函数和直接使用常量名输出的效果是一样的,但函数可以动态地输出不同的常量,在使用上要灵活方便很多,参数const_name为要获取常量的名称,也可以是存储常量名的变量。如果获取成功则返回常量的值,否则提示错。
<?php
for($a=0;$a<3;$a++) {
define("TEST".$a,"测试");
}
for($a=0;$a<3;$a++) {
echo constant(TEST.$a);
}
echo "\n";
for($a=0;$a<3;$a++) {
echo TEST.$a;
}
?>
结果:
测试测试测试
TEST0TEST1TEST2
判断常量是否被定义
defined(name)
参数 name 为要获取常量的名称,成功返回true,否则返回false。
<?php
define("TEST","测试");
echo defined("TEST");//输出1
echo defined("TT")
?>
PHP变量与常量的区别
通过上面的内容我们可以总结一下几点来上面php常量与变量的区别:
- 常量前面没有美元符号($)
- 常量只能用 define() 函数定义,而不能通过赋值语句
- 常量可以不用理会变量范围的规则而在任何地方定义和访问
- 常量一旦定义就不能被重新定义或者取消定义
- 常量的值只能是标量(整型 浮点型 布尔型 null 字符串),不能是 数组 对象 资源,变量的值可以是PHP所有的数据类型(PHP的八种数据类型)。
PHP的八种数据类型
4种标量类型
- boolean(布尔型)
- integer(整型)
- float(浮点型)
- string(字符串型)
两种符合类型
- array(数组)
- object(对象)
两种特殊类型
- resource(资源)
- 空值(null)