变量与常量
在任何一门编程语言里,变量都居于核心地位。
我们默认您已经掌握 HTML 基础知识,如果没有,可以关注我们的
HTML教程
公众号或转到[HTML5 教程]()同步学习!
变量:什么是变量
简而言之,变量是用于临时存储值的容器。
-
临时:变量具有时效性,也就是生存周期。在 PHP 中,变量的生存周期体现在作用域。稍后我们详细讲解作用域。
-
值:PHP 的值有9种类型,其中包括4种标量类型——布尔型(boolean)、整型(integer)、浮点型(float,也称作double)和字符串类型(string);三种复合类型——数组(array)、对象(object)和可调用类型(callable);以及两种特殊类型——资源(resource)和 NULL(无类型)。
各种类型将在后续的章节进行详细讲解,如果要查看某个变量的类型和值,可使用
var_dump()
函数。
如何声明变量
在 PHP 中,变量不需要提前声明,一个变量在第一次为它赋值时该变量即被创建。
变量的标识符为$
(美元符),表明其为变量。如下:
<?php
// 试图定义一个不赋值的变量
$val;
echo $val;// 输出:PHP Notice: Undefined variable: val
echo PHP_EOL;// PHP_EOL相当于换行符\n
$val2 = 123;
echo $val2;// 输出:123
echo PHP_EOL;
$val2 = 'declare';// 修改变量$val2的值
echo $val2;// 输出:declare
注意:上述代码中的
PHP_EOL
是换行符\n
的 PHP 常量,在命令行窗口输出显示为换行。
由于PHP是弱类型编程语言,定义变量时不需要声明其数据类型。PHP 会根据变量值,自动将变量转化为正确的数据类型。
PHP 的变量名称可以很短(如i, j, k),也可以是具有描述性的名称(如声明一个用户的姓名,可以使用$name
),推荐使用更具有描述性的名称作为变量名,以增加代码的可读性。
同时,PHP的变量名拥有以下命名规则:
- 变量必须以
$
符号开始,后紧跟变量名称 - 变量名称可以包含字符串、数字和下划线的组合,例如
uer_num76
$
符号之后的第一个字符必须是字母或下划线(不能是数字)- 变量可以使用表达式赋值,例如:
$total = $num * $price
读者可以尝试如果违反以上规则会输出什么信息(如果变量名称前不加$
符号,会被认为是一个普通字符串或数字类型,无法修改其值。可以使用var_dump()
方法检查变量类型)。
常量:变量的“反义词”
既然有“变量”(可变值的容器)的概念,那么相对的,也应该有“不可变的值容器”这一说法。
常量就是“不可变值的容器”。与变量不同,常量“一经定义,无法改变”,并且在整个脚本中都可使用。其命名规则同变量一致,通常来说,常量标识符总是全大写的。
与变量不同,常量是需要定义的,并且定义时可选择是否开启“不区分大小写”。在 PHP 中,设置常量使用define()
函数,语法如下:
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
其中常量名和常量值是必须传入的,“不区分大小写”选项是可选的,默认为false
,即区分大小写。
注意:在 PHP 7.3.x 版本已废弃大小写不敏感的第三个参数,读取常量时也必须区分大小写!
下面是示例代码:
<?php
// 定义一个名为 PORT_ID 值为80且不开启“大小写不敏感”(默认)的常量
define('PORT_ID', 80, false);
echo PORT_ID;// 输出:80
echo PHP_EOL;
echo port_id;// 输出:PHP Warning: Use of undefined constant port_id - assumed 'port_id' (this will throw an Error in a future version of PHP)
echo PHP_EOL;
// 定义一个名为 PORT_NAME 值为'极速API'且开启“大小写不敏感”的常量
define('PORT_NAME', '极速API', true);
echo PORT_NAME;// 输出:极速API
echo PHP_EOL;
echo port_name;// 输出:极速API
echo PHP_EOL;
function demo()
{
echo PORT_NAME;// 调用函数外的常量
}
demo();// 输出:极速API
除了define()
函数,还可以使用const
关键字在类定义之外定义常量。不能在函数内、循环内以及if
语句中使用const
定义常量。
魔术常量
PHP 内置了许多预定义常量,其中很大一部分由 PHP 的扩展库定义,加载时才会出现,可以在其官网查看各个常量的定义及值。而 PHP 还有八个常量被称为魔术常量,它们的值并不像其他常量一成不变,如下:
__LINE__
:返回代码当前位置的行号__FILE__
:返回代码所在文件的绝对路径__DIR__
:返回代码所在文件的目录__FUNCTION__
:返回该函数被定义时的名称,包含其被声明的作用域__CLASS__
:返回类的名称,包括其被声明的作用域__TRAIT__
:返回Trait
的名称,包括其被声明的作用域__METHOD__
:返回类的方法名__NAMESPACE
:返回当前的命名空间名称
示例代码:
<?php
namespace jisu\php\tutorial;
class Magic
{
public function constant()
{
// 当前类的名称
echo __CLASS__;// jisu\php\tutorial\Magic
echo PHP_EOL;
// 当前方法名
echo __METHOD__;// jisu\php\tutorial\Magic::constant
echo PHP_EOL;
// 当前类/文件所在命名空间
echo __NAMESPACE__;// jisu\php\tutorial
}
}
// 魔术常量
// 当前代码的行号
echo __LINE__;// 输出:27
echo PHP_EOL;
// 当前文件的绝对路径
echo __FILE__;// 输出:E:\tutorial\code\4.2\magic-constant.php
echo PHP_EOL;
// 当前文件所在目录
echo __DIR__;// 输出:E:\tutorial\code\4.2
echo PHP_EOL;
function demo()
{
//
echo __FUNCTION__;
}
demo();// 输出:jisu\php\tutorial\demo
echo PHP_EOL;
echo __CLASS__;// 不在类定义中,无输出
echo PHP_EOL;
// 在类中输出常量值
$ins = new Magic();
$ins->constant();
魔术常量因其灵活性,在开发时可以经常看到它们的身影,在后续的教程中也有机会用到它们,现在暂作了解。
作用域
单独讲解作用域是因为理解变量的作用域非常重要!
在 PHP 中,可以在脚本的任意位置对变量进行声明,变量的作用域指的是该变量可以被引用的那部分内容。
例如下面的代码:
<?php
$name = '极速API';
function demo()
{
$host = 'https://www.jisuapi.com/';
echo $name;// 输出:PHP Notice: Undefined variable: name in E:\tutorial\code\4.2\scope.php on line 8
echo PHP_EOL;
echo $host;// 输出:https://www.jisuapi.com/
echo PHP_EOL;
}
echo $name;// 输出:极速API
echo PHP_EOL;
echo $host;// 输出:PHP Notice: Undefined variable: host in E:\tutorial\code\4.2\scope.php on line 16
demo();
从作用域来说,PHP 变量分为三种:局部变量(Local)、全局变量(Global)和静态变量(Static)。
局部变量是指在函数内部定义的变量,只能在函数内部使用,函数外部无法访问。上例代码中的$host
变量在函数内部可正常使用,在函数外部访问(第16行)则会出错,提示该变量未定义。
而全局变量是函数外部定义的变量,只能在函数以外使用,函数内部无法访问。上例代码中的$name
变量在函数外部正常使用(第14行),在函数内部访问(第8行)则会出错,提示该变量未定义。
如果函数内部想使用函数外部的变量呢?答案是使用global
关键字。请看下面的代码:
<?php
$name = '极速API';
function demo()
{
global $name;
echo $name;
echo PHP_EOL;
}
demo();// 输出:极速API
在函数内部,在想要使用的全局变量之前添加global
关键字,即可在函数内部访问全局变量。
静态变量
PHP 会在函数执行完成后删除所有的变量,但如果想保留某个局部变量,可以尝试使用static
关键字声明。static
关键字声明的变量仍属于局部变量,该变量所存储的信息都是函数最后一次调用时的值。静态变量只能被初始化为文字或常量,不能使用表达式。
请看下面的示例代码:
<?php
function demo()
{
static $count = 0;
echo $count;
$count++;
}
demo();// 输出:0
echo PHP_EOL;
demo();// 输出:1
echo PHP_EOL;
demo();// 输出:2
echo PHP_EOL;
function demo2()
{
$count = 0;
echo $count;
$count++;
}
demo2();// 输出:0
echo PHP_EOL;
demo2();// 输出:0
echo PHP_EOL;
demo2();// 输出:0
我们写了两个函数用以对比,使用static
关键字后,变量$count
不再被重新赋值,而是保留了函数最后一次的执行结果。
以上就是 PHP 变量与常量的详细内容,在讲解数据类型之前,下一节我们将先讲解在之后的教程(其实之前也出现过)中的基本输出方法。