PHP基础 数据类型 第二天

PHP 支持8种基本的数据类型。

四种标量类型:  

  两种复合类型:  

  最后是两种特殊类型:  

布尔类型

语法

要指定一个布尔值,使用关键字 TRUEFALSE。两个都不区分大小写。

<?php
$xlxz = true;
?>

通常你用某些运算符返回    boolean 值,并将其传递给控制流程

<?php
// == 是一个操作符,它检测两个变量是否相等,并返回一个布尔值
if ($action == "show_version") {
    echo "The version is 1.23";
}

// 这样做是不必要的...
if ($show_separators == TRUE) {
    echo "<hr>\n";
}

// ...因为可以使用下面这种简单的方式:
if ($show_separators) {
    echo "<hr>\n";
}
?>

转换为布尔值

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

当转换为 boolean 时,以下值被认为是 FALSE:  

  • the 布尔FALSE 自身    

  • the 整型值 0 (零)    

  • the 浮点型值 0.0 (零)    

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

  • 不包括任何元素的数组

  • 不包括任何成员变量的对象(仅PHP 4.0 适用)    

  • 特殊类型 NULL (包括尚未设定的变量)    

  • 从没有任何标记(tags)的XML文档生成的SimpleXML 对象    

所有其它值都被认为是 TRUE(包括任何资源)。

<?php
var_dump((bool) "");        // bool(false)
var_dump((bool) 1);         // bool(true)
var_dump((bool) -2);        // bool(true)
var_dump((bool) "foo");     // bool(true)
var_dump((bool) 2.3e5);     // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array());   // bool(false)
var_dump((bool) "false");   // bool(true)
?>

Warning

-1 和其它非零值(不论正负)一样,被认为是 TRUE

整型

语法

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

八进制表示数字前必须加上 0(零),十六进制表示数字前必须加上 0x

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

整数溢出

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

转换为整型

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

布尔值转换

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

浮点数转换  

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

浮点型

 浮点数(也叫浮点数,双精度数或实数)可以用以下任一语法定义:

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

字符串

 一个字符串 就是由一系列的字符组成,因此,一个字符就是一个字节。

语法

  一个字符串 通过下面的4种方法来定义:

单引号

定义一个字符串 的最简单的方法是用单引号把它包围起来 (标点符号 ')。  

如果想要输出一个单引号,需在它的前面加个反斜线 (\)。在单引号前或在字符串的结尾处 想要输出反斜线,输入两条 (\\)。注意,如果在任何其它的字符前加了反斜线,反斜线将会被直接输出。

Note:     不像双引号     和heredoc语法结构, 在单引号字符串中的变量 和特殊含义的字符将 不会 被替换。    


双引号

如果字符串是包围在双引号(")中, PHP将对一些特殊的字符进行解析:

Sequence Meaning
\n 换行 (LF or 0x0A (10) in ASCII)
\r 回车 (CR or 0x0D (13) in ASCII)
\t 水平方向的 tab(HT or 0×09 (9) in ASCII)
\v 竖直方向的 tab (VT or 0x0B (11) in ASCII) (since PHP 5.2.5)
\f 换页 (FF or 0x0C (12) in ASCII) (since PHP 5.2.5)
\\ 反斜线
\$ 美金dollar标记
\" 双引号
\[0-7]{1,3} 符合该表达式顺序的字符串是一个八进制的字符      
\x[0-9A-Fa-f]{1,2} 符合该表达式顺序的字符串是一个十六进制的字符


和单引号 字符串一样, 如果输出上述之外的字符,反斜线会被打印出来。 PHP5.1.1以 前,\{$var} 中的反斜线还不会被显示出来。  

用双引号定义的 字符串最重要的特征是变量会被进行替换.

Heredoc结构

第三种定义字符串的方法是用heredoc句法结构:<<<。在该提示 符后面,要定义个标识符,然后是一个新行。接下来是字符串 本身,最后要用前面定义的标识符作为结束标志。  

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

Warning

要注意的是结束标识符这行除了 可能有一个分号(;)外,绝对不能包括 其它字符。这意味着标识符不能缩进,分号的前后也不能有任何空白或tabs。更重要的是结束标识符的前面必须是个被本地 操作系统认可的新行标签,比如在UNIX和Mac OS X系统中是\n ,而结束标识符(可能有个分号)的后面也必须跟个 新行标签。    

如果不遵守该规则导致结束标签不“干净”,PHP将认为它不是结束标识符而继续寻找。如果在文件结束前也没有找到一个正确的结束标识符,PHP将会在最后一 行产生一个句法错误。    

Heredocs结构不能用来初始化class,而从PHP 5.3以后,则该限制只能用在包含变量的情况下。

Heredoc结构就象是没有使用双引号的双引号字符串, 这就是说在heredoc结构中引号不用被替换,但是上文中列出的字符(\n等)也可使用。 变量将被替换,但在heredoc结构中字符串表达复杂变量时,要格外小 心。

Nowdoc结构

就象heredoc结构类似于双引号字符串,Nowdoc结构是类似于单引号字符串的。Nowdoc结构很象heredoc结构,但是nowdoc不进行解析操作 。 这种结构很适合用在不需要进行转义的PHP代码和其它大段文本。与SGML的<![CDATA[ ]]> 结构是用来声明大段的不用解析的文本类似,nowdoc结构也有相同的特征。  

一个nowdoc结构也用和heredocs结构一样的标记 <<<, 但是跟在后面的标志符要用 单引号括起来,就像<<<'EOT'这样。heredocs结构的所有规则也同样适用于nowdoc结 构,尤其是结束标志符的规则。

Note:    

不象 heredocs结构,nowdocs结构可以用在任意的静态数据环境中,最典型的示例是用来初始化类的属性或常量:

Note:    

Nowdoc结构是在PHP 5.3.0中加入的。

变量解析

字符串用双引号或heredoc结构定义时,其中的变 量将会被解析。  

这里共有两种语法规则:一种简单 规则,一种复杂规 则。简单的句法规则是最常用和最方便的, 它可以用最少的代码在一个字符串中加入变量, 数组 值,或  对象属性。  

复杂的句法规则是在PHP4以后加入的,被花括号包围的表达式是其明显标记。  

简单句法规则

当PHP解析器遇到一个美元符号 ($) , 它会和其它很多解析器一样,去尽量形成一个合法的变量名。可以用花括 号来明确变量名的界线。


<?php
$beer = 'Heineken';
echo "$beer's taste is great"; //有效;单引号"'"是非法的变量名组成元素
echo "He drank some $beers"; //无效;字母s是有效的变量名组成元素,但是这里的变量是$beer
echo "He drank some ${beer}s"; // 有效
echo "He drank some {$beer}s"; // 有效
?>

类似的,一个 数组 索引或一个 对象 属性也可被解析。数组索引要用方括号(]) 来表示边际, 对象属性则是和上述的变量规则相同。


<?php
// 下面的例子是在字符串中引用数组
// 当数组处于字符串外部时,要把数组的值用括号括起来且不要用花括号{ }

// 显示所有错误
error_reporting(E_ALL);

$fruits = array('strawberry' => 'red', 'banana' => 'yellow');

// 有效;但是注意在字符串外面不能这样引用数组
echo "A banana is $fruits[banana].";

// 有效
echo "A banana is {$fruits['banana']}.";

// 有效,但是PHP会先寻找常量banana
echo "A banana is {$fruits[banana]}.";

// 无效,要用花括号,这里将会产生一个解析错误
echo "A banana is $fruits['banana'].";

// 有效
echo "A banana is " . $fruits['banana'] . ".";

// 有效
echo "This square is $square->width meters broad.";

// 无效,解决方法见复杂结构
echo "This square is $square->width00 centimeters broad.";
?>


复杂句法规则

复杂句法规则不是结构复杂而命名,而是因为它可以使用复杂的表达式。    

任何想用在字符串中标量变量,数组变量或对象属性都可使用这种方法。     只需简单地像在字符串以外的地方那样写出表达式, 然后用花括号{和     }把它括起来。 由于 { 无法被转义,只有$ 要紧挨着 {才会被认出来,可以用 {\$ 来表达 {$。下面的示例可以更好的解释:

<?php
// 显示所有错误
error_reporting(E_ALL);

$great = 'fantastic';

// 无效,输出:?This?is?{?fantastic}
echo "This is { $great}";

// 有效,输出: This is fantastic
echo "This is {$great}";
echo "This is ${great}";

// 有效
echo "This square is {$square->width}00 centimeters broad."; 

// 有效
echo "This works: {$arr[4][3]}";

// 这是错误的表达式,因为就象$foo[bar] 的格式不能在字符串以外的地方使用一样。
// 换句话说,只有在PHP能找到常量foo 的前提下才会正常工作;这里会产生一个E_NOTICE?(undefined?constant)级别的错误。
echo "This is wrong: {$arr[foo][3]}"; 

// 有效,当在字符串中使用多重数组时,一定要用括号将它括起来
echo "This works: {$arr['foo'][3]}";

// 有效
echo "This works: " . $arr['foo'][3];

echo "This works too: {$obj->values[3]->name}";

echo "This is the value of the var named $name: {${$name}}";

echo "This is the value of the var named by the return value of getName():
{${getName()}}";

echo "This is the value of the var named by the return value of
\$object->getName(): {${$object->getName()}}";

// 无效,输出: This is the return value of getName(): {getName()}
echo "This is the return value of getName(): {getName()}";
?>

也可以在字符串中用变量来调用类的属性。

<?php
class foo {
    var $bar = 'I am bar.';
}

$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo "{$foo->$bar}\n";
echo "{$foo->$baz[1]}\n";
?>

转换成字符串

一个值可以通过在其前面加上(string)或用strval()函数来转变成 字符串。

一个booleanTRUE 值被转换成 字符串"1"BooleanFALSE 被转换成"" (空的字符串)。 这种转变可以在boolean字符串 之间往返进行。

字符串转变成数字

当一个字符串 被用在了一个数字的环境中,结果和类型如下:  

  如果字符串 没有包含 '.','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)
?>

数组

PHP 中的 数组 实际上是一个有序映射。映射是一种把 values关联到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。数组元素的值也可以是另一个数组。树形结构和多维数组也是允许的。

语法

定义数组 array()

可以用 array() 语言结构来新建一个 array。它接受任意数量用逗号分隔的     键(key) => 值(value) 对。

<?php
$arr = array("foo" => "bar", 12 => true);

echo $arr["foo"]; // bar
echo $arr[12];    // 1
?>

用方括号的语法新建/修改

   可以通过明示地设定值来改变一个现有的数组。  

    这是通过在方括号内指定键名来给数组赋值实现的。也可以省略键名,在这种情况下给变量名加上一对空的方括号(“[]”)。

Note:    

如上所述,如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值      + 1。如果当前还没有整数索引,则键名将为      0。如果指定的键名已经有值了,该值将被覆盖。

数组做什么和不做什么

为什么 $foo[bar] 错了?

    应该始终在用字符串表示的数组索引上加上引号。例如用     $foo['bar'] 而不是 $foo[bar]。但是为什么 $foo[bar] 错了呢?可能在老的脚本中见过如下语法:

<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// etc
?>

这样是错的,但可以正常运行。那么为什么错了呢?原因是此代码中有一个未定义的常量(bar)而不是字符串('bar'-注意引号),而 PHP 可能会在以后定义此常量,不幸的是你的代码中有同样的名字。它能运行,是因为     PHP 自动将裸字符串(没有引号的字符串且不对应于任何已知符号)转换成一个其值为该裸字符串的正常字符串。例如,如果没有常量定义为     bar,PHP 将把它替代为 'bar' 并使用之。

转换为数组

  对于任意类型: integer, float,   string, boolean and resource,如果将一个值转换为数组,将得到一个仅有一个元素的数组(其下标为 0),该元素即为此标量的值。换句话说,   (array)$scalarValuearray($scalarValue) 完全一样。

对象

对象初始化

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

<?php
class foo
{
    function do_foo()
    {
        echo "Doing foo.";
    }
}

$bar = new foo;
$bar->do_foo();
?>

资源类型

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

转换为资源

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

NULL

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

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

  •      被赋值为 NULL

  •      尚未被赋值。  

  •      被 unset()

语法

NULL 类型只有一个值,就是大小写不敏感的关键字 NULL(你可以写成NULL,也可以写成null)。  

转换到 NULL

将一个变量转换为 null 类型将会删除该变量并且unset它的值。