陷阱当绑定整型变量时,如果不传递PDO::PARAM_INT参数有事可能会导致PDO对数据加引号。这会 搞坏特定的MySQL查询。查看该bug报告。 未使用 `set names utf8mb4` 作为首个查询,可能会导致Unicode数据错误地存储进数据库,这依赖于你的配置。如果你 绝对有把握你的Unicode编码数据不会出问题,那你可以不管这个。 启用持久连接可能会导致怪异的并发相关的问题。这不是一个PHP的问题,而是一个应用层面 的问题。只要你仔细考虑了后果,持久连接一般会是安全的。查看Stack Overfilow这个问题。 即使你使用了 `set names utf8mb4` ,你也得确认实际的数据库表使用的是utf8mb4字符集! 可以在单个execute()调用中执行多条SQL语句。只需使用分号分隔语句,但注意这个bug,在该文档所针对的PHP版本中还没修复。
进一步阅读
PHP标签使用<?php ?>.界定PHP代码块有几种不同方式: <?php ?>, <?= ?>, <? ?>,和 <% %>。虽然更短的方式更便于输入,但能保证在所有PHP服务器上都能工作的只有<?php ?>。如果你计划把你的PHP程序部署到一个你不能控制其配置的服务器上,你必须始终使用 <?php ?>。 如果你有足够权限控制PHP运行环境的配置,你会发现使用更短的标签自然更方便。但要记住,<? ?> 可能与XML声明冲突,而 <% %> 则实际是ASP的风格. 无论你选择哪一种,请确保你保持一致! 陷阱- 当在一个纯粹的PHP文件(例如一个只包含一个类定义的文件)中包含一个结束?>标签,确保不要在它后面留下任何尾随的换行符。因为虽然PHP解析器能安全“吃掉”一个关闭标签后面的换行符,其它的换行符却可能输出到浏览器,当你过后想输出任何HTTP头时,这会造成干扰。
- 当写web程序时,确保不要在任何关闭标签 ?> 和 html <!doctype> 标签之间留下换行符。对正确的HTML来说,<!doctype> 标签必须是文件中的第一行—在它前面有任何空格或换行符都会使其失效。
进一步阅读
自动载入类PHP提供几种方式来自动载入含有还没被载入的类的文件。较老的方式是使用名为__autoload()的魔术全局函数。但你一次只能使用一个定义的 __autoload() 函数,所以当你包含一个也使用了 __autoload() 函数的库时,就会造成冲突。 解决这个问题的正确方式是把你的自动载入函数命名成一个唯一的名称,然后用 spl_autoload_register() 函数注册。这个函数允许定义多个 __autoload() 函数,这样你就不会踩到其它代码所含的 __autoload() 函数了。 例如:03 | function MyAutoload( $className ){ |
04 | include_once ( $className . '.php' ); |
08 | spl_autoload_register( 'MyAutoload' ); |
进一步阅读
从性能角度比较单引号和双引号这并不重要。关于“定义字符串时应使用单引号还是双引号”,已有很多笔墨评论了。单引号字符串不会进行解析,所以无论你在字符串放了什么,都会原样显示。双引号字符串会被解析,在里面的任何PHP变量都会被求值兑现。另外,对于转义字符(如换行符\n和制表符\t),在单引号和双引号中的差别也是同样的。 因为双引号字符串会在运行时进行解析,理论上能用单引号就用单引号,这应该可以提升性能,因为PHP不需要对单引号字符串额外进行解析。虽然对具有一定规模的应用来说这可能是真的,但对于一般的现实生活中的应用程序来说,效率差距微乎其微,它其实并不重要。因此对于一般的应用程序,你选择什么并不重要(译者注:因此更重要的是,当使用单引号字符串时,应确保它在以后绝无可能加入需要解析的成份,否则你就要在将来多麻烦一下把它改成双引号)。对于非常高负荷的应用程序,它可能有一点影响。选择使用哪种方式,取决于你应用程序的需求,但无论你选择哪种,应该保持一致。 进一步阅读
define() 和 const 的比较使用 define() ,除非关注“可读性,类常量,微优化”传统上,在PHP中你会使用define()函数来定义常量。但根据一些意见,PHP也获得了用const关键字声明常量的能力。那么定义常量时,你应该使用哪一个呢? 答案就在于这两种方法之间微小的差异: - define() 是在运行时定义常量,而 const 是在编译时定义常量。这给了const一个很轻微的速度优势,但达不到值得担心的程度,除非你在建立大型软件。
- define() 把常量放在全局范围,虽然你可以在你的常量名称中包含命名空间。这意味着你不能用define()来定义类常量。
- define() 允许你在常量名称和常量值中都使用表达式,而 const 则都不允许。这使得define() 灵活得多。
- define() 可以在一个 if() 块中被使用,而 const 不能.
例子:03 | namespace MiddleEarth\Creatures\Dwarves; |
05 | define( 'MiddleEarth\Creatures\Elves\LEGOLAS_ID' , 2); |
07 | echo (\MiddleEarth\Creatures\Dwarves\GIMLI_ID); |
08 | echo (\MiddleEarth\Creatures\Elves\LEGOLAS_ID); |
11 | define( 'TRANSPORT_METHOD_SNEAKING' , 1 << 0); |
12 | const TRANSPORT_METHOD_WALKING = 1 << 1; |
15 | define( 'HOBBITS_FRODO_ID' , 1); |
18 | define( 'TRANSPORT_METHOD' , TRANSPORT_METHOD_SNEAKING); |
19 | const PARTY_LEADER_ID = HOBBITS_FRODO_ID |
24 | const MELTING_POINT_DEGREES = 1000000; |
25 | define( 'SHOW_ELVISH_DEGREES' , 200); |
因为define() 最终更为灵活,它是你避免头痛的选择,除非你非常需要类常量。用const可产生更易阅读的代码,但要付出灵活性的代价。 无论你用哪一种,应保持一致! 进一步阅读
|