设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

PHP中一些通用和易混淆技术点的最佳编程实践

2013-6-4 13:43| 发布者: 红黑魂| 查看: 3450| 评论: 0|来自: 开源中国编译

摘要: 最新改进维护本文档最后一次于2013年3月8日审核。最后一次修改是在2013年3月8日。这由我,Alex Cabal维护的。到现在我已经写了很长时间PHP代码了, 目前我运行Scribophile,为严肃作家提供的在线写作小组,Writerfolio, ...


陷阱

  • 当绑定整型变量时,如果不传递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> 标签必须是文件中的第一行—在它前面有任何空格或换行符都会使其失效。

进一步阅读


自动载入类

用 spl_autoload_register() 来注册你要自动载入的函数。

PHP提供几种方式来自动载入含有还没被载入的类的文件。较老的方式是使用名为__autoload()的魔术全局函数。但你一次只能使用一个定义的 __autoload() 函数,所以当你包含一个也使用了 __autoload() 函数的库时,就会造成冲突。

解决这个问题的正确方式是把你的自动载入函数命名成一个唯一的名称,然后用 spl_autoload_register() 函数注册。这个函数允许定义多个 __autoload() 函数,这样你就不会踩到其它代码所含的 __autoload() 函数了。

例如:

01<?php
02// 首先,定义你的自动载入的函数
03function MyAutoload($className){
04    include_once($className '.php');
05}
06  
07// 然后注册它.
08spl_autoload_register('MyAutoload');
09  
10// 试试让它工作!
11// 因为我们没包含一个定义有MyClass的文件,所以自动加载器会介入并包含MyClass.php.
12// 对本例来说,假定在MyClass.php文件中定义了MyClass类.
13$var new MyClass();
14?>

进一步阅读


从性能角度比较单引号和双引号

这并不重要。

关于“定义字符串时应使用单引号还是双引号”,已有很多笔墨评论了。单引号字符串不会进行解析,所以无论你在字符串放了什么,都会原样显示。双引号字符串会被解析,在里面的任何PHP变量都会被求值兑现。另外,对于转义字符(如换行符\n和制表符\t),在单引号和双引号中的差别也是同样的。

因为双引号字符串会在运行时进行解析,理论上能用单引号就用单引号,这应该可以提升性能,因为PHP不需要对单引号字符串额外进行解析。虽然对具有一定规模的应用来说这可能是真的,但对于一般现实生活中应用程序来说,效率差距微乎其微,它其实并不重要因此对于一般应用程序你选择什么并不重要(译者注:因此更重要的是,当使用单引号字符串时,应确保它在以后绝无可能加入需要解析的成份,否则你就要在将来多麻烦一下把它改成双引号)对于非常高负荷应用程序它可能有一点影响。选择使用哪种方式,取决于应用程序需求但无论你选择哪种,应该保持一致。

进一步阅读


define() 和 const 的比较

使用 define() ,除非关注“可读性,类常量,微优化”

传统上在PHP中使用define()函数来定义常量但根据一些意见,PHP也获得了用const关键字声明常量的能力。那么定义常量你应该使用哪一个呢

答案就在于这两种方法之间微小差异:

  1. define() 是在运行时定义常量,而 const 是在编译时定义常量。这给了const一个很轻微的速度优势,但达不到值得担心的程度,除非你在建立大型软件
  2. define() 把常量放在全局范围,虽然你可以在你的常量名称中包含命名空间。这意味着你不能用define()来定义类常量。
  3. define() 允许你在常量名称和常量值中都使用表达式,而 const 则都不允许。这使得define() 灵活得多。
  4. define() 可以在一个 if() 块中被使用,而 const 不能.

例子:

01<?php
02// 来看看这两种方法如何处理名称空间
03namespace MiddleEarth\Creatures\Dwarves;
04const GIMLI_ID = 1;
05define('MiddleEarth\Creatures\Elves\LEGOLAS_ID', 2);
06  
07echo(\MiddleEarth\Creatures\Dwarves\GIMLI_ID);  // 1
08echo(\MiddleEarth\Creatures\Elves\LEGOLAS_ID);  // 2; 注意,对此常量,我们是用define()定义的,
但也能识别空间。
09  
10// <span>现在让我们来</span><span>声明一些值是</span><span>位</span><span>移运算结果的
</span><span>常数来</span><span>代表</span><span>进入</span><span>魔多的方式</span>Mordor.
11define('TRANSPORT_METHOD_SNEAKING', 1 << 0); // OK!
12const TRANSPORT_METHOD_WALKING = 1 << 1; //编译错误! const 不允许使用表达式作为值
13  
14// 接下来, 条件常量。
15define('HOBBITS_FRODO_ID', 1);
16  
17if($isGoingToMordor){
18    define('TRANSPORT_METHOD', TRANSPORT_METHOD_SNEAKING); // OK!
19    const PARTY_LEADER_ID = HOBBITS_FRODO_ID // 编译错误: const 不能用于 if 块中
20}
21  
22// 最后, 类常量
23class OneRing{
24    const MELTING_POINT_DEGREES = 1000000; // OK!
25    define('SHOW_ELVISH_DEGREES', 200); // 编译错误: 在类内不能使用define()
26}
27?>

因为define() 最终更为灵活,它是你避免头痛的选择,除非你非常需要类常量。用const可产生更易阅读的代码,但要付出灵活性的代价。

无论你用哪一种,应保持一致!

进一步阅读



酷毙
1

雷人

鲜花

鸡蛋

漂亮

刚表态过的朋友 (1 人)

  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部