PHP基础 数据类型 第二天

2012-09-23 22:16:58 0  category: 第一阶段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将对一些特殊的字符进行解析:

SequenceMeaning
\n换行 (LF or 0x0A (10) in ASCII)
\r回车 (CR or 0x0D (13) in ASCII)
\t水平方向的 tab(HT or 0x09 (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它的值。