1,不确定对象值或数组key
慢慢的已经习惯性的抛弃了smarty,但是不经意间会想起<{$value->title|default:''}>的使用,不少程序员都会不经意间把不存在的对象值或者数组KEY值直接使用,或许是PHP的一种习惯.随着对报错和警告的进一步的深入,我们有必要在书写的时候做更多层判断.
早些年我们或许会用到各种条件进行筛选: if(isset($a)&&is_array($a)&&!empty($a)) 等 慢慢的你会发现这是过多的无用代码沉积,然而怎么解决这一现象呢,你马上会联想到smarty中<{$value->title|default:''}>, 随后进入其中发现原来smarty会进行多一次的处理,然而在PHP中如何解决呢:其实很简单function process($arr,$key,$type=null){
$flag = false;
$arr = (array)$arr;
$re = '';
if(isset($type) && is_string($type) && trim($type) != ''){
switch($type){
case 'string':
$re = is_array($arr)?(isset($arr[$key])&&is_string($arr[$key])?$arr[$key]:""):"";//转换为字符串方法
$flag = true;break;
case 'array':
$re = is_array($arr)?(isset($arr[$key])&&is_array($arr[$key])?$arr[$key]:array()):array();//转换为数组方法
$flag = true;break;
default:
$re = '可自行加入其它数据形式';
$flag = true;
}
}
if($flag === false && !isset($arr[$key])){
$re = '';//默认在所有不确定 返回空字符 可根据项目实际情况调节
$flag = true;
}
if($flag === false && is_string($arr[$key])){
$re = trim($arr[$key]);
$flag = true;
}
if($flag === false && is_array($arr[$key])){
$re = $arr[$key];
$flag = true;
}
if($flag === false && is_integer($arr[$key])){
$re = trim($arr[$key]);
$flag = true;
}
if($flag === false){
$re = '方法有漏洞,请更新!';//正式用时删除 测试方法使用
}
return $re;
}
你会发现只是一个很小的思考方式的改变而已,在以后的编码过程中你会慢慢的喜欢上这个方法,因为他实在可以为你省略很多无用代码.不过记住不要出现isset(process($a,'xx'))
这个就不做多说明.然而仅仅是这样也许会觉得不够,因为很多情况下为空的时候我们需要保留值,那么就会有下面
function setDefault($data, $key, $default=''){
if (isset($data)){
if (is_object($data) && isset($data->$key)){
return $data->$key;
}
if (is_array($data) && isset($data[$key])){
return $data[$key];
}
if (is_bool($data) || is_string($data) || is_int($data)){
return $data;
}
return $default;
}else {
return $default;
}
}
慢慢的你会发现你会有更多的需求,比如截取,截取后的留值等...
/**
* 截取字符 if > $len ... else 空白 多添加一个字段$string 作为截取后追加字段可不填写
*/
function cut_str($str,$len=20,$strip_tags=false,$string=''){
if ($strip_tags) {
$str = strip_tags($str);
$pattern = array('/\ /', '/ {2,}/', '/\s{2,}/');
$str = preg_replace($pattern, '', $str);
}
if (mb_strlen($str, 'utf-8') > $len)
{
return mb_substr($str,0,$len,"utf-8").$string;
}
else
{
return $str;
}
}
也许你会感觉到为什么不将3个方法合并在一起呢?这个是绝对可以合并一起的,不过这就是一个泛的控制了,符合自己的才是最好的,灵活总会以牺牲一些为代价
2,正则中文的问题
前不久在出来搜索的时候,突然来了一个特别有意思的需求,当关键词中含有数字,字母或汉字的时候才触发,貌似正则对于中文而已确实有那么点坑爹,找了好久的资料才找出解决方案
function passValid($string){
$flag = false;
if(preg_match("/[a-zA-Z0-9]{1,}/",$string) == false){
if(preg_match("/^.*[\x{4e00}-\x{9fa5}]+$/u",$string)){
$flag = true;
}
}else{
$flag = true;
}
return $flag;
}