第一章 基本语法
1、PHP 标记
<?php echo 'if you want to serve XHTML or XML documents, do like this'; ?>
<script language="php"> </script>
<?= expression ?> This is a shortcut for "<? echo expression ?>"
<%= $variable; # This is a shortcut for "<% echo . . ." %>
上例中的 1 和 2 总是可用的,其中 1 是最常用,并建议使用的。
短标记(上例 3)仅在通过 php.ini 配置文件中的指令 short_open_tag 打开后才可用,或者在 PHP 编译时加入了 –enable-short-tags 选项。
ASP 风格标记(上例 4)仅在通过 php.ini 配置文件中的指令 asp_tags 打开后才可用。
尽管有些人觉得短标记和 ASP 风格标记很方便,但移植性较差,通常不推荐。 对输出大块的文本而言,脱离 PHP 解析模式通常比将所有内容用 echo() 或者 print() 输出更有效率。
注: 此外注意如果将 PHP 嵌入到 XML 或 XHTML 中则需要使用
2、指令分隔符
一段 PHP 代码中的结束标记隐含表示了一个分号;在一个 PHP 代码段中的最后一行可以不用分号结束。如果后面还有新行,则代码段的结束标记包含了行结束。
注: 文件末尾的 PHP 代码段结束标记可以不要,有些情况下当使用 include() 或者 require() 时省略掉会更好,这样不期望的白空格就不会出现在文件末尾,之后仍然可以输出响应标头。在使用输出缓冲时也很便利,就不会看到由包含文件生成的不期望的白空格。
3、注释
PHP 支持 C,C++ 和 Unix Shell 风格(Perl 风格)的注释。例如:
echo "This is a test"; // This is a one-line c++ style comment
/* This is a multi line comment yet another line of comment */
echo "One Final Test"; # This is shell-style style comment
第二章 类型
1、四种标量类型:
1.1 boolean(布尔型)
当转换为 boolean 时,以下值被认为是 FALSE:
布尔值 FALSE
整型值 0(零)
浮点型值 0.0(零)
空白字符串和字符串 “0”
没有成员变量的数组
没有单元的对象(仅适用于 PHP 4)
特殊类型 NULL(包括尚未设定的变量)
1.2 integer(整型)
【语法】整型值可以用十进制,十六进制或八进制符号指定,前面可以加上可选的符号(- 或者 +)。 如果用八进制符号,数字前必须加上 0(零),用十六进制符号数字前必须加上 0x。
【整数溢出】如果给定的一个数超出了 integer 的范围,将会被解释为 float。同样如果执行的运算结果超出了 integer 范围,也会返回 float。
【转换】
用 (int)或(integer)或函数intval()来将一个值转换成整型。不过大多数情况下不需强制转换。
从布尔值转换:FALSE 将产生出 0(零),TRUE 将产生出 1(壹)。
从浮点数转换:当从浮点数转换成整数时,数字将被取整(丢弃小数位)。
如果浮点数超出了整数范围,则结果不确定,在此情况下没有警告,甚至没有任何通知!
在 Linux 下返回结果是最小负数(-2147483648),而在 Windows 下返回结果是零(0)。
1.3 float(浮点型,也作“double”)
永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数。
1.4 string(字符串)
可以用三种字面上的方法定义
单引号
双引号:会解析变量及预定义字符
定界符 :会解析变量及预定义字符
2、两种复合类型:
2.1 array(数组)
1、定义数组:用array()
2、使用 TRUE 作为键名将使 integer 1 成为键名。使用 FALSE 作为键名将使 integer 0 成为键名。使用 NULL 作为键名将等同于使用空字符串。使用空字符串作为键名将新建(或覆盖)一个用空字符串作为键名的值。不能用数组和对象作为键名。
3、应该始终在用字符串表示的数组索引上加上引号。例如用
foo[′bar′]而不是
foo[bar]。这并不意味着总是给键名加上引号。用不着给键名为常量或变量的加上引号,否则会使 PHP 不能解析它们。
4、E_ERROR 也是个合法的标识符,下面的例子是合法的:
$error_descriptions[E_ERROR] = "A fatal error has occured";
$error_descriptions[E_WARNING] = "PHP issued a warning";
5、在双引号字符串中,不给索引加上引号是合法的因此 “$foo[bar]”是合法的。
6、对于任何的类型:整型、浮点、字符串、布尔和资源,如果将一个值转换为数组,将得到一个仅有一个元素的数组(其下标为 0),该元素即为此标量的值。 如果将一个对象转换成一个数组,所得到的数组的元素为该对象的属性(成员变量),其键名为成员变量名。 如果将一个 NULL 值转换成数组,将得到一个空数组。
2.2 object(对象)
对象初始化:要初始化一个对象,用 new 语句将对象实例到一个变量中。
转换为对象:将一个对象转换成对象,它将不会有任何变化。如果其它任何类型的值被转换成对象,内置类 stdClass 的一个实例将被建立。如果该值为 NULL,则新的实例为空。数组转换成对象将使键名成为属性名并具有相对应的值。对于任何其它的值,名为 scalar 的成员变量将包含该值。
3、两种特殊类型:
3.1 resource(资源)
用 is_resource() 函数测定一个变量是否是资源,函数 get_resource_type() 则返回该资源的类型
资源是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。
由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,因此无法将其它类型的值转换为资源。
由于 PHP4 Zend 引擎引进了资源计数系统,可以自动检测到一个资源不再被引用了。这种情况下此资源使用的所有外部资源都会被垃圾回收系统释放。由此原因,很少需要用某些 free-result 函数来手工释放内存
3.2 NULL
殊的 NULL 值表示一个变量没有值。NULL 类型唯一可能的值就是 NULL。
在下列情况下一个变量被认为是 NULL:被赋值为 NULL、尚未被赋值、被 unset()
4、伪类型:
4.1 mixed
说明一个参数可以接受多种不同的(但并不必须是所有的)类型。
4.2 number
说明一个参数可以是 integer 或者 float
4.3 callback
回调函数不仅可以是一个简单的函数,它还可以是一个对象的方法,包括静态类的方法
第三章 变量
1、基础
变量名是区分大小写的。
一个有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线。按照正常的正则表达式,它将被表述为:'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'。
2、预定义变量
尽管超全局变量和 HTTP_*_VARS 同时存在。但是他们并不是同一个变量,所以改变一个的值并不会对另一个产生影响。
PHP 4.2.0 以及后续版本中,PHP 指令 register_globals 的默认值为 off。这是 PHP 的一个主要变化,他影响到预定义变量集在全局范围内的有效性。例如,为了得到 DOCUMENT_ROOT 的值,将必须使用
SERVER[′DOCUMENTROOT′]代替
DOCUMENT_ROOT
3、变量范围
3.1 一般情况
大部分的 PHP 变量只有一个单独的范围。这个单独的范围跨度同样包含了 include 和 require 引入的文件。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内。
3.2 global关键字
在函数中用global申明了全局变量,任何变量的所有引用变量都会指向到全局变量。对于一个函数能够申明的全局变量的最大个数,PHP 没有限制。
3.3 使用
GLOBALS替代global在
GLOBALS 数组中,每一个变量为一个元素,键名对应变量名,值对应变量的内容。
GLOBALS之所以在全局范围内存在,是因为
GLOBALS 是一个超全局变量。
$a = 1;
$b = 2;
function Sum(){
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}
Sum();
echo $b;//3
3.4 使用静态变量
静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
function Test(){
static $a = 0; //声明静态变量时不能使用表达式,如static $a=1+2是错误的
echo $a;
$a++;
}
每次调用 Test() 函数都会输出 $a 的值并加一
4、可变变量
$a = 'hello';
$$a = 'world';
echo "$a ${$a}";//hello world。
echo "$a $hello";//hello world。
要将可变变量用于数组,必须解决一个模棱两可的问题。这就是当写下
超级全局变量不能被用作可变变量。
5、PHP的外部变量
5.1 HTML 表单(GET 和 POST)
magic_quotes_gpc 配置指令影响到 Get,Post 和 Cookie 的值。如果打开,值 (It’s “PHP!”) 会自动转换成 (It\’s \”PHP!\”)。数据库的插入就需要转义。
5.2 IMAGE SUBMIT 变量名
当提交表单时,可以用一幅图像代替标准的提交按钮,用类似这样的标记:
当用户点击到图像中的某处时,相应的表单会被传送到服务器,并加上两个变量 sub_x 和 sub_y。它们包含了用户点击图像的坐标。有经验的用户可能会注意到被浏览器发送的实际变量名包含的是一个点而不是下划线(即 sub.x 和 sub.y),但 PHP 自动将点转换成了下划线。
5.3 HTTP Cookies
在浏览器中一个 cookie 会替换掉上一个同名的 cookie,除非路径或者域不同。因此对于购物车程序可以保留一个计数器并一起传递,例如:
if (isset($_COOKIE['count'])) {
$count = $_COOKIE['count'] + 1;
} else {
$count = 1;
}
setcookie('count', $count, time()+3600);
setcookie("Cart[$count]", $item, time()+3600);
5.4 确定变量类型
PHP 包括几个函数可以判断变量的类型,例如:gettype(),is_array(),is_float(),is_int(),is_object() 和 is_string()。
第四章 常量
1、语法
常量名和其它任何 PHP 标签遵循同样的命名规则。合法的常量名以字母或下划线开始,后面跟着任何字母,数字或下划线。用正则表达式是这样表达的:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
和 superglobals 一样,常量的范围是全局的。不用管作用域就可以在脚本的任何地方访问常量。
可以用 define() 函数来定义常量,也可以用该函数检查是否定义了某常量。
一个常量一旦被定义,就不能再改变或者取消定义。
可以简单的通过指定其名字来取得常量的值,不要在常量前面加上 $ 符号。如果常量名是动态的,也可以用函数 constant() 来读取常量的值。用 get_defined_constants() 可以获得所有已定义的常量列表。
2、 常量和变量不同
1)常量前面没有美元符号($);
2)常量只能用 define() 函数定义,而不能通过赋值语句;
3)常量可以不用理会变量范围的规则而在任何地方定义和访问;
4)常量一旦定义就不能被重新定义或者取消定义;
5)常量的值只能是标量。
3、魔术常量
1)LINE 文件中的当前行号。
2)FILE 文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。
3)FUNCTION 返回该函数被定义时的名字(区分大小写)
4)CLASS 返回该类被定义时的名字(区分大小写)
5)METHOD 返回该方法被定义时的名字(区分大小写)。