所以,你必须在一个文件中有很多实用函数:
{ //This function does a utility thing like string processing } { //This function does nother utility thing like database processing } { //This function is ... }自由地在应用程序中使用函数。那么你或许想要将它们包装成一个类作为静态函数:
class Utility { { } { } { } } //and call them as $a = Utility::utility_a(); $b = Utility::utility_b();这里你可以得到的一个明显好处是,如果php有相似名称的内置函数,那么名称不会发生冲突。
从另一个角度看,你可以在相同的应用程序中保持多个版本的相同类,而不会发生任何冲突。因为它被封装了,就是这样。
19.一些傻瓜式技巧不要写这样的代码:
if($a == true) $a_count++;这绝对是一种浪费。
这样写
if($a == true) { $a_count++; }不要通过吃掉语法缩短你的代码。而是要让你的逻辑更简短。
比方说,你要trim一个数组的所有元素。新手会这样做:
foreach($arr as $c => $v) { $arr[$c] = trim($v); }但它可以使用array_map变得更整洁:
$arr = array_map('trim' , $arr);这适用于trim数组$arr的所有元素。另一个类似的函数是array_walk。
21.使用php过滤器验证数据你是不是使用正则表达式来验证如电子邮件,IP地址等值?是的,每个人都是这样做的。现在,让我们试试一个不同的东西,那就是过滤器。
php过滤器扩展程序将提供简单的方法来有效验证或校验值。
22.强制类型检查 $amount = intval( $_GET['amount'] ); $rate = (int) $_GET['rate'];这是一种好习惯。
23.使用set_error_handler()将Php错误写入到文件set_error_handler()可以用来设置自定义的错误处理程序。在文件中编写一些重要的错误用于日志是个好主意。
24.小心处理大型数组大型的数组或字符串,如果一个变量保存了一些规模非常大的东西,那么要小心处理。常见错误是创建副本,然后耗尽内存,并得到内存溢出的致命错误:
$db_records_in_array_format; //This is a big array holding 1000 rows from a table each having 20 columns , every row is atleast 100 bytes , so total 1000 * 20 * 100 = 2MB $cc = $db_records_in_array_format; //2MB more some_function($cc); //Another 2MB ?当导入csv文件或导出表到csv文件时,上面这样的代码很常见。
像上面这样做可能经常会由于内存限制而让脚本崩溃。对于小规模的变量它不会出现问题,但当处理大型数组时一定要对此加以避免。
考虑通过引用传递它们,或者将它们存储在一个类变量中:
$a = get_large_array(); pass_to_function(&$a);这样一来,相同的变量(并非其副本)将用于该函数。
class A { { $this->a = get_large_array(); $this->pass_to_function(); } { //process $this->a } }尽快复原它们,这样内存就能被释放,并且脚本的其余部分就能放松。
下面是关于如何通过引用来赋值从而节省内存的一个简单示例。
<?php ini_set('display_errors' , true); error_reporting(E_ALL); $a = array(); for($i = 0; $i < 100000 ; $i++) { $a[$i] = 'A'.$i; } echo 'Memory usage in MB : '. memory_get_usage() / 1000000 . '<br />'; $b = $a; $b[0] = 'B'; echo 'Memory usage in MB after 1st copy : '. memory_get_usage() / 1000000 . '<br />'; $c = $a; $c[0] = 'B'; echo 'Memory usage in MB after 2st copy : '. memory_get_usage() / 1000000 . '<br />'; $d =& $a; $d[0] = 'B'; echo 'Memory usage in MB after 3st copy (reference) : '. memory_get_usage() / 1000000 . '<br />';一个典型php 5.4机器上的输出是:
Memory usage in MB : 18.08208 Memory usage in MB after 1st copy : 27.930944 Memory usage in MB after 2st copy : 37.779808 Memory usage in MB after 3st copy (reference) : 37.779864因此可以看出,内存被保存在第3份通过引用的副本中。否则,在所有普通副本中内存将被越来越多地使用。
25.在整个脚本中使用单一的数据库连接请确保你在整个脚本使用单一的数据库连接。从一开始就打开连接,使用至结束,并在结束时关闭它。不要像这样在函数内打开连接:
{ $db = new Database(); $db->query(" cart ....."); } { $db = new Database(); $db->query("DELETE FROM cart ....."); }有多个连接也不好,会因为每个连接都需要时间来创建和使用更多的内存,而导致执行减缓。
在特殊情况下。例如数据库连接,可以使用单例模式。