类型 - PHP手册笔记

原文:类型 - PHP手册笔记

类型简介

PHP 支持 8 种原始数据类型。

  • 四种标量类型:

    • boolean(布尔型,不区分大小写)
    • integer(整型)
    • float(浮点型,也称作double)
    • string(字符串)
  • 两种复合类型:
    • array(数组)
    • object(对象)
  • 最后是两种特殊类型:
    • resource(资源)
    • NULL(无类型)

如果想查看某个表达式的值和类型,用var_dump()函数。

<?php
$a = array(1, 2, array("a", "b", "c"));
var_dump($a);

$b = 3.1;
$c = true;
var_dump($b, $c);

上面的代码通过var_dump()打印变量的相关信息,输出结果如下所示(PHP版本5.5.12)。

array (size=3)
  0 => int 1
  1 => int 2
  2 =>
    array (size=3)
      0 => string 'a' (length=1)
      1 => string 'b' (length=1)
      2 => string 'c' (length=1)

float 3.1

boolean true

如果只是想得到一个易读懂的类型的表达方式用于调试,用gettype()函数。要查看某个类型,不要用gettype(),而用is_type函数。使用is_type可以对参数进行过滤。

如果要将一个变量强制转换为某类型,可以对其使用强制转换或者settype()函数。注意变量根据其当时的类型在特定场合下会表现出不同的值。

boolean布尔类型

特别注意,当转换为boolean时,以下值被认为是FALSE:

  • 空字符串,以及字符串 "0"
  • 不包括任何元素的数组

只要是对象,返回值均为TRUE。

下面这段程序能加深对boolean类型转换的理解。

<?php
var_dump((bool) array());  // boolean false
var_dump((bool) "");  // boolean false
var_dump((bool) "0");  // boolean false
var_dump((bool) "00");  // boolean true
var_dump((bool) "false");  // boolean true
var_dump((bool) (new stdClass()));  // boolean true
var_dump((bool) ((object) array()));  // boolean true

integer整型

要使用八进制表达,数字前必须加上0(零)。
要使用十六进制表达,数字前必须加上0x。
要使用二进制表达,数字前必须加上0b。
二进制表达的integer自PHP 5.4.0起可用。

integer值的字长可以用常量PHP_INT_SIZE来表示,最大值可以用常量PHP_INT_MAX来表示。

<?php
var_dump(PHP_INT_SIZE);  // int 4
var_dump(PHP_INT_MAX);  // int 2147483647
var_dump(01090);  // int 8  八进制 010 = 十进制 8

上面程序最后一条语句,处理八进制时发生一件怪事。那是因为,如果向八进制数传递了一个非法数字(即8或9),则后面其余数字会被忽略。

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

PHP中没有整除的运算符。1/2产生出float 0.5。值可以舍弃小数部分强制转换为integer,或者使用round()函数可以更好地进行四舍五入。

手册中说,决不要将未知的分数强制转换为integer,这样有时会导致不可预料的结果。

<?php
echo (int)((0.1 + 0.7) * 10);

这段程序的输出结果为7,永远不要相信浮点数!

float浮点型

某些数学运算会产生一个由常量NAN所代表的结果。此结果代表着一个在浮点数运算中未定义或不可表述的值。任何拿此值与其它任何值进行的松散或严格比较的结果都是FALSE。

string字符串

一个字符串string就是由一系列的字符组成,其中每个字符等同于一个字节。实现方式是一个由字节组成的数组再加上一个整数指明缓冲区长度。这意味着PHP只能支持256的字符集,因此不支持Unicode。那中文是怎样显示的呢?先把疑问记录下来。

字符串有4中语法表达方式:

  • 单引号
  • 双引号
  • heredoc
  • nowdoc

单引号

要表达一个单引号自身,需在它的前面加个反斜线(\)来转义。
要表达一个反斜线自身,则用两个反斜线(\)。
其它任何方式的反斜线都会被当成反斜线本身。

但是,如果单引号包裹的字符串中只有一个反斜线,反斜线也会输出,这是为什么呢?

双引号

可以对转义字符进行解析,最重要的特征是变量会被解析。

单引号、双引号都支持字符串多行录入。

heredoc结构

这种结构在以往的编程中使用的较少,这里详细学习一下。

结构大致如下:
运算符<<<之后提供标识符,然后换行。
接下来是字符串本身。
最后用前面定义的标识符作为结束标志。

结束时所引用的标识符必须在该行的第一列,这意味着标识符不能缩进,这行除了可能有一个分号(;)外,绝对不能包含其它字符。

Heredocs结构不能用来初始化类的属性。自PHP 5.3起,此限制仅对heredoc包含变量时有效。

Heredoc 结构就象是没有使用双引号的双引号字符串,转义规则同双引号。

nowdoc结构

nowdoc结构与heredoc相似,只是跟在运算符<<<后面的标识符要用单引号括起来。

就象heredoc结构类似于双引号字符串,nowdoc结构是类似于单引号字符串的。nowdoc中不进行解析操作。这种结构很适合用于嵌入PHP代码或其它大段文本而无需对其中的特殊字符进行转义。nowdoc结构可以用在任意的静态数据环境中,最典型的示例是用来初始化类的属性或常量。

变量解析

变量解析有两种语法规则,一种是简单规则,一种是复杂规则。简单规则最常用、最方便,这里详细学习一下复杂语法规则。复杂规则语法的显著标记是用花括号包围的表达式。

复杂语法不是因为其语法复杂而得名,而是因为它可以使用复杂的表达式。 由于{无法被转义,只有$紧挨着{时才会被识别。

存取和修改

可以以数组形式访问字符串,用超出字符串长度的下标写入将会拉长该字符串并以空格填充。非整数类型下标会被转换成整数。写入时只用到了赋值字符串的第一个字符。用空字符串赋值则赋给的值是NULL字符。PHP的字符串在内部是字节组成的数组。因此用花括号访问或修改字符串对多字节字符集很不安全。

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

一个布尔值boolean的TRUE被转换成string的"1"。boolean的FALSE被转换成""(空字符串)。字符串转换为数值,该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0(零)。

PHP的优势就体现在字符串处理的方便上,对于string的操作有很多有用的函数,可以运用各种函数,还有正则表达式。

PHP 并不特别指明字符串的编码,字符串会被按照该脚本文件相同的编码方式来编码。因此,操作文本的函数必须假定字符串是如何编码的。不幸的是,PHP关于此的函数有很多变种,关于PHP的字符串处理函数还需多加学习。

array数组

PHP中的数组实际上是一个有序映射,映射是一种把values关联到keys的类型。

可以用array()语言结构来新建一个数组。它接受任意数量用逗号分隔的“键(key)=>值(value)对”。自5.4起可以使用短数组定义语法,用[]替代array()。key可以是integer或者string,value可以是任意类型。

key会有如下的强制转换和规则:

  • 包含有合法整型值的字符串会被转换为整型。
  • 浮点数也会被转换为整型,意味着其小数部分会被舍去。
  • 布尔值也会被转换成整型。
  • null会被转换为空字符串,即键名null实际会被储存为""。
  • 数组和对象不能被用为键名。
  • 如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。
  • 如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。
<?php
$a = array('20' => 'a', '02' => 'b');
var_dump($a);

通过上面的规则可知,这段代码的输出结果如下:

array (size=2)
  20 => string 'a' (length=1)
  '02' => string 'b' (length=1)

如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值加上1(但是最小为0)。要删除某键值对,对其调用unset()函数,该函数允许删除数组中的某个键,但要注意数组将不会重建索引。

<?php
$a = array('a', 'b' => 'b');
$a[] = 'c';
var_dump($a);
unset($a[1]);
var_dump($a);

对于上面这段程序,输出为:

array (size=3)
  0 => string 'a' (length=1)
  'b' => string 'b' (length=1)
  1 => string 'c' (length=1)

array (size=2)
  0 => string 'a' (length=1)
  'b' => string 'b' (length=1)

应该始终在用字符串表示的数组索引上加上引号。例如用$foo[‘bar‘]而不是$foo[bar]。此代码中有一个未定义的常量(bar)而不是字符串(‘bar‘-注意引号),而 PHP 可能会在以后定义此常量。

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

下面的示例程序,通过读取目录填充数组,这里涉及到几个函数的使用。

<?php
$handle = opendir('.');
while(false !== ($file = readdir($handle))) {
	$files[] = $file;
}
closedir($handle);
var_dump($files);

对于任意integer,float,string,boolean和resource类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。

object对象

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

如果将一个对象转换成对象,它将不会有任何变化。如果其它任何类型的值被转换成对象,将会创建一个内置类 stdClass 的实例。如果该值为 NULL,则新的实例为空。数组转换成对象将使键名成为属性名并具有相对应的值。对于任何其它的值,名为 scalar 的成员变量将包含该值。

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

$obj = (object) 'hello';
var_dump($obj);

上面的示例程序输出结果为:

Doint foo.object(foo)[1]

object(stdClass)[2]
  public 'scalar' => string 'hello' (length=5)

resource资源类型

资源resource是一种特殊变量,保存了到外部资源的一个引用。资源使用的所有外部资源都会被垃圾回收系统释放,很少需要手工释放内存。但是,持久数据库连接比较特殊,它们不会被垃圾回收系统销毁。

NULL

NULL类型只有一个值,就是不区分大小写的常量NULL。

callback回调类型

第一次接触到这个概念,有点陌生。

自PHP 5.4起可用callable类型指定回调类型callback。

手册示例程序中使用了很多call_user_func函数,先把这函数理一下。call_user_func第一个参数作为回调函数(callback),并且将其余的参数作为回调函数的参数。返回回调函数的返回值,如果错误则返回FALSE。

回调函数可以是简单函数、对象方法、静态类方法,回调函数的几种使用方法如下所示:

  1. 调用用户自定义的简单函数,以string类型传递其名称。
<?php
function my_callback_function() {
	echo 'hello, world.';
}
call_user_func('my_callback_function');
  1. 调用类的静态成员方法,类及方法被作为数组传递,下标0包含该对象,下标1包含方法名。
<?php
class MyClass {
	static function myCallbackMethod() {
		echo 'Hello, world.';
	}
}
call_user_func(array('MyClass', 'myCallbackMethod'));
  1. 调用已实例化的对象方法。
<?php
class MyClass {
	static function myCallbackMethod() {
		echo 'Hello, world.';
	}
}
$obj = new MyClass;
call_user_func(array($obj, 'myCallbackMethod'));
  1. 调用静态类方法。
<?php
class MyClass {
	static function myCallbackMethod() {
		echo 'Hello, world.';
	}
}
call_user_func('MyClass::myCallbackMethod');
  1. 调用父类静态成员方法。
<?php
class A {
	public static function who() {
		echo "A\n";
	}
}
class B extends A {
	public static function who() {
		echo "B\n";
	}
}
call_user_func(array('B', 'parent::who'));

除了普通的用户自定义函数外,create_function()可以用来创建一个匿名回调函数。

类型转换

PHP是弱类型语言,变量类型根据使用该变量的上下文所决定的。

(全文完)

时间: 2024-10-11 17:19:25

类型 - PHP手册笔记的相关文章

google hacking for penetration testers 手册笔记

参考链接: Advanced operators reference Google hacking database 注意:以下内容涉及到大量参考图表,图表均在本人相册<google hacking参数查询表>里 第一章 谷歌搜索基础知识 1.谷歌翻译 可看作透明代理 利用: “翻译此页” 2.黄金法则: 不区分大小写 通配符*代表一个单词,非单一字母或一系列字母,在一单词开始或结尾使用星号和直接使用单词效果相同 保留查询关键字权利 强制搜索:         加引号:“words” 或 用布

表达式 - PHP手册笔记

原文:表达式 - PHP手册笔记 PHP是一种面向表达式的语言.表达式的定义可以描述为,任何有值的东西. PHP支持全等运算符===(值和类型均相同)和非全等运算符!==(值或者类型不同). PHP的三元条件运算符貌似和C语言不太一样,这里没提,那就先简单略过去吧. (全文完)

Python学习手册笔记

之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我在这里推荐了几篇文章,有其他语言编程经验的人简单看一看就可以很快地开始编写Python程序了. 黑体表示章节, 下划线表示可以直接在原文对应位置查到的专有技术名词. 原书配套答案请到http://www.hzbook.com/Books/4572.html下载,简单注册即可. 第三章 如何运行程序 impor

类与对象 - PHP手册笔记

原文:类与对象 - PHP手册笔记 基本概念 PHP对待对象的方式与引用和句柄相同,即每个变量都持有对象的引用,而不是整个对象的拷贝. 当创建新对象时,该对象总是被赋值,除非该对象定义了构造函数并且在出错时抛出了一个异常.类应在被实例化之前定义. 创建对象时,如果该类属于一个名字空间,则必须使用其完整名称. 在类定义内部,可以用new self和new parent创建对象. <?php $instance = new stdClass(); $assigned = $instance; $re

命名空间 - PHP手册笔记

原文:命名空间 - PHP手册笔记 概述 命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念,比如在操作系统中,目录用来将相关文件分组,对于目录中的文件来说,目录就扮演了命名空间的角色.这个原理应用到程序设计领域就是命名空间的概念.PHP 5.3后的版本开始支持命名空间. 定义命名空间 命名空间通过关键字namespace来声明.任何合法的PHP代码都可以包含在命名空间中,但只有类.函数和常量这三种类型受命名空间的影响. 在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的de

函数 - PHP手册笔记

原文:函数 - PHP手册笔记 用户自定义函数 函数无需在调用前被定义,除非是有条件定义的. PHP中的所有函数和类都具有全局作用域.PHP不支持函数重载,也不可能取消定义或者重定义已声明的函数. 特意试了下,我的电脑上的PHP递归栈的最大深度为100. 函数参数 PHP支持按值传递参数(默认).通过引用传递参数以及默认参数.也支持可变长度参数列表.PHP允许使用数组和特殊类型NULL作为默认参数.如果希望允许函数修改参数值,必须通过引用传递参数. 注意!当使用默认参数时,任何默认参数必须放在任

基本语法 - PHP手册笔记

原文:基本语法 - PHP手册笔记 PHP标记 如果文件内容是纯PHP代码,最好在文件末尾删除PHP结束标记.这可以避免在PHP结束标记之后万一意外加入了空格或者换行符,会导致PHP开始输出这些空白,而脚本中此时并无输出的意图.当然PHP开始标记<?php前的空格或者换行符依然会输出. 使用条件的高级分离术 下面这段代码的意思很容易理解,关键是if-else的用法,这样使用在文本输出是显的逻辑更加清晰. <?php $expression = false; ?> <?php if

入门指引 - PHP手册笔记

原文:入门指引 - PHP手册笔记 曾经简单的学习过PHP,看的是<PHP和MySQL Web开发>,还有万能的搜索引擎的帮助.这次准备系统的学习一下,参考资料是PHP Manual. PHP能做什么 PHP主要用于服务端的脚本程序,但PHP的功能远不局限于此.PHP主要用于以下三个领域: 服务端脚本 命令行脚本 编写桌面应用程序(PHP-GTK) 实用的脚本 $_SERVER是一个特殊的PHP保留变量,它包含了web服务器提供的所有信息,被称为超全局变量.可以通过$_SERVER['HTTP

异常处理 - PHP手册笔记

原文:异常处理 - PHP手册笔记 PHP代码中所产生的异常可被throw语句抛出,并被catch语句捕获.需要进行异常处理的代码都必须放入try代码块内,每一个try至少要有一个与之对应的catch.当一个异常被抛出时,所在代码块后面的代码将不会继续执行,此时PHP会尝试查找第一个能与之匹配的catch.当然,PHP允许在catch代码块内再次抛出throw异常.如果一个异常没有被捕获,且未使用set_exception_handler()作相应处理的话,PHP将会产生一个严重错误. 这里有一