1. 要输出大段文本时,跳出PHP解析模式通常比将文本通过echo或print输出更有效率(手册)
2. note :为了代码的发行及一致性,确保不要使用短标记,短标记仅通过php.ini配置文件中的指令short_open_tag打开后才可能使用,或者在PHP编译时加入了--enable-short-tag选项,php5.4后,短格式的echo标记<?=总会被识别并且合法,不管short_open_tag的设置是什么。(手册)
3. 当转换为boolean时,以下的值被认为是FALSE:(手册)
- 布尔值FALSE本身
- 整形值0
- 浮点型值0.0
- 空字符串以及字符串"0"
- 不包括任何元素的数组
- 不包括任何成员变量的对象
- 特殊类型NULL
- 从空标记生成的simpleXML对象
其他所有值都被认为是TURE(包括任何资源)
4. 如果给定的一个数超出了integer的范围,将会被解释为float.同样如果执行的运算结果超出了integer范围,也会返回float。通常最大值大约二十亿(32位符号),9E18(64位符号)。
php没有整除运算符,1/2产生float0.5。值可以舍弃小数部分强制转换为integer,或者使用round()函数更好的四舍五入。
从布尔值转换,FALSE讲产生出0,TRUE讲产生出1.(手册)
5. 永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。
某些数学运算产生一个由常量NAN所代表的结果。此结果代表一个在浮点预算中未定义或不可表述的值,任何拿此值与它的值比较(包括自身),结果都是FALSE,应使用is_nan()来检查。(手册)
**6. 不像双引号和heredoc语法结构,在单引号字符串中的变量和特殊符号的转义序列将不会被替换。更多字符串的用法详解见(手册)
\n | 换行(ASCII 字符集中的 LF 或 0x0A (10)) |
\r | 回车(ASCII 字符集中的 CR 或 0x0D (13)) |
\t | 水平制表符(ASCII 字符集中的 HT 或 0x09 (9)) |
\v | 垂直制表符(ASCII 字符集中的 VT 或 0x0B (11))(自 PHP 5.2.5 起) |
\e | Escape(ASCII 字符集中的 ESC 或 0x1B (27))(自 PHP 5.4.0 起) |
\f | 换页(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起) |
\\ | 反斜线 |
\$ | 美元标记 |
\" | 双引号 |
\[0-7]{1,3} | 符合该正则表达式序列的是一个以八进制方式来表达的字符 |
\x[0-9A-Fa-f]{1,2} | 符合该正则表达式序列的是一个以十六进制方式来表达的字符 |
7. php中的数组实际上是一个有序的映射,映射是一种把values关联到keys的类型,由于数组元素的值也可以是一个数组,所以树形结构和多维数组也是允许的。(守则)
应该始终在用字符串表示的数组索引上加引号,但并不是总是给键名加上引号,用不着给键名为常量或者变量的加上引号,否则PHP不能解析他们。
8. PHP中并不需要初始化变量,但是对变量进行初始化是个好习惯,未初始化的变量具有其类型的默认值-布尔类型的变量默认值是FALSE,整形和浮点型变量的默认值是零,字符串变量的默认值是空字符串以及数组变量的默认值是空数组。依赖未初始化变量的默认值在某些情况下会有问题,例如把一个文件包含到另一个之中时碰到相同的变量名。另外吧register_globals打开时一个主要的安全隐患。使用未初始化的变量会发出E_NOTICE错误,但是向一个为初始化的数组附加单元时不会。isset()语言结构可以用来检测一个变量是否已被初始化。(守则)
9. (手册)
<?php
$a = 1;/*global scope */ function Test()
{
echo $a; /* reference to local scope variable */
} Test();
?>
这个脚本不会有任何输出,因为echo语句引用了一个局部版本的变量$a,而且在这个范围内,他并没有被赋值。
php中全局变量在函数中使用时必须声明为global,或者使用特殊的PHP自定义$GLOBALSS数组。
静态变量尽在局部函数与中存在,但当程序执行离开此作用域时,其值并不丢失。(静态变量不能用表达式的结果对其赋值,否则会导致解析错误,静态声明实在编译时解析的。)
在Zend引擎1代,它驱动了php4,对于变量的static和global定义是以引用的方式实现的,例如,在一个函数域内部用global语句导入一个真正的全局变量实际上是建立了一个到全局变量的引用。
10. 可变变量用于数组,必须解决一个模棱两可的问题,例如写下$$[1]时,解析器需要知道是想要$a[1]作为一个变量呢,还是想要$$a作为一个变量并取出该变量中索引为[1]的值,解决此方法的语法是,对第一种情况用${$a[1]},对第二种情况用${$a}[1]。
注意,在php的函数和类的方法中,超全局变量是不能用作可变变量。$this变量也是一个特使变量,不能被动态引用。(手册)
11. PHP透明的支持HTTP cookies.Cookies是一种在远端浏览器端储存数据并能追踪或识别再次访问的用户机制,可以用setcookie()函数设定cookies.Cookies是HTTP信息头中的一部分,因此SetCookie函数必须在向浏览器发送任何输出之前调用。对于Header()函数也有同样的限制。Cookie数据会在相应的cookie数据组中可用,更多细节详见(手册)
注意在浏览器中的一个cookie会替换掉上一个同名的cookie,除非路径或者域不同。因此对于购物车程序可以保留一个计数器并一起传递。
<?php
if(isset($_COOKIE['count'])){
$count = $_COOKIE['count'] + 1;
}else{
$count = 1;
}
setcookie('count',$count,time()+3600);
setcookie("Cart[$count]",$item,time()+3600);
12. 和superglobals一样,常量的范围是全局的,不用管作用域就可以在脚本的任何地方访问常量。(手册)
可以用define()函数来定义常量,在php5.30以后,可以使用const关键字在类定义之外定义常量。一个常量一旦被定义,就不能改变或者取消定义。
注意:和使用define()来定义常量相反的是,使用const关键字定义常量必须处于最顶端的作用区域,因此用此方法是在编译时定义的。这就意味着不能再函数内,循环内以及if语句内用const来定义常量。
名称 | 说明 |
---|---|
__LINE__ |
文件中的当前行号。 |
__FILE__ |
文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。 |
__DIR__ |
文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增) = |
__FUNCTION__ |
函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。 |
__CLASS__ |
类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起 __CLASS__ 对 trait 也起作用。当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字。 |
__TRAIT__ |
Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如 Foo\Bar)。 |
__METHOD__ |
类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。 |
__NAMESPACE__ |
当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。 |
13. 出发运算总是返回浮点数,只有在下列情况例外,两个操作数都是整数并且正好能整除,这是它返回一个整数。
取模运算的操作数在运算之前都会被转换成整数(除去小数部分)
取模运算符%的结果和被除数的符号相同,即$a%$b的结果和$a的符号相同。
注意:赋值运算将原变量的值拷贝到新变量中(传值赋值),所以改变其中一个并不影响另一个。但是有个例外就是碰到对象object时,在php5中是以引用赋值的,除非明确使用了clone关键字来拷贝。
PHP5起,new运算符自动返回一个引用,因此在对new的结果进行引用赋值在php5.3以及以后版本中会发出一条E_DEPRECATED的错误信息。(手册)
14. php支持一个错误控制运算符:@。当将其放置在一个php表达式之前,该表达式可能产生的任何错误信息都会被忽略掉。如果用set_error_handler()设定了自定义的错误处理函数,仍然会被调用,但是此错误处理函数可以调用error_reporting(),而该函数在出错语句前有@时将返回0(手册)
15. +运算符把右边的数组元素附加到左边的数组后面,两个数组中都有的建名,则只用左边数组中的,右边的被忽略。(手册)