PHP从头开始-2

来源:互联网 发布:编程教程学习 编辑:程序博客网 时间:2024/06/04 19:40

类型

简介

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

四种标量类型:
1. boolean (布尔型)
2. integer (整型)
3. float (浮点型,也称作 double )
4. string (字符串)

两种复合类型:
1. array (数组)
2. object (对象)

最后是两种特殊类型:
1. resource (资源)
2. NULL (无类型)

为了确保代码的易读性,本手册还介绍了一些伪类型:
1. mixed (混合类型)
2. number (数字类型)
3. callback (回调类型)

以及伪变量 $…。

本手册是PHP Manual 2015中文手册

查看某个表达式的值和类型,用 var_dump()
只得到一个一度东的类型的表达方式,用 gettype()
判断是否是一个类型,用 is_type()

is_array -- 检测变量是否是数组is_bool --  检测变量是否是布尔型 is_callable --  检测参数是否为合法的可调用结构 is_double -- is_float() 的别名is_float -- 检测变量是否是浮点型is_int -- 检测变量是否是整数is_integer -- is_int() 的别名is_long -- is_int() 的别名is_null --  检测变量是否为 NULL is_numeric --  检测变量是否为数字或数字字符串 is_object -- 检测变量是否是一个对象is_real -- is_float() 的别名is_resource --  检测变量是否为资源类型 is_scalar --  检测变量是否是一个标量 is_string -- 检测变量是否是字符串

将一个变量强制转换为某类型,可以对其使用强制转换或者 settype() 函数。

Boolean 布尔类型

语法

true或者false,不区分大小写

转换为布尔值

(bool)或者 (boolean)来强制转换。但是很多时候会自动转换。
当转换为 boolean 时,以下值被认为是 FALSE :
1. 布尔值 FALSE 本身
2. 整型值 0(零)
3. 浮点型值 0.0(零)
4. 空字符串,以及字符串 “0”
5. 不包括任何元素的数组
6. 不包括任何成员变量的对象(仅 PHP 4.0 适用)
7. 特殊类型 NULL(包括尚未赋值的变量)
8. 从空标记生成的 SimpleXML 对象
所有其它值都被认为是 TRUE (包括任何资源)。

Integer 整型

语法

可以使用十进制,十六进制,八进制或者二进制表示,前面可以加上可选的符号(+,-)

  • 八进制——0
  • 十六进制——0x
  • 二进制——0b

    整型数字长与平台有关,最大值可以用常量PHP_INT_MAX来表示,如果想一个八进制数传递一个非法数字,则后面其余的数字会被忽略。

    整数溢出

    如果超出integer范围,会被解释为float,返回值也会返回float。
    php没有整除运算,PHP 中没有整除的运算符。1/2 产生出 float 0.5。

转换为整型

要明确地将一个值转换为 integer ,用 (int) 或 (integer) 强制转换。还可以使用intval()将一个值转换成整型。

从布尔值转换

FALSE 将产生出 0(零), TRUE 将产生出 1(壹)。

从浮点型转换

当从浮点数转换成整数时,将向下取整。

如果浮点数超出了整数范围(32 位平台下通常为 +/- 2.15e+9 = 2^31,64 位平台下通常为 +/- 9.22e+18 = 2^63),则结果为未定义,因为没有足够的精度给出一个确切的整数结果。在此情况下没有警告,甚至没有任何通知!

决不要将未知的分数强制转换为 integer ,这样有时会导致不可预料的结果。
<?php
echo (int) ( ( 0.1 + 0.7 ) * 10 ); // 显示 7!
?>

从字符串转换

见后文,字符串

从其它类型转换

没有定义从其它类型转换为整型的行为。

Float 浮点型

支持科学计数法,可以使用下列语法定义

<?php $a  =  1.234 ;  $b  =  1.2e3 ;  $c  =  7E-10 ; ?> 

浮点数的精度

浮点数的精度有限。尽管取决于系统,PHP 通常使用 IEEE 754 双精度格式,则由于取整而导致的最大相对误差为 1.11e-16。非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。

此外,以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118…。

所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数。

比较浮点数

使用机器极小值或者叫做最小单元取整数。

转换为浮点数

见上下文

NaN

Not a Number!
表示浮点运算中未定义或者不可表述的值。所有比较都会返回false,包括与自身。使用is_nan()函数。

String 字符串

每个字符等于一个字节,只能支持256的字符集,因此不支持Unicode。

语法

  • 单引号
  • 栓引号
  • heredoc语法结构
  • nowdoc语法结构

双引号

对其中的特殊字符进行解析

序列 含义 \n 换行(ASCII 字符集中的 LF 或 0x0A (10)) \r 回车(ASCII 字符集中的 CR 或 0x0D (13)) \t 水平制表符(ASCII 字符集中的 HT 或 0x09 (9)) \v 垂直制表符(ASCII 字符集中的 VT 或 0x0B (11))(自 PHP 5.2.5 起) \e Escape(ASCII 字符集中的 ESC 或 0x1B (27))(自 PHP 5.4.0 起) \f 换页(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起) \ 反斜线 $ 美元标记 \” 双引号 [0-7]{1,3} 符合该正则表达式序列的是一个以八进制方式来表达的字符 \x[0-9A-Fa-f]{1,2} 符合该正则表达式序列的是一个以十六进制方式来表达的字符

其中的变量会被解析

单引号

只转义单引号(’)和反斜线(\)两个,其他均不转义
不解析变量

Heredoc结构

<<<后面提供一个标识符,然后换行,接下来是字符串,结束时用前面的标识符作为结束标志。
结束标志必须在行首,不包含任何缩进。
变量和特殊字符会被解析

Nowdoc结构

类似heredoc结构,但是不进行解析!

变量解析

简单语法

遇到一个($)时就尽可能解析,可以使用花括号来明确变量名的界限。
array索引和object属性也可以本解析。

复杂语法(花括号)

可以使用复杂的表达式
$需要紧跟在{后面才会被解析到。

存取和修改字符串中的字符

可以把String当作字符组成的array来访问,例如:$str[3],也可以使用花括号$str{3}

  • 超出下标的写入会拉长字符串并填充空格
  • 非整形下标会被转换成整型
  • 负数下标读取会返回空字符串
  • 用空字符串赋值则赋给的值为NULL

    字符串在内部是字节组成的数组,因此用花括号访问修改字符串对多字节字符不安全。

有用的函数和运算符

字符串可以使用.运算符连接,没有+运算符这个功能

转换成字符串

  • 一个值用 (string) 或用 strval() 函数
  • 一个布尔值 boolean 的 TRUE 被转换成 string 的 “1”。 Boolean 的 FALSE 被转换成 “”(空字符串)。

  • 一个整数 integer 或浮点数 float 被转换为数字的字面样式的 string (包括 float 中的指数部分)。

  • 数组 array 总是转换成字符串 “Array”,因此, echo 和 print 无法显示出该 数组 的内容。
  • 在 PHP 4 中对象 object 总是被转换成字符串 “Object”,为了得到对象的类的名称,可以用 get_class() 函数。自 PHP 5 起,适当时可以用 __toString 方法。
  • 资源 resource 总会被转变成 “Resource id #1” 这种结构的字符串,其中的 1 是 PHP 在运行时分配给该 resource 的唯一值。不要依赖此结构,可能会有变更。要得到一个 resource 的类型,可以用函数 get_resource_type() 。

  • NULL 总是被转变成空字符串。

如上面所说的,直接把 array , object 或 resource 转换成 string 不会得到除了其类型之外的任何有用信息。可以使用函数 print_r() 和 var_dump() 列出这些类型的内容。

字符串转换为数值

如果该字符串没有包含 ‘.’,’e’ 或 ‘E’ 并且其数字值在整型的范围之内(由 PHP_INT_MAX 所定义),该字符串将被当成 integer 来取值。其它所有情况下都被作为 float 来取值。
如果字符串以合法的数值开始则使用该值,否则值为0。

Array 数组

php的数组实际上是有序映射,一次可以当作数组,列表,散列表,结合,栈,队列等。树形结构的多维数组也是允许的。

语法

定义数组array()

array($key => value,.....),其中键是一个interger或者string,值可以使任意类型。
key 会有如下的强制转换:
1. 包含有合法整型值的字符串会被转换为整型。例如键名 “8” 实际会被储存为 8。但是 “08” 则不会强制转换,因为其不是一个合法的十进制数值。
2. 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
3. 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
4. Null 会被转换为空字符串,即键名 null 实际会被储存为 “”。
5. 数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。
如果多个单元使用了同一个键,那么只保留最后一个,之前的都被覆盖了。

访问、新建、修改

方括号”[]”

删除

unset()函数
删除数组中的键值对不会重建索引,如果需要,可以使用array_values()函数

数组做什么和不做什么

应该始终在用字符表示的数组索引上加上引号

转换为数组

  • 对于任意 integer , float , string , boolean 和 resource 类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。
  • 如果一个 object 类型转换为 array ,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:整数属性不可访问;私有变量前会加上类名作前缀;保护变量前会加上一个 ‘*’ 做前缀。这些前缀的前后都各有一个 NULL 字符。
  • null转换为一个空数组

比较

可以用array_diff()和数组运算符来比较

例子 名称 结果 a+b 联合 ab 的联合。 a==b 相等 如果 ab 具有相同的键/值对则为 TRUE 。 a===b 全等 如果 ab 具有相同的键/值对并且顺序和类型都相同则为 TRUE 。 a!=b 不等 如果 ab 则为 TRUE 。 a<>b 不等 如果 ab 则为 TRUE 。 a!==b 不全等 如果 ab 则为 TRUE 。

“+” 运算符把右边的数组元素附加到左边的数组后面,两个数组中都有的键名,则只用左边数组中的,右边的被忽略。

Object对象

对象初始化

使用new实例化一个类

转换为对象

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

Resource资源类型

资源 resource 是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。

转换为资源

由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,因此将其它类型的值转换为资源没有意义。

释放资源

由于 PHP 4 Zend 引擎引进了引用计数系统,可以自动检测到一个资源不再被引用了(和 Java 一样)。这种情况下此资源使用的所有外部资源都会被垃圾回收系统释放。因此,很少需要手工释放内存。

持久数据库连接不会被垃圾回收系统销毁

NULL

表示一个变量没有值,NULL类型唯一的值就是null。一个变量在下列情况会被认为是null:
- 被赋值为null
- 尚未赋值
- 被unset()

语法

只有唯一值null,不区分大小写

Callback回调类型

一些函数可以接受用户自定义的回调函数作为参数,回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法。

传递

以String类型传递其名称。

<?php  // An example callback function function  my_callback_function () {    echo  'hello world!' ;} // An example callback method class  MyClass  {    static function  myCallbackMethod () {        echo  'Hello World!' ;    }} // Type 1: Simple callback call_user_func ( 'my_callback_function' );  // Type 2: Static class method call call_user_func (array( 'MyClass' ,  'myCallbackMethod' ));  // Type 3: Object method call $obj  = new  MyClass (); call_user_func (array( $obj ,  'myCallbackMethod' )); // Type 4: Static class method call (As of PHP 5.2.3) call_user_func ( 'MyClass::myCallbackMethod' ); // Type 5: Relative static class method call (As of PHP 5.3.0) 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' ));  // A ?> 

类型转换的判别

变量定义中不支持明确的类型定义,变量类型根据变量上下文决定。
自动类型转换并不会改变操作数本身的类型,改变的仅仅只是这些操作数被如何求值以及表达式本身的类型。

类型强制转换

允许的强制转换有:
1. (int), (integer) - 转换为整形 integer
2. (bool), (boolean) - 转换为布尔类型 boolean
3. (float), (double), (real) - 转换为浮点型 float
4. (string) - 转换为字符串 string
5. (array) - 转换为数组 array
6. (object) - 转换为对象 object
7. (unset) - 转换为 NULL (PHP 5)
(binary) 转换和 b 前缀转换支持为 PHP 5.2.1 新增。

0 0
原创粉丝点击