静态调用的成员一定要定义成 static (仅PHP5) ECFLinux联盟 ECFLinux联盟 提示:PHP 5 引入了静态成员的概念,作用和 PHP 4 的函数内部静态变量一致,但前者是作为类的成员来使用。静态变量和 Ruby 的类变量(class variable)差不多,所有类的实例共享同一个静态变量。 <?phpECFLinux联盟 class foo {ECFLinux联盟 function bar() {ECFLinux联盟 echo 'foobar';ECFLinux联盟 }ECFLinux联盟 }ECFLinux联盟 ECFLinux联盟 $foo = new foo;ECFLinux联盟 ECFLinux联盟 // instance wayECFLinux联盟 ECFLinux联盟 $foo->bar();ECFLinux联盟 ECFLinux联盟 // static wayECFLinux联盟 ECFLinux联盟 foo::bar();ECFLinux联盟 ?> 静态地调用非 static 成员,效率会比静态地调用 static 成员慢 50-60%。主要是因为前者会产生 E_STRICT 警告,内部也需要做转换。ECFLinux联盟 ECFLinux联盟 不要调用毫无意义的函数ECFLinux联盟 ECFLinux联盟 有对应的常量的时候,不要使用函数。 <?phpECFLinux联盟 php_uname('s') == PHP_OS;ECFLinux联盟 php_version() == PHP_VERSION;ECFLinux联盟 php_sapi_name() == PHP_SAPI;ECFLinux联盟 ?> 虽然使用不多,但是效率提升大概在 3500% 左右。ECFLinux联盟 ECFLinux联盟 最快的 Win32 检查 <?phpECFLinux联盟 $is_win = DIRECTORY_SEPARATOR == '\\';ECFLinux联盟 ?> - 不用函数ECFLinux联盟 - Win98/NT/2000/XP/Vista/Longhorn/Shorthorn/Whistler...通用ECFLinux联盟 - 一直可用ECFLinux联盟 ECFLinux联盟 时间问题 (PHP>5.1.0 ONLY)ECFLinux联盟 ECFLinux联盟 你如何在你的软件中得知现在的时间?简单,「time() time() again, you ask me...」。ECFLinux联盟 ECFLinux联盟 不过总归会调用函数,慢。ECFLinux联盟 ECFLinux联盟 现在好了,用 $_SERVER['REQUEST_TIME'],不用调用函数,又省了。ECFLinux联盟 ECFLinux联盟 不要做无谓的替换ECFLinux联盟 ECFLinux联盟 即使没有替换,str_replace 也会为其参数分配内存。很慢!解决办法:ECFLinux联盟 ECFLinux联盟 - 用 strpos 先查找(非常快),看是否需要替换,如果需要,再替换ECFLinux联盟 ECFLinux联盟 效率:ECFLinux联盟 ECFLinux联盟 - 如果需要替换:效率几乎相等,差别在 0.1% 左右。ECFLinux联盟 - 如果不需要替换:用 strpos 快 200%。ECFLinux联盟 ECFLinux联盟 不要把 count/strlen/sizeof 放到 for 循环的条件语句中ECFLinux联盟 ECFLinux联盟 提示:我的个人做法 <?phpECFLinux联盟 for ($i = 0, $max = count($array);$i < $max; ++$i);ECFLinux联盟 ?> 效率提升相对于:ECFLinux联盟 ECFLinux联盟 - count 50%ECFLinux联盟 - strlen 75%ECFLinux联盟 ECFLinux联盟 提高 PHP 文件访问效率ECFLinux联盟 ECFLinux联盟 需要包含其他 PHP 文件的时候,使用完整路径,或者容易转换的相对路径。 <?phpECFLinux联盟 ECFLinux联盟 include 'file.php'; // bad approachECFLinux联盟 ECFLinux联盟 incldue './file.php'; // goodECFLinux联盟 ECFLinux联盟 include '/path/to/file.php'; // idealECFLinux联盟 ECFLinux联盟 ?> 物尽其用ECFLinux联盟 ECFLinux联盟 PHP 有很多扩展和函数可用,在实现一个功能的之前,应该看看 PHP 是否有了这个功能?是否有更简单的实现? <?phpECFLinux联盟 $filename = "./somepic.gif";ECFLinux联盟 $handle = fopen($filename, "rb");ECFLinux联盟 $contents = fread($handle, filesize($filename));ECFLinux联盟 fclose($handle);ECFLinux联盟 ECFLinux联盟 // vs. much simplerECFLinux联盟 ECFLinux联盟 file_get_contents('./somepic.gif');ECFLinux联盟 ?> ECFLinux联盟 关于引用的技巧ECFLinux联盟 ECFLinux联盟 引用可以:ECFLinux联盟 ECFLinux联盟 - 简化对复杂结构数据的访问ECFLinux联盟 - 优化内存使用 <?phpECFLinux联盟 $a['b']['c'] = array();ECFLinux联盟 ECFLinux联盟 // slow 2 extra hash lookups per accessECFLinux联盟 for ($i = 0; $i < 5; ++$i)ECFLinux联盟 $a['b']['c'][$i] = $i;ECFLinux联盟 ECFLinux联盟 // much faster reference based approachECFLinux联盟 $ref =& $a['b']['c'];ECFLinux联盟 for ($i = 0; $i < 5; ++$i)ECFLinux联盟 $ref[$i] = $i;ECFLinux联盟 ?> <?phpECFLinux联盟 $a = 'large string';ECFLinux联盟 ECFLinux联盟 // memory intensive approachECFLinux联盟 function a($str)ECFLinux联盟 {ECFLinux联盟 return $str.'something';ECFLinux联盟 }ECFLinux联盟 ECFLinux联盟 // more efficient solutionECFLinux联盟 function a(&$str)ECFLinux联盟 {ECFLinux联盟 $str .= 'something';ECFLinux联盟 }ECFLinux联盟 ?>
|