变量与常量

在任何一门编程语言里,变量都居于核心地位。

我们默认您已经掌握 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 变量与常量的详细内容,在讲解数据类型之前,下一节我们将先讲解在之后的教程(其实之前也出现过)中的基本输出方法。