简介

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

四种标量类型:

两种复合类型:

最后是两种特殊类型:

为了确保代码的易读性,介绍一些伪类型

以及伪变量 $....

变量的类型不是由程序员设定的,是由 PHP 根据该变量使用的上下文在运行时决定的。

想查看某个表达式的值和类型,用 var_dump(),要查看某个类型,用 is_type 函数,如果只是想得到一个易读懂的类型的表达方式用于调试,用 gettype()。

 <?php
$a_bool = TRUE; // a boolean
$a_str = "foo"; // a string
$a_str2 = 'foo'; // a string
$an_int = 12; // an integer echo gettype($a_bool); // prints out: boolean
echo gettype($a_str); // prints out: string // If this is an integer, increment it by four
if (is_int($an_int)) {
$an_int += 4;
} // If $bool is a string, print it out
// (does not print out anything)
if (is_string($a_bool)) {
echo "String: $a_bool";
}
?>

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

布尔类型

boolean 表达了真值,可以为 TRUE 或 FALSE,两个都不区分大小写

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

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

  • FALSE
  • the 整型值 0
  • the 浮点型值 0.0
  • 空 字符串, 以及 字符串 "0"
  • 不包括任何元素的数组
  • 不包括任何成员变量的对象(仅PHP 4.0 适用)
  • 特殊类型 NULL (包括尚未设定的变量)
  • 从没有任何标记(tags)的XML文档生成的SimpleXML 对象

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

Warning

-1 和其它非零值(不论正负)一样,被认为是 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)
?>

整型

一个 integer 是集合 Z = {..., -2, -1, 0, 1, 2, ...} 中的一个数。整型值可以使用十进制,十六进制或八进制表示,前面可以加上可选的符号(- 或者 +)。八进制表示数字前必须加上 0(零),十六进制表示数字前必须加上 0x。整型数的字长和平台有关,Integer值的字长可以用常量PHP_INT_SIZE来表示,自 PHP 4.4.0 和 PHP 5.0.5后,最大值可以用常量PHP_INT_MAX来表示。

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

 <?php
$large_number = 2147483647;
var_dump($large_number);
// 输出为:int(2147483647) $large_number = 2147483648;
var_dump($large_number);
// 输出为:float(2147483648) // 同样也适用于十六进制表示的整数: 从 2^31 到 2^32-1:
var_dump( 0xffffffff );
// 输出: float(4294967295) // 不适用于大于 2^32-1 的十六进制表示的数:
var_dump( 0x100000000 );
// 输出: int(2147483647) $million = 1000000;
$large_number = 50000 * $million;
var_dump($large_number);
// 输出: float(50000000000)
?>

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

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

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

如果浮点数超出了整数范围(通常为 +/- 2.15e+9 = 2^31),则结果不确定。在此情况下没有警告!

浮点型

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

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

字符串

一个字符串 就是由一系列的字符组成,一个字符就是一个字节,一个字节只能有256种不同的变化,暗示了PHP无法原生支持Unicode。

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

单引号

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

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

双引号

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

Heredoc结构

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

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

Nowdoc结构

Nowdoc结构是类似于单引号字符串的。Nowdoc结构很象heredoc结构,但是 nowdoc不进行解析操作 。 这种结构很适合用在不需要进行转义的PHP代码和其它大段文本。

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

变量解析

当字符串用双引号或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()}";
?>

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

字符串中的字符可以通过一个以0为开始的,用类似数组结构中的方括号包含对应的数字来查找和修改,比如 $str[42], 可以把 字符串想像数组 。 函数 substr() 和 substr_replace()可以用来实现多于一个字符 的情况。

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

数组

PHP 中的 数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。用 array() 语言结构来新建一个 array,接受任意数量

 array(  key =>  value
, ...
)
// 键(key) 可是是一个 整数(integer) 或 字符串(string)
// 值(value) 可以是任意类型的值

用逗号分隔的 键(key) => 值(value) 对。

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

 $arr[key] = value;
$arr[] = value;
// key 可以是 integer 或 string
// value 可以是任意类型的值

如果 $arr 还不存在,将会新建一个。这也是一种定义数组的替换方法。要改变一个值,只要给它赋一个新值。如果要删除一个键名/值对,要对它用 unset()

 <?php
$arr = array(5 => 1, 12 => 2); $arr[] = 56; // This is the same as $arr[13] = 56;
// at this point of the script $arr["x"] = 42; // This adds a new element to
// the array with key "x" unset($arr[5]); // This removes the element from the array unset($arr); // This deletes the whole array
?>

如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值 + 1。如果当前还没有整数索引,则键名将为 0。最大整数键名不一定当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行了。

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

对象

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

 <?php
class foo
{
function do_foo()
{
echo "Doing foo.";
}
} $bar = new foo;
$bar->do_foo();
?>

PHP学习心得(五)——类型的更多相关文章

  1. Python学习心得--变量类型篇

    1.Python允许同时为多个变量赋值.例如:a = b = c = 1 2.Python允许多个对象指定多个变量.例如:a1, b1, c1 = 1, 2, "john" 3.使 ...

  2. 我的MYSQL学习心得(五) 运算符

    我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  3. python学习心得第五章

    python学习心得第五章 1.冒泡排序: 冒泡是一种基础的算法,通过这算法可以将一堆值进行有效的排列,可以是从大到小,可以从小到大,条件是任意给出的. 冒泡的原理: 将需要比较的数(n个)有序的两个 ...

  4. SpringMvc学习心得(五)控制器产生与构建

    SpringMvc学习心得(五)控制器产生与构建 标签: springspring mvc框架 2016-03-22 15:29 140人阅读 评论(0) 收藏 举报  分类: Spring(4)  ...

  5. 我的MYSQL学习心得(五)

    原文:我的MYSQL学习心得(五) 我的MYSQL学习心得(五) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL ...

  6. 我的MYSQL学习心得(十五) 日志

    我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  7. WCF学习心得----(五)生成客户端

    WCF学习心得----(五)生成客户端 1.    通过Svcutil.exe工具直接生成客户端 1.1     将服务承载于IIS上 1.1.1 在IIS中新建网站,所示效果如下图: 1.1.2   ...

  8. 别人的的MYSQL学习心得(十五) 日志

    我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  9. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  10. 我的MYSQL学习心得(二) 数据类型宽度

    我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

随机推荐

  1. NAS、DAS和SAN三种存储究竟是什么?

    首先,NAS(Network Attached Storage,网络附加存储)全面改进了以前低效的DAS存储方式,它是采用独立于PC服务器,单独为网络数据存储而开发的一种文件服务器. NAS服务器中集 ...

  2. 理解 MEF

    1.它解决什么问题? 考虑下面的需求,甲程序员对外暴露接口,内部提供实现.乙程序员使用甲提供的接口,根据面向接口编程的原则,乙关联一个接口类型的引用.正常情况下,乙要使用甲的实现,必须实例化一个具体对 ...

  3. 转换流--OutputStreamWriter类与InputStreamReader类

    12.4  转换流--OutputStreamWriter类与InputStreamReader类 整个IO包实际上分为字节流和字符流,可是除了这两个流之外,还存在一组字节流-字符流的转换类. Out ...

  4. Socket解决粘包问题2

    在AsynServer中对接收函数增加接收判断,如果收到客户端发送的请求信息,则发送10个测试包给发送端,否则继续接收,修改后的接收代码如下: private void AsynReceive() { ...

  5. Android 自定义View修炼-【2014年最后的分享啦】Android实现自定义刮刮卡效果View

    一.简介: 今天是2014年最后一天啦,首先在这里,我祝福大家在新的2015年都一个个的新健康,新收入,新顺利,新如意!!! 上一偏,我介绍了用Xfermode实现自定义圆角和椭圆图片view的博文& ...

  6. 无法从“object”转换为“string”

    就我在项目中遇到的问题,和大家分享一下“无法从“object”转换为“string” 在把我出错的代码复制上来,  Guid userid = new Guid(Membership.GetUser( ...

  7. start mysqld on Mac server

    #!/bin/sh # Source the common setup functions for startup scripts test -r /etc/rc.common || exit 1 . ...

  8. how to forget about delta cycles for RTL design

    A delta cycle is a VHDL construct used to makeVHDL, a concurrent language, executable on asequential ...

  9. nyoj914Yougth的最大化(二分搜索 + 贪心)

    Yougth的最大化 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗 ...

  10. cognos 10.2.2 导入samples数据源报错解决

    操作系统:windows 2008R2 X64 数据库:oracle 10.2.0.1 X32 sid:cognosdb86 安装完samples后,执行IBM安装目录webcontent\sampl ...