标签(空格分隔): 未分类
变量的类型通常不是由程序员设定的,确切地说,是由 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()
来jin
ture
,false
大小写随意
$a = 1234; // 十进制数
$a = -123; // 负数
$a = 0123; // 八进制数 (等于十进制 83)
$a = 0x1A; // 十六进制数 (等于十进制 26)
$a = 0b1111// 二进制
?>
最大值可以用常量 PHP_INT_MAX
来表示,和C差不多。
没有整除,只能通过(int)
或(integer)
强制转化。
浮点型(也叫浮点数 float,双精度数 double 或实数 real)可以用以下任一语法定义:
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
?>
某些数学运算会产生一个由常量 NAN所代表的结果。此结果代表着一个在浮点数运算中未定义或不可表述的值。任何拿此值与其它任何值进行的松散或严格比较的结果都是 FALSE。 由于 NAN 代表着任何不同值,不应拿 NAN 去和其它值进行比较,包括其自身,应该用 is_nan() 来检查。
一个字符串 string
就是由一系列的字符组成,其中每个字符等同于一个字节。这意味着 PHP 只能支持 256
的字符集,因此不支持 Unicode
。详见字符串类型详解。
heredoc
语法结构nowdoc
语法结构/'
/
需要//
'$temp'
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"
会输出哈哈的值
使用<<<
开头,后面提供一个标示符,然后换行,接下来是string
本身,最后用前面定义的标示符作为结束标志。结束的标示符必须在该行的第一列,并且之后只能有分号。
能够解析变量
在PHP 5.3.0之后,也可以用heredoc
结构来初始化静态变量和类的属性和常量。
// 静态变量
function foo()
{
static $bar = <<
echo <<<"FOOBAR"
Hello World!
FOOBAR;
?>
heredoc
类似双引号,newdoc
类似单引号,newdoc不能进行解析和转义
一个 nowdoc
结构也用和 heredocs
结构一样的标记 <<<
, 但是跟在后面的标识符要用单引号括起来,即 <<<'EOT'
。Heredoc
结构的所有规则也同样适用于 nowdoc
结构,尤其是结束标识符的规则。
不象heredoc
结构,nowdoc
结构可以用在任意的静态数据环境中,最典型的示例是用来初始化类的属性或常量:
class foo {
public $bar = <<<'EOT'
bar
EOT;
}
?>
-当 PHP 解析器遇到一个美元符号($
)时,它会和其它很多解析器一样,去组合尽量多的标识以形成一个合法的变量名。可以用花括号来明确变量名的界线。
$
紧挨着 {
时才会被识别$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']}";
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)。
最后,可以参考字符类型函数。
$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’] 这种结构。要显示整个数组内容见下文。 object
总是被转换成字符串 "Object"
,如果为了调试原因需要打印出对象的值,请继续阅读下文。为了得到对象的类的名称,可以用 get_class()
函数。自 PHP 5 起,适当时可以用 __toString
方法。 resource
总会被转变成 "Resource id #1"
这种结构的字符串,其中的 1 是 PHP 在运行时分配给该 resource 的唯一值。不要依赖此结构,可能会有变更。要得到一个 resource 的类型,可以用函数 get_resource_type()。如上面所说的,直接把 array,object 或 resource转换成 string 不会得到除了其类型之外的任何有用信息。可以使用函数 print_r() 和 var_dump() 列出这些类型的内容。
字符串转换为数字
.
,e
,E
,将转换为interger
,否则为float
0
'A'=65
,要通过ord()
和chr()
实现$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的编码问题
PHP的Array
实际上是一个key
映射到value
的字典,所以既能作为数组,也能作为字典。
key => value
$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 作为新的键名。
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 起可以用数组间接引用函数或方法调用的结果。之前只能通过一个临时变量。
function getArray() {
return array(1, 2, 3);
}
// on PHP 5.4
$secondElement = getArray()[1];
// previously
$tmp = getArray();
$secondElement = $tmp[1];
// or
list(, $secondElement) = getArray();
?>
$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
?>
key
的赋值,不一定是当前数组里最大的整数+1。有可能是之前的。
// 创建一个简单的数组
$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)
字符。这会导致一些不可预知的行为:
// 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
sort($files);
print_r($files);
?>
$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,使用 new 语句实例化一个类:
class foo
{
function do_foo()
{
for($i=0;$i<=10;$i++){
echo "Doing foo."."\n";
}
}
}
$bar = new foo;
$bar->do_foo();
?>
如果将一个对象转换成对象,它将不会有任何变化。
如果其它任何类型的值被转换成对象,将会创建一个内置类 stdClass
的实例
资源 resource是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。所有这些函数及其相应资源类型见附录。
由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,因此将其它类型的值转换为资源没有意义。
由于 PHP 4 Zend 引擎引进了引用计数系统,可以自动检测到一个资源不再被引用了(和 Java 一样)。这种情况下此资源使用的所有外部资源都会被垃圾回收系统释放。因此,很少需要手工释放内存。
mixed 说明一个参数可以接受多种不同的(但不一定是所有的)类型。
number 说明一个参数可以是 integer 或者 float。
本文档中在 PHP 5.4 引入 callable 类型之前使用 了 callback 伪类型。二者含义完全相同。
void 作为返回类型意味着函数的返回值是无用的。void作为参数列表意味着函数不接受任何参数。
在函数原型中,$… 表示等等的意思。当一个函数可以接受任意个参数时使用此变量名。