1. Chapter6 变量和数据类型

1.1. 变量

程序就是使用计算机的运算能力对一系列的数值进行高效的计算,这些数值在程序中存放的位置,就是变量。PHP是弱类型语言,所以和其他语言相比,PHP对变量支持无需声明,可以直接使用

一个PHP变量使用美元符号$来标识,美元符号后跟上变量名即为一个变量。例如下面一行代码定义了一个变量a,它的值是100。

$a = 100;

一行代码也是一条语句,在PHP中,一条语句以分号;结束。

变量的名字是开发过程中开发者自己定义的,定义变量时,要遵守变量的命名规则。

  1. 变量的名字只允许数字、字母、下划线。
  2. 变量名不能以数字作为开头。
  3. 自定义的变量名不能与PHP的保留关键字重名。

变量都会有默认值,如果变量没有进行赋值而直接使用,就会引用到变量的默认值。默认值依变量类型而定。具体我们在变量类型中进行详细介绍。

1.2. 数据类型

变量也有类型,程序会根据变量的类型来存放不同种类的变量。整数存在整型变量中,小数存在浮点型变量中,字符串存在字符串类型的变量中……等等。由于PHP是弱类型语言,所以对变量类型的要求不会像C、Java等语言那样要求十分严格。在变量类型方面,我们开发时尽管使用就好。如果没有遇到变量类型引发的问题,我们在开发过程中是不需要特别关注变量类型的。

下表列举了PHP中常见的数据类型。

PHP关键字 变量类型 默认值 举例
int、integer 整型 0 $a = 3;
float、double 浮点型 0 $a = 3.3;
bool、boolean 布尔型 false $a = true;
string 字符串类型 '' $a = 'This is a string';$a = "This is a string";
array 数组类型 [] $a = array('key' => 'value');
null 空类型 null $a;var_dump($a);

此外,还有object(对象)类型,在这里不作列举,等到接触过PHP的面向对象特性之后,你就会了解object类型了。

1.3. 获取变量的数据类型

PHP的内置函数gettype可以获取到变量的类型,返回字符串形式的变量类型的英文单词。

同时也可以使用var_dump来输出变量,也可以获取到变量的类型。

<?php
    $a = 3;
    $b = 3.3;
    $c = true;
    $d = 'This is a string';
    $e = ['key' => 'value'];
    $f;

    echo 'a的变量类型是:'.gettype($a).'<br/>';
    echo 'b的变量类型是:'.gettype($b).'<br/>';
    echo 'c的变量类型是:'.gettype($c).'<br/>';
    echo 'd的变量类型是:'.gettype($d).'<br/>';
    echo 'e的变量类型是:'.gettype($e).'<br/>';
    echo 'f的变量类型是:'.gettype($f).'<br/>';

    var_dump($a);
    var_dump($b);
    var_dump($c);
    var_dump($d);
    var_dump($e);
    var_dump($f);

这篇代码的运行结果是

可以看到,gettype函数只能获取到变量类型的字符串,而var_dump则可以输出变量类型和变量的值。两个方法适用场景不同,在未来的开发中都有可能会用到。

1.4. 判断变量是否属于某一个变量类型

PHP内置了一系列的判断类型的函数,它们统一的命名规则是is_type()。它们的参数都是一个变量,返回值都是bool类型,如果该变量是对应的类型则返回true,否则返回false。这一组函数列举如下。

函数名 别名 作用
is_int is_integeris_long 是否为整型
is_float is_double 是否为浮点型
is_string 是否为字符串
is_bool 是否为布尔型
is_null 是否是NULL
is_array 是否为数组
is_object 是否为对象
is_numeric 是否为数字或数字字符串

1.5. “空”

在PHP中,有几种与“空”相关的变量,需要特别注意。

1.5.1. 空字符串

如下这种方式创建的字符串就是空字符串,在获取前端传来的数据时很常见。

$a = '';

或者是

$b = "";

1.5.2. null

null是PHP中一种特殊的类型,叫做“空类型”。通常只有这两种方式来创建一个空类型的变量:

$a;
$a = null;

1.5.3. 判断是否为空

可以使用is_null这个函数来判断变量的值是否为空。如果对应数组的话,可以使用empty函数来判断数组是否为空。如果是字符串,则可以使用$a == ''这种方式来判断字符串是否为空。

1.5.4. 判断变量是否定义

变量为空与变量未定义是两种完全不同的状态,而且这两种状态容易混淆。变量为空,意味着变量已经定义,但是没有赋值,或者因为某种原因,导致变量没有了值;变量未定义,是指在当前程序中根本没有存在过要使用的变量。

变量是否已经定义,可以使用isset函数来判断。

1.6. 强制类型转换

由于PHP是弱类型语言,变量会由系统根据变量值自动指派一个变量类型,这种机制虽然方便,但对有些场景来说是有缺陷的。当我们需要自己指派一个变量的类型的时候,就用到了强制类型转换

强制类型转换的方式是,在变量左边加上(type)形式的变量类型关键字。例如

$a = '123';
$b = (int)$a;

会将本来是字符串的变量$a强制转换为整型。

强制类型转换在某些情况下可能会使变量值的精度受损,或者是丢失值。例如

$a = 123.45;
(int)$a;        // $a => 123

会使a的值变成123,直接丢失掉小数点后面的值。

这种情况

$a = 'abc';
(bool)$a;        // $a => true

会使a的值变成true。

当遇到一些奇怪的使用场景时,强制类型转换就会变得不那么可控,例如

$a = null;
(string)$a;     // $a => ''

所以,强制类型转换的功能应妥善使用,根据需求使用即可。切勿将毫无关联的两种类型互相转换,类似的操作会使程序增加更多的不可控因素。

1.7. 字符和字符串

在PHP中,对“字符”和“字符串”的区分并不是很强,可以理解为“字符”的概念包含在“字符串”的概念中。“字符”即单个的一个字母、数字、英文符号。下面几行代码的作用都是定义了一个变量并存入一个字符。

$a = 'a';
$b = '1';
$c = ',';

多个字符在一起则组成字符串,例如下面几行代码都定义了一个字符串。

$a = 'china';
$b = 'php is the best server side language';
$c = "asdfghjkl";

声明字符串的形式有两种,一种是用单引号夹住字符串的内容,另一种是则用双引号。二者的区别在于,双引号会解析其中的变量值,单引号会将其中的内容全部当成字符串。例如下面一段代码对此有所体现。

在开发过程中,使用单引号声明的字符串性能会更好,因为PHP无需解析字符串是否包含需要处理的变量。

//string.php
$price = 12;
echo "青菜的价格是{$price}元<br/>";
echo '青菜的价格是$price元';

这段代码的运行结果是

为了在单引号情况下也能插入变量值,我们通常会使用字符串连接的方式。连接两个字符串要使用运算符.,就是英文的小数点符号。.可以将两边的字符串连接起来组成新的字符串。例如上面的例子可以改写成下面这一行代码。

//string.php
$price = 12;
echo '青菜的价格是'.$price.'元';

运行的结果与上例第二行的结果是相同的。

1.8. 转义字符

在编程中,我们有时候会试图向程序描述一些键盘上所没有的内容,例如“换行”。通常我们在键盘上按下回车键即可输入一个换行,但程序是以行为单位的,在代码中输入一个回车键,代码就被分成两行了。类似这种情况,有一类字符被特别地称为“转义字符”,被用来描述“键盘上所没有的内容”。一些常用的转义字符列举如下。

转义字符 转义之后表达的内容 举例
\n 换行,接下来的内容会另开一行
\t 制表符,接下来的内容会向前移动一个tab的距离
\' 一个单引号 '
\" 一个双引号 "
\/ 一个斜线 /
\\ 一个反斜线 \
\$ 一个美元符号 $

需要注意的是,转义字符只能在双引号声明的字符串中使用,在单引号中使用转义字符,会按原样输出。下面几行代码展现了转义字符的作用。

//string.php
echo "下一句话会在下一行出现\n是吧";
echo "下一句话会在下个制表符出现\t是吧";
echo "接下来由各种符号出现:\'\"\/\\\$";
echo '单引号中转义字符不能用:\n\t\'\"\/\\\$';
echo "\n";

这段代码在浏览器中的运行结果是 看上图的运行结果,好像并没有体现转义字符的作用。这时候我们可以在HTML代码中试一下,在body标签中输入回车,会按照换行来显示吗?原来在HTML中,换行、制表符、多个空格,都会按照一个空格来处理。所以我们这里的\n\t,都没法体现出作用。我们可以尝试在命令行中运行这个程序。

在命令行中运行的结果这这样的。

这样看来则体现了转义字符的作用。

1.9. 数组

数组也是PHP中所支持的一种强大的数据类型。将任意多个值或键值对放在一起即为数组。

PHP中使用array函数来声明一个数组,如果你的PHP版本不小于5.4,还可以使用一对方括号[]来更简洁地声明一个数组。例如下面两段代码声明了两个相同的数组。

$arr = array('username' => 'abc123','password' => 'pwd123');
$arr = ['username' => 'abc123','password' => 'pwd123'];

如果输出这个数组

//array.php
var_dump($arr);

则可以看到运行结果

PHP中的数组非常强大,可以将任意一种结构的数据整理成需要的多维数组。PHP中支持索引数组和关联数组两种形式,对C语言的数组功能做了极大的扩充。C语言的数组、结构体;JavaScript中的对象等,都可以涵盖在PHP的数组中。

1.10. 字符串与数组互相转化

在编程中我们会有这样一种需求,我们会得到一种很有规律的字符串,并且希望将这个字符串的各个部分分别进行处理。这时候我们可以使用explode函数来将字符串分割成数组。explode的使用方式是

array explode ( string $delimiter , string $string [, int $limit ] )
参数 说明
delimiter 使用哪个字符来分割整个字符串
string 要分割的字符串
limit 非必需。如果设置了 limit 参数并且是正数,则返回的数组包含最多 limit 个元素,而最后那个元素将包含 string 的剩余部分;如果 limit 参数是负数,则返回除了最后的 -limit 个元素外的所有元素;如果 limit 是 0,则会被当做 1。

explode函数的使用方式是

//array.php
$str = 'apple,grape,banana,pear';
$fruits = explode(',',$str);
var_dump($str);
echo '<br/>';
var_dump($fruits);

这段代码的运行结果是

相对的,还有另外一个函数是implode,它可以将数组元素使用某一个字符串来连接起来形成一个字符串。例如上面的数组可以使用这种方式来还原:

$fruit_str = implode($fruits);
var_dump($fruit_str);

数组和字符串是PHP编程过程中两个最重要的变量类型,在后面的开发中也会有所体现。在这里只是简单提及,在后面还会有更详细的内容来详细介绍数组和字符串。

这本书是xt写的/上次修改: 2019-04-17 14:57:44

results matching ""

    No results matching ""