PHP变量与常量

在程序执行的过程中,变量存储的值可以随时改变,而常量存储的值是不可以改变的。变量用于存储临时数据信息,对于那些临时数据信息或者处理过程,都可以存放在变量中。常量用于存储不经常改变的数据信息。定义常量的时候可以对其赋值,在程序的整个执行期间内,这个赋值都有效且不可再次对该常量进行赋值操作。

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常量与变量的区别:

  1. 常量前面没有美元符号($)
  2. 常量只能用 define() 函数定义,而不能通过赋值语句
  3. 常量可以不用理会变量范围的规则而在任何地方定义和访问
  4. 常量一旦定义就不能被重新定义或者取消定义
  5. 常量的值只能是标量(整型 浮点型 布尔型 null 字符串),不能是 数组 对象 资源,变量的值可以是PHP所有的数据类型(PHP的八种数据类型)。

PHP的八种数据类型

4种标量类型

  • boolean(布尔型)
  • integer(整型)
  • float(浮点型)
  • string(字符串型)

两种符合类型

  • array(数组)
  • object(对象)

两种特殊类型

  • resource(资源)
  • 空值(null)
点赞

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注