数据类型

WBOY
Release: 2016-06-23 13:26:16
Original
985 people have browsed it

类型简介

PHP 支持 8 种原始数据类型。

  • 四种标量类型:

    • boolean(布尔型,不区分大小写)

    • integer(整型)

    • float(浮点型,也称作double)

    • string(字符串)

  • 两种复合类型:

    • array(数组)

    • object(对象)

  • 最后是两种特殊类型:

    • resource(资源)

    • NULL(无类型)

如果想查看某个表达式的值和类型,用var_dump()函数。

<?php $a = array(1, 2, array("a", "b", "c"));var_dump($a);$b = 3.1;$c = true;var_dump($b, $c);
Copy after login

上面的代码通过var_dump()打印变量的相关信息,输出结果如下所示(PHP版本5.5.12)。

array (size=3)  0 => int 1  1 => int 2  2 =>     array (size=3)      0 => string 'a' (length=1)      1 => string 'b' (length=1)      2 => string 'c' (length=1)float 3.1boolean true
Copy after login

如果只是想得到一个易读懂的类型的表达方式用于调试,用gettype()函数。要查看某个类型,不要用gettype(),而用is_type函数。使用is_type可以对参数进行过滤。

如果要将一个变量强制转换为某类型,可以对其使用强制转换或者settype()函数。注意变量根据其当时的类型在特定场合下会表现出不同的值。

boolean布尔类型

特别注意,当转换为boolean时,以下值被认为是FALSE:

  • 空字符串,以及字符串 "0"

  • 不包括任何元素的数组

只要是对象,返回值均为TRUE。

下面这段程序能加深对boolean类型转换的理解。

<?php var_dump((bool) array());  // boolean falsevar_dump((bool) "");  // boolean falsevar_dump((bool) "0");  // boolean falsevar_dump((bool) "00");  // boolean truevar_dump((bool) "false");  // boolean truevar_dump((bool) (new stdClass()));  // boolean truevar_dump((bool) ((object) array()));  // boolean true
Copy after login

integer整型

要使用八进制表达,数字前必须加上0(零)。
要使用十六进制表达,数字前必须加上0x。
要使用二进制表达,数字前必须加上0b。
二进制表达的integer自PHP 5.4.0起可用。

integer值的字长可以用常量PHP_INT_SIZE来表示,最大值可以用常量PHP_INT_MAX来表示。

<?php var_dump(PHP_INT_SIZE);  // int 4var_dump(PHP_INT_MAX);  // int 2147483647var_dump(01090);  // int 8  八进制 010 = 十进制 8
Copy after login

上面程序最后一条语句,处理八进制时发生一件怪事。那是因为,如果向八进制数传递了一个非法数字(即8或9),则后面其余数字会被忽略。

如果给定的一个数超出了integer的范围,将会被解释为float。同样如果执行的运算结果超出了integer范围,也会返回float。

PHP中没有整除的运算符。1/2产生出float 0.5。值可以舍弃小数部分强制转换为integer,或者使用round()函数可以更好地进行四舍五入。

手册中说,决不要将未知的分数强制转换为integer,这样有时会导致不可预料的结果。

<?php echo (int)((0.1 + 0.7) * 10);
Copy after login

这段程序的输出结果为7,永远不要相信浮点数!

float浮点型

某些数学运算会产生一个由常量NAN所代表的结果。此结果代表着一个在浮点数运算中未定义或不可表述的值。任何拿此值与其它任何值进行的松散或严格比较的结果都是FALSE。

string字符串

一个字符串string就是由一系列的字符组成,其中每个字符等同于一个字节。实现方式是一个由字节组成的数组再加上一个整数指明缓冲区长度。这意味着PHP只能支持256的字符集,因此不支持Unicode。那中文是怎样显示的呢?先把疑问记录下来。

字符串有4中语法表达方式:

  • 单引号

  • 双引号

  • heredoc

  • nowdoc

单引号

要表达一个单引号自身,需在它的前面加个反斜线(\)来转义。
要表达一个反斜线自身,则用两个反斜线(\\)。
其它任何方式的反斜线都会被当成反斜线本身。

但是,如果单引号包裹的字符串中只有一个反斜线,反斜线也会输出,这是为什么呢?

双引号

可以对转义字符进行解析,最重要的特征是变量会被解析。

单引号、双引号都支持字符串多行录入。

heredoc结构

这种结构在以往的编程中使用的较少,这里详细学习一下。

结构大致如下:
运算符<<<之后提供标识符,然后换行。
接下来是字符串本身。
最后用前面定义的标识符作为结束标志。

结束时所引用的标识符必须在该行的第一列,这意味着标识符不能缩进,这行除了可能有一个分号(;)外,绝对不能包含其它字符。

Heredocs结构不能用来初始化类的属性。自PHP 5.3起,此限制仅对heredoc包含变量时有效。

Heredoc 结构就象是没有使用双引号的双引号字符串,转义规则同双引号。

nowdoc结构

nowdoc结构与heredoc相似,只是跟在运算符<<<后面的标识符要用单引号括起来。

就象heredoc结构类似于双引号字符串,nowdoc结构是类似于单引号字符串的。nowdoc中不进行解析操作。这种结构很适合用于嵌入PHP代码或其它大段文本而无需对其中的特殊字符进行转义。nowdoc结构可以用在任意的静态数据环境中,最典型的示例是用来初始化类的属性或常量。

变量解析

变量解析有两种语法规则,一种是简单规则,一种是复杂规则。简单规则最常用、最方便,这里详细学习一下复杂语法规则。复杂规则语法的显著标记是用花括号包围的表达式。

复杂语法不是因为其语法复杂而得名,而是因为它可以使用复杂的表达式。 由于{无法被转义,只有$紧挨着{时才会被识别。

存取和修改

可以以数组形式访问字符串,用超出字符串长度的下标写入将会拉长该字符串并以空格填充。非整数类型下标会被转换成整数。写入时只用到了赋值字符串的第一个字符。用空字符串赋值则赋给的值是NULL字符。PHP的字符串在内部是字节组成的数组。因此用花括号访问或修改字符串对多字节字符集很不安全。

字符串可以用 '.'(点)运算符连接起来,注意 '+'(加号)运算符没有这个功能。

一个布尔值boolean的TRUE被转换成string的"1"。boolean的FALSE被转换成""(空字符串)。字符串转换为数值,该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0(零)。

PHP的优势就体现在字符串处理的方便上,对于string的操作有很多有用的函数,可以运用各种函数,还有正则表达式。

PHP 并不特别指明字符串的编码,字符串会被按照该脚本文件相同的编码方式来编码。因此,操作文本的函数必须假定字符串是如何编码的。不幸的是,PHP关于此的函数有很多变种,关于PHP的字符串处理函数还需多加学习。

array数组

PHP中的数组实际上是一个有序映射,映射是一种把values关联到keys的类型。

可以用array()语言结构来新建一个数组。它接受任意数量用逗号分隔的“键(key)=>值(value)对”。自5.4起可以使用短数组定义语法,用[]替代array()。key可以是integer或者string,value可以是任意类型。

key会有如下的强制转换和规则:

  • 包含有合法整型值的字符串会被转换为整型。

  • 浮点数也会被转换为整型,意味着其小数部分会被舍去。

  • 布尔值也会被转换成整型。

  • null会被转换为空字符串,即键名null实际会被储存为""。

  • 数组和对象不能被用为键名。

  • 如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。

  • 如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。

<?php $a = array('20' => 'a', '02' => 'b');var_dump($a);
Copy after login

通过上面的规则可知,这段代码的输出结果如下:

array (size=2)  20 => string 'a' (length=1)  '02' => string 'b' (length=1)
Copy after login

如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值加上1(但是最小为0)。要删除某键值对,对其调用unset()函数,该函数允许删除数组中的某个键,但要注意数组将不会重建索引。

<?php $a = array('a', 'b' => 'b');$a[] = 'c';var_dump($a);unset($a[1]);var_dump($a);
Copy after login

对于上面这段程序,输出为:

array (size=3)  0 => string 'a' (length=1)  'b' => string 'b' (length=1)  1 => string 'c' (length=1)array (size=2)  0 => string 'a' (length=1)  'b' => string 'b' (length=1)
Copy after login

应该始终在用字符串表示的数组索引上加上引号。例如用$foo['bar']而不是$foo[bar]。此代码中有一个未定义的常量(bar)而不是字符串('bar'-注意引号),而 PHP 可能会在以后定义此常量。

foreach控制结构是专门用于数组的。它提供了一个简单的方法来遍历数组。

下面的示例程序,通过读取目录填充数组,这里涉及到几个函数的使用。

<?php $handle = opendir('.');while(false !== ($file = readdir($handle))) {    $files[] = $file;}closedir($handle);var_dump($files);
Copy after login

对于任意integer,float,string,boolean和resource类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。

object对象

要创建一个新的对象 object,使用 new 语句实例化一个类。

如果将一个对象转换成对象,它将不会有任何变化。如果其它任何类型的值被转换成对象,将会创建一个内置类 stdClass 的实例。如果该值为 NULL,则新的实例为空。数组转换成对象将使键名成为属性名并具有相对应的值。对于任何其它的值,名为 scalar 的成员变量将包含该值。

<?php class foo {    function do_foo() {        echo 'Doint foo.';    }}$bar = new foo;$bar->do_foo();var_dump($bar);$obj = (object) 'hello';var_dump($obj);
Copy after login

上面的示例程序输出结果为:

Doint foo.object(foo)[1]object(stdClass)[2]  public 'scalar' => string 'hello' (length=5)
Copy after login

resource资源类型

资源resource是一种特殊变量,保存了到外部资源的一个引用。资源使用的所有外部资源都会被垃圾回收系统释放,很少需要手工释放内存。但是,持久数据库连接比较特殊,它们不会被垃圾回收系统销毁。

NULL

NULL类型只有一个值,就是不区分大小写的常量NULL。

callback回调类型

第一次接触到这个概念,有点陌生。

自PHP 5.4起可用callable类型指定回调类型callback。

手册示例程序中使用了很多call_user_func函数,先把这函数理一下。call_user_func把第一个参数作为回调函数(callback),并且将其余的参数作为回调函数的参数。返回回调函数的返回值,如果错误则返回FALSE。

回调函数可以是简单函数、对象方法、静态类方法,回调函数的几种使用方法如下所示:

  • 调用用户自定义的简单函数,以string类型传递其名称。

  • <?php function my_callback_function() {    echo 'hello, world.';}call_user_func('my_callback_function');
    Copy after login
  • 调用类的静态成员方法,类及方法被作为数组传递,下标0包含该对象,下标1包含方法名。

  • <?php class MyClass {    static function myCallbackMethod() {        echo 'Hello, world.';    }}call_user_func(array('MyClass', 'myCallbackMethod'));
    Copy after login
  • 调用已实例化的对象方法。

  • <?php class MyClass {    static function myCallbackMethod() {        echo 'Hello, world.';    }}$obj = new MyClass;call_user_func(array($obj, 'myCallbackMethod'));
    Copy after login
  • 调用静态类方法。

  • <?php class MyClass {    static function myCallbackMethod() {        echo 'Hello, world.';    }}call_user_func('MyClass::myCallbackMethod');
    Copy after login
  • 调用父类静态成员方法。

  • <?php class A {    public static function who() {        echo "A\n";    }}class B extends A {    public static function who() {        echo "B\n";    }}call_user_func(array('B', 'parent::who'));
    Copy after login

    除了普通的用户自定义函数外,create_function()可以用来创建一个匿名回调函数。

    类型转换

    PHP是弱类型语言,变量类型根据使用该变量的上下文所决定的。

    (全文完)

    Related labels:
    source:php.cn
    Statement of this Website
    The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
    Popular Tutorials
    More>
    Latest Downloads
    More>
    Web Effects
    Website Source Code
    Website Materials
    Front End Template