PHP学习之手册整理(二)--------基础语法及数据类型

一、PHP标记

        PHP代码文件必须以<?php或 ?> 标签开始,纯PHP代码文件时可以忽略结尾的?>

二、从HTML中分离

        凡是在一对开始和结束标记之外的内容都会被 PHP 解析器忽略,这使得 PHP 文件可以具备混合内容。 可以使 PHP 嵌入到 HTML 文档中。

三、指令分隔符

        PHP 需要在每个语句后用分号结束指令。

四、注释

        PHP单行注释支持#和//,多行注释支持/**/,多行注释不支持嵌套。

五、数据类型

        PHP有八大数据类型:

1.  boolean(布尔类型),可以为true或者false。要明确地将一个值转换成boolean,(bool) 或者 (boolean) 来强制转换。但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制结构需要一个boolean参数时,该值会被自动转换。

  • 布尔值false本身
  • 整型值 0(零)
  • 浮点型值 0.0(零)
  • 空字符串,以及字符串 "0"
  • 不包括任何元素的数组
  • 不包括任何成员变量的对象(仅 PHP 4.0 适用)
  • 特殊类型 NULL(包括尚未赋值的变量)
  • 从空标记生成的 SimpleXML 对象
  • 所有其它值都被认为是True(包括任何资源;-1 和其它非零值(不论正负)一样,被认为是True) 

2.  integer(整型),整型值可以使用十进制,十六进制,八进制或二进制表示,前面可以加上可选的符号(- 或者 +)。要使用八进制表达,数字前必须加上 0(零)。要使用十六进制表达,数字前必须加上 0x。要使用二进制表达,数字前必须加上 0b。

<?php
$a = 1234; // 十进制数
$a = -123; // 负数
$a = 0123; // 八进制数 (等于十进制 83)
$a = 0x1A; // 十六进制数 (等于十进制 26)
?>

整型数的字长和平台有关,尽管通常最大值是大约二十亿(32 位有符号)。64 位平台下的最大值通常是大约 9E18。PHP 不支持无符号整数。Integer 值的字长可以用常量 PHP_INT_SIZE来表示,自 PHP 4.4.0 和 PHP 5.0.5后,最大值可以用常量 PHP_INT_MAX 来表示。

如果向八进制数传递了一个非法数字(即 8 或 9),则后面其余数字会被忽略:

<?php
var_dump(01090); // 八进制 010 = 十进制 8

?>

整数溢出

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

<?php
$large_number = 2147483647;
var_dump($large_number);                     // int(2147483647)

$large_number = 2147483648;
var_dump($large_number);                     // float(2147483648)

$million = 1000000;
$large_number =  50000 * $million;
var_dump($large_number);                     // float(50000000000)
?>


要明确地将一个值转换为 integer,用 (int)(integer) 强制转换。不过大多数情况下都不需要强制转换,因为当运算符,函数或流程控制需要一个 integer 参数时,值会自动转换。还可以通过函数 intval() 来将一个值转换成整型。 

如果浮点数超出了整数范围,则结果不可预知,因为没有足够的精度给出一个确切的整数结果。在此情况下没有警告,甚至没有任何通知!

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

<?php

echo (int) ( (0.1+0.7) * 10 ); // 显示 7!     (PHP中的浮点精度并不是像我们想的那样0.1就是0.1,他有可能是0.09999999,也可能是0.09999998,而不是精确的0.1,所以不要比较两个浮点数)

?>

3. float(浮点型)

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

浮点数的精度有限。尽管取决于系统,PHP 通常使用 IEEE 754 双精度格式,则由于取整而导致的最大相对误差为 1.11e-16。非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度的数学函数或者 gmp函数。

 

要测试浮点数是否相等,要使用一个仅比该数值大一丁点的最小误差值。该值也被称为机器极小值(epsilon)或最小单元取整数,是计算中所能接受的最小的差别值。

$a$b 在小数点后五位精度内都是相等的。

<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;

if(abs($a-$b) < $epsilon) {
    echo "true";
}
?>

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

由于 NAN 代表着任何不同值,不应拿 NAN 去和其它值进行比较,包括其自身,应该用 is_nan() 来检查。

4. 字符串(string)

字符串最大可以达到 2GB。

字符串分为单引号字符串,双引号字符串,heredoc,nowdoc

双引号解析变量和转义字符,单引号不解析(heredoc的作用同双引号,nowdoc的作用同单引号)

heredoc 句法结构:<<<。在该运算符之后要提供一个标识符,然后换行。接下来是字符串 string 本身,最后要用前面定义的标识符作为结束标志(结束标志前不能有缩进和换行,分号的前后也不能有任何空白或制表符)。

结束时所引用的标识符必须在该行的第一列,而且,标识符的命名也要像其它标签一样遵守 PHP 的规则:只能包含字母、数字和下划线,并且必须以字母和下划线作为开头。

nowdoc的语法结构同heredoc

字符串内的变量解析:
当字符串用双引号或 heredoc 结构定义时,其中的变量将会被解析。 
这里共有两种语法规则:一种简单规则,一种复杂规则。简单的语法规则是最常用和最方便的,它可以用最少的代码在一个 string 中嵌入一个变量,一个 array 的值,或一个 object 的属性。 复杂规则语法的显著标记是用花括号包围的表达式。

 简单语法
当 PHP 解析器遇到一个美元符号($)时,它会和其它很多解析器一样,去组合尽量多的标识以形成一个合法的变量名。可以用花括号来明确变量名的界线(或者其他除$外的特殊字符,比如#)。 

复杂(花括号)语法
复杂语法不是因为其语法复杂而得名,而是因为它可以使用复杂的表达式。 

任何具有 string表达的标量变量,数组单元或对象属性都可使用此语法。只需简单地像在 string 以外的地方那样写出表达式,然后用花括号 { 和 } 把它括起来即可。由于 { 无法被转义,只有 $紧挨着 { 时才会被识别。可以用 {\$ 来表达 {$。

存取和修改字符串中的字符
string 中的字符可以通过一个从 0 开始的下标,用类似 array 结构中的方括号包含对应的数字来访问和修改,比如 $str[42]。可以把 string当成字符组成的 array。

注意: string 也可用花括号访问,比如 $str{42}。 

注意:用超出字符串长度的下标写入将会拉长该字符串并以空格填充。非整数类型下标会被转换成整数。非法下标类型会产生一个 E_NOTICE 级别错误。用负数下标写入字符串时会产生一个E_NOTICE级别错误,用负数下标读取字符串时返回空字符串。写入时只用到了赋值字符串的第一个字符。用空字符串赋值则赋给的值是 NULL 字符。

注意:PHP 的字符串在内部是字节组成的数组。因此用花括号访问或修改字符串对多字节字符集很不安全。

转换成字符串 
一个值可以通过在其前面加上 (string) 或用 strval()函数来转变成字符串。在一个需要字符串的表达式中,会自动转换为 string。比如在使用函数 echo 或 print时,或在一个变量和一个 string 进行比较时,就会发生这种转换。类型和类型转换可以更好的解释下面的事情,也可参考函数 settype()。 
一个布尔值 boolean 的 TRUE 被转换成 string 的 "1"。Boolean 的 FALSE 被转换成 ""(空字符串)。这种转换可以在 boolean和 string 之间相互进行。 一个整数 integer 或浮点数 float 被转换为数字的字面样式的 string(包括 float中的指数部分)。数组 array 总是转换成字符串 "Array",对象 object 总是被转换成字符串 "Object",资源 resource 总会被转变成 "Resource id #1" 这种结构的字符串,其中的 1 是 PHP 在运行时分配给该 resource 的唯一值。不要依赖此结构,可能会有变更。NULL 总是被转变成空字符串。


字符串转换为数值 
当一个字符串被当作一个数值来取值,其结果和类型如下: 
如果该字符串没有包含 '.','e' 或 'E' 并且其数字值在整型的范围之内(由PHP_INT_MAX所定义),该字符串将被当成integer来取值。其它所有情况下都被作为float来取值。该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为0(零)。合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 'e' 或 'E' 后面跟着一个或多个数字构成。 
<?php
$foo = 1 + "10.5";                // $foo is float (11.5)
$foo = 1 + "-1.3e3";              // $foo is float (-1299)
$foo = 1 + "bob-1.3e3";           // $foo is integer (1)
$foo = 1 + "bob3";                // $foo is integer (1)
$foo = 1 + "10 Small Pigs";       // $foo is integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
$foo = "10.0 pigs " + 1;          // $foo is float (11)

$foo = "10.0 pigs " + 1.0;        // $foo is float (11)   

5. 数组(Array)

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

键(key)可是是一个整数 integer 或字符串 string

值(value)可以是任意类型的值

key 会有如下的强制转换:

  • 包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08"则不会强制转换,因为其不是一个合法的十进制数值。
  • 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8
  • 布尔值也会被转换成整型。即键名 true 实际会被储存为 1而键名 false 会被储存为 0
  • Null 会被转换为空字符串,即键名 null 实际会被储存为 ""
  • 数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type
PHP 数组可以同时含有 integer 和 string 类型的键名,因为 PHP 实际并不区分索引数组和关联数组。 
如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。
还可以只对某些单元指定键名而对其它的空置: 
<?php
$array = array(
         "a",
         "b",
    6 => "c",
         "d",
);
var_dump($array);

访问方式:方括号和花括号可以互换使用来访问数组单元(例如 $array[42] 和 $array{42} 在上例中效果相同)。

用方括号的语法新建/修改
可以通过明示地设定其中的值来修改一个已有数组。 
这是通过在方括号内指定键名来给数组赋值实现的。也可以省略键名,在这种情况下给变量名加上一对空的方括号([])。 
$arr[key] = value;   $arr[] = value;
如果 $arr还不存在,将会新建一个,这也是另一种新建数组的方法。不过并不鼓励这样做,因为如果 $arr 已经包含有值(例如来自请求变量的 string)则此值会保留而 [] 实际上代表着字符串访问运算符。初始化变量的最好方式是直接给其赋值。 

要修改某个值,通过其键名给该单元赋一个新值。要删除某键值对,对其调用 unset() 函数。

注意:unset() 函数允许删除数组中的某个键。但要注意数组将不会重建索引。如果需要删除后重建索引,可以用 array_values() 函数。 

在循环中改变数组
<?php
// PHP 5
foreach ($colors as &$color) {
    $color = strtoupper($color);
}
unset($color); 

foreach ($colors as $key => $color) {
    $colors[$key] = strtoupper($color);
}

print_r($colors);

6. 对象(object)
要创建一个新的对象 object,使用 new 语句实例化一个类: 
<?php
class foo
{
    function do_foo()
    {
        echo "Doing foo."; 
    }
}
$bar = new foo;

$bar->do_foo();

7. 资源类型(Resource) 
资源 resource是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。所有这些函数及其相应资源类型见附录。 

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

释放资源 

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

8. null

特殊的null值表示一个变量没有值。null类型唯一可能的值就是null。

在下列情况下一个变量被认为是null:

  • 被赋值为null。

  • 尚未被赋值。

  • 被unset()。

PHP 在变量定义中不需要(或不支持)明确的类型定义;变量类型是根据使用该变量的上下文所决定的。但是我个人建议提前声明,因为这样可以让程序可读性变得不错,不至于让别人读你的程序时,对一个突然冒出来的变量进行操作搞得一脸懵逼。

猜你喜欢

转载自blog.csdn.net/qq_41993206/article/details/80560988