[PHP中文手册][二.语言参考-类型]
标签(空格分隔): 未分类
类型
简介
四种标量类型
- boolean 布尔
- integer 整型
- float 浮点型,与double其实一致
- string 字符串
两种复合类型
- array 数组
- object 对象
两种特殊类型
- resource 资源
- null 无类型
三种伪类型
- mixed 混合类型
- number 数字类型
- callback 回调类型
- $… 伪变量
变量的类型通常不是由程序员设定的,确切地说,是由 PHP 根据该变量使用的上下文在运行时决定的。
<?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";
}
?>
- 用
var_dump()
查看变量的类型和值
- 用
gettype()
查看变量的类型 - 用
is_type()
来进行类型判断 用
settype()
来jinBoolean 类型
ture
,false
大小写随意- 其余与普通语言基本相同,比如其他类型强制转换Bool的规则。
Integer 类型
进制
<?php
$a = 1234; // 十进制数
$a = -123; // 负数
$a = 0123; // 八进制数 (等于十进制 83)
$a = 0x1A; // 十六进制数 (等于十进制 26)
$a = 0b1111// 二进制
?>
最大值
最大值可以用常量 PHP_INT_MAX
来表示,和C差不多。
整除
没有整除,只能通过(int)
或(integer)
强制转化。
Float 浮点型
浮点型(也叫浮点数 float,双精度数 double 或实数 real)可以用以下任一语法定义:
<?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
?>
NaN
某些数学运算会产生一个由常量 NAN所代表的结果。此结果代表着一个在浮点数运算中未定义或不可表述的值。任何拿此值与其它任何值进行的松散或严格比较的结果都是 FALSE。 由于 NAN 代表着任何不同值,不应拿 NAN 去和其它值进行比较,包括其自身,应该用 is_nan() 来检查。
String
一个字符串 string
就是由一系列的字符组成,其中每个字符等同于一个字节。这意味着 PHP 只能支持 256
的字符集,因此不支持 Unicode
。详见字符串类型详解。
语法
- 单引号
- 双引号
heredoc
语法结构nowdoc
语法结构
单引号
- 表达单引号本身需要
/'
- 表达
/
需要//
- 其余斜杠在单引号表示中没有转义的含义.
- 变量也不会被解释
'$temp'
<?php
echo 'this is a simple string';
// 可以录入多行
echo 'You can also have embedded newlines in
strings this way as it is
okay to do';
// 输出: Arnold once said: "I'll be back"
echo 'Arnold once said: "I\'ll be back"';
// 输出: You deleted C:\*.*? \\还是表达\
echo 'You deleted C:\\*.*?';
// 输出: You deleted C:\*.*? 其余\没有任何意义
echo 'You deleted C:\*.*?';
// 输出: This will not expand: \n a newline 转义字符也无效
echo 'This will not expand: \n a newline';
// 输出: Variables do not $expand $either,变量不被转义
echo 'Variables do not $expand $either';
?>
双引号
- 对类似
\n
的转义符号解析。 能进行变量解析。
比如
echo "$haha"
会输出哈哈的值
heredoc结构
使用
<<<
开头,后面提供一个标示符,然后换行,接下来是string
本身,最后用前面定义的标示符作为结束标志。结束的标示符必须在该行的第一列,并且之后只能有分号。能够解析变量
在PHP 5.3.0之后,也可以用
heredoc
结构来初始化静态变量和类的属性和常量。
<?php
// 静态变量
function foo()
{
static $bar = <<<LABEL
Nothing in here...
LABEL;
}
// 类的常量、属性
class foo
{
const BAR = <<<FOOBAR
Constant example
FOOBAR;
public $baz = <<<FOOBAR
Property example
FOOBAR;
}
?>
- 自 PHP 5.3.0 起还可以在 Heredoc 结构中用双引号来声明标识符。
<?php
echo <<<"FOOBAR"
Hello World!
FOOBAR;
?>
newdoc 结构
heredoc
类似双引号,newdoc
类似单引号,newdoc不能进行解析和转义一个
nowdoc
结构也用和heredocs
结构一样的标记<<<
, 但是跟在后面的标识符要用单引号括起来,即<<<'EOT'
。Heredoc
结构的所有规则也同样适用于nowdoc
结构,尤其是结束标识符的规则。不象
heredoc
结构,nowdoc
结构可以用在任意的静态数据环境中,最典型的示例是用来初始化类的属性或常量:
<?php
class foo {
public $bar = <<<'EOT'
bar
EOT;
}
?>
变量解析
简单语法
-当 PHP 解析器遇到一个美元符号($
)时,它会和其它很多解析器一样,去组合尽量多的标识以形成一个合法的变量名。可以用花括号来明确变量名的界线。
复杂(花括号)语法
- 只有
$
紧挨着{
时才会被识别
<?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}";
$name='zhouyong';
$zhouyong='hahaha';
echo "This is the value of the var named $name: {${$name}}";
//输出This is the value of the var named zhouyong: hahaha
// 有效,只有通过花括号语法才能正确解析带引号的键名
echo "This works: {$arr['key']}";
- 也可以在字符串中用此语法通过变量来调用类的属性。
<?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";
?>
有用的函数和运算符
- 字符串可以用 ‘.’(点)运算符连接起来,注意 ‘+’(加号)运算符没有这个功能。更多信息参考字符串运算符。
可以参考字符串函数了解大部分函数,高级的查找与替换功能可以参考正则表达式函数或 Perl 兼容正则表达式函数。 另外还有 URL 字符串函数,也有加密/解密字符串的函数(mcrypt 和 mhash)。
最后,可以参考字符类型函数。
<?php
$test= "hello"."world";
var_dump($test);
//print "helloworld"
?>
关于强制转换成字符串
一个值可以通过在其前面加上
(string)
或用strval()
函数来转变成字符串。在一个需要字符串的表达式中,会自动转换为 string。比如在使用函数 echo 或 print时,或在一个变量和一个 string 进行比较时,就会发生这种转换- 一个布尔值
boolean
的TRUE
被转换成 string 的"1"
。Boolean 的FALSE
被转换成""
(空字符串)。这种转换可以在 boolean和 string 之间相互进行。 - 一个整数
integer
或浮点数float
被转换为数字的字面样式的 string(包括 float中的指数部分)。使用指数计数法的浮点数(4.1E+6)也可转换。 - 数组
array
总是转换成字符串"Array"
,因此,echo 和 print 无法显示出该数组的内容。要显示某个单元,可以用 echo $arr[‘foo’] 这种结构。要显示整个数组内容见下文。 - 在 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
,将转换为interger
,否则为float
- 非法的转换将返回
0
- 不能像C语言一样
'A'=65
,要通过ord()
和chr()
实现
- 如果没有
<?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的编码问题
Array 数组
PHP的Array
实际上是一个key
映射到value
的字典,所以既能作为数组,也能作为字典。
语法
key => value
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
);
// 自 PHP 5.4 起
$array = [
"foo" => "bar",
"bar" => "foo",
];
$array = [1,2,3]
?>
注意:key有些特殊的规则。
- 包含有合法整型值的字符串会被转换为整型。例如键名
"8"
实际会被储存为8
。但是"08"
则不会强制转换,因为其不是一个合法的十进制数值(八进制)。浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
key 为可选项。如果未指定,PHP 将自动使用之前用过的最大 integer 键名加上 1 作为新的键名。
<?php
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
"haha",
"eeee",
8 => "ddddd",
"11111111111",
);
var_dump($array);
/*print:
D:\wamp64\www\1.php:12:
array (size=5)
1 => string 'd' (length=1)
2 => string 'haha' (length=4)
3 => string 'eeee' (length=4)
8 => string 'ddddd' (length=5)
9 => string '11111111111' (length=11)
*/
?>
数组的间接引用
自 PHP 5.4 起可以用数组间接引用函数或方法调用的结果。之前只能通过一个临时变量。
<?php
function getArray() {
return array(1, 2, 3);
}
// on PHP 5.4
$secondElement = getArray()[1];
// previously
$tmp = getArray();
$secondElement = $tmp[1];
// or
list(, $secondElement) = getArray();
?>
数组的修改,增删。
<?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
?>
NOTICE
- 对于未指定
key
的赋值,不一定是当前数组里最大的整数+1。有可能是之前的。
<?php
// 创建一个简单的数组
$array = array(1, 2, 3, 4, 5);
print_r($array);
// 现在删除其中的所有元素,但保持数组本身不变:
foreach ($array as $i => $value) {
unset($array[$i]);
}
print_r($array);
// 添加一个单元(注意新的键名是 5,而不是你可能以为的 0)
$array[] = 6;
print_r($array);
// 重新索引:
$array = array_values($array);
$array[] = 7;
print_r($array);
?>
其余类型转换为数组
对于任意 integer
,float
,string
,boolean
和 resource
类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。换句话说,(array)$scalarValue
与 array($scalarValue)
完全一样。
如果一个 object
类型转换为array
,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:
- 整数属性不可访问;
- 私有变量前会加上类名作前缀;
- 保护变量前会加上一个
'*'
做前缀。 - 这些前缀的前后都各有一个
NULL(/0)
字符。这会导致一些不可预知的行为:
数组的遍历
<?php
// Array as (property-)map
$map = array( 'version' => 4,
'OS' => 'Linux',
'lang' => 'english',
'short_tags' => true
);
foreach ($map as $maps) {
echo $maps." ";
}
foreach ($map as $key=>$maps) {
echo $maps." ".$key." ";
}
for ($i = 0; $i < $count; $i++) {
}
?>
//4 Linux english 1
//4 version Linux OS english lang 1 short_tags
数组排序
<?php
sort($files);
print_r($files);
?>
数组的复制
<?php
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 is changed,
// $arr1 is still array(2, 3)
$arr3 = &$arr1;
$arr3[] = 4; // now $arr1 and $arr3 are the same
?>
Object对象
对象初始化
要创建一个新的对象 object,使用 new 语句实例化一个类:
<?php
class foo
{
function do_foo()
{
for($i=0;$i<=10;$i++){
echo "Doing foo."."\n";
}
}
}
$bar = new foo;
$bar->do_foo();
?>
对象的强制转换
如果将一个对象转换成对象,它将不会有任何变化。
如果其它任何类型的值被转换成对象,将会创建一个内置类
stdClass
的实例- 如果该值为 NULL,则新的实例为空
- 数组转换成对象将使键名成为属性名并具有相对应的值。
- 对于任何其它的值,名为 scalar 的成员变量将包含该值。
Resource 资源类型
资源 resource是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。所有这些函数及其相应资源类型见附录。
转换为资源
由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,因此将其它类型的值转换为资源没有意义。
释放资源
由于 PHP 4 Zend 引擎引进了引用计数系统,可以自动检测到一个资源不再被引用了(和 Java 一样)。这种情况下此资源使用的所有外部资源都会被垃圾回收系统释放。因此,很少需要手工释放内存。
Callback 回调类型
本文档使用的伪类型
mixed
mixed 说明一个参数可以接受多种不同的(但不一定是所有的)类型。
number
number 说明一个参数可以是 integer 或者 float。
callback
本文档中在 PHP 5.4 引入 callable 类型之前使用 了 callback 伪类型。二者含义完全相同。
void
void 作为返回类型意味着函数的返回值是无用的。void作为参数列表意味着函数不接受任何参数。
…
在函数原型中,$… 表示等等的意思。当一个函数可以接受任意个参数时使用此变量名。