① 在设计评论系统时,关于文章的一些属性,我们最好存放在一个内存缓存中,通过下面的设计每次仅需要查询一次即可获取文章的所有属性
class CommentsDoc{ private static $docStatusArray=array(); public function getDoc($docUrl){ $info=self::$docStatusArray[$docUrl]; if(!$info){ if($value=$this->memcache->get($docUl);){ $info=explode('_', $value); //第一个元素表述是否允许评论,第二个标示是否需要审核,第三个表示是否允许支持反对 }else{ $info=array(1,-1,1); } self::$docStatusArray[$docUrl]=$info; } return $info; } }
② 获取$_POST、$_GET、$_COOKIE这些全局变量,时都要使用$_GET['variable']这样去获取(register_globals=Off),有时候感觉很麻烦,所以可以在入口文件中加上这样的代码,那么request的变量就可以直接使用了
//request得到的变量过滤后直接使用 foreach ( array ('_COOKIE', '_POST', '_GET' ) as $_request ) { foreach ( $$_request as $_key => $_value ) { $_key {0} != '_' && $$_key = get_magic_quotes_gpc() ? $_value : addslashes($_value); } }
③ 分类
<?php try{ $db=new PDO('mysql:host=localhost;dbname=test','root',''); $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $smt=$db->query('select * from tree'); $result=$smt->fetchAll(PDO::FETCH_ASSOC); }catch(PDOExcption $e){ echo $e->getMessage(); } function arrayToTree($array){ $result=array(); $index=array(); foreach ($array as $key => $value) { if($value['pid']==0){ $i=count($result); $result[$i]=$value; $index[$value['id']]=&$result[$i]; }else{ !isset($index[$value['pid']]['child']) && $index[$value['pid']]['child']=array(); $i=count($index[$value['pid']]['child']); $index[$value['pid']]['child'][$i]=$value; $index[$value['id']]=&$index[$value['pid']]['child'][$i]; } } return $result; } function toList($array,$header=''){ static $result=array(); foreach ($array as $key => $value) { $result[]=$header.$value['title']; if(isset($value['child'])) toList($value['child'],$header.'|__'); } return $result; } print_r(toList(arrayToTree($result))); ?>
④
class RecursiveFileFilterIterator extends FilterIterator { // 满足条件的扩展名 protected $ext = array('jpg','gif'); /** * 提供 $path 并生成对应的目录迭代器 */ public function __construct($path) { parent::__construct(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path))); } /** * 检查文件扩展名是否满足条件 */ public function accept() { $item = $this->getInnerIterator(); if ($item->isFile() && in_array(pathinfo($item->getFilename(), PATHINFO_EXTENSION), $this->ext)) { return TRUE; } } } // 实例化 foreach (new RecursiveFileFilterIterator('/path/to/something') as $item) { echo $item . PHP_EOL; }
⑥ 做接口时,压缩输出字符串还是挺不错的
header('Content-Encoding:'.checkCanGzip()); print ( "x1fx8bx08x00x00x00x00x00" ); echo $gz=gzcompress('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',5); function checkCanGzip() { $HTTP_ACCEPT_ENCODING = $_SERVER ['HTTP_ACCEPT_ENCODING']; if (headers_sent ()) return 0; if (strpos ( $HTTP_ACCEPT_ENCODING, 'x-gzip' ) !== false) return "x-gzip"; if (strpos ( $HTTP_ACCEPT_ENCODING, 'gzip' ) !== false) return "gzip"; return 0; }
⑦ 程序由同步变为异步
⑧ 定义一个schema来验证数组的正确性
/** * 利用schema验证返回数据 * @param array $data * @param array $schema * @return boolean */ function _checkBySchema($data, $schema) { if (!is_array($schema)) { return false; } foreach ($schema as $sk => $sv) { if (is_array($sv)) { if (!isset($data[$sk]) || !is_array($data[$sk])) { return false; } else { if (false === $this->_checkBySchema($data[$sk], $sv)) { return false; } } } else { if (!isset($data[$sv]) || empty($data[$sv])) { return false; } } } return true; }