search

Home  >  Q&A  >  body text

php-php进阶 - 有无一些零碎的优异的php代码,供学习

在设计模式,代码规范,技巧等方面,有没有一些短小而精悍的代码可供学习?

平时比较忙,github上大量优秀的项目我也不能一一比对去看,去研究。所以想去看下优秀且短小的代码,用零碎的时间。

PHP中文网PHP中文网2894 days ago520

reply all(4)I'll reply

  • 天蓬老师

    天蓬老师2017-04-10 17:36:50

    1. 从哪个页面来,返回就到那个页面去。用到str_replace函数。

    define(SINA_LOGIN_URL,'http://weibosina/');
    define(TX_LOGIN)URL,'http://weibotx/');
    
    $referer_from =str_replace(array(SINA_LOGIN_URL,TX_LOGIN_URL), '',  $_SERVER['HTTP_REFERER']);
    $S->assign('return_back',$referer_from);
    $_SERVER[‘HTTP_REFERER’]表示从哪个页面跳转过来的。 
    str_replace在这里替换成具体的那个页面比如:http://weibosina/login.php这个页面跳转走的。那么$referer_from = login.php了。
    1. 获取浏览器类型

    通过$_SERVER[“HTTP_USER_AGENT”]来识别:
     public function index() {
            $browser = 'other';
            if(strpos($_SERVER["HTTP_USER_AGENT"], "TheWorld") || strpos($_SERVER["HTTP_USER_AGENT"], "QIHU THEWORLD")){
                $browser = 'world';
            }elseif(strpos($_SERVER["HTTP_USER_AGENT"], "Maxthon")){
                $browser = 'aoyou';
            }elseif(strpos($_SERVER["HTTP_USER_AGENT"], "TencentTraveler")){ //  or (strpos($_SERVER["HTTP_USER_AGENT"], "Trident") AND strpos($_SERVER["HTTP_USER_AGENT"], "SLCC2"))
                $browser = 'telcent';
            }elseif(strpos($_SERVER["HTTP_USER_AGENT"], "SE 2") AND strpos($_SERVER["HTTP_USER_AGENT"], "MetaSr")){
                $browser = 'sogou';
            }elseif(strpos($_SERVER["HTTP_USER_AGENT"], "360SE") AND !strpos($_SERVER["HTTP_USER_AGENT"], "TencentTraveler")){
                $browser = '360';
            }elseif(strpos($_SERVER["HTTP_USER_AGENT"], "QIHU 360EE") AND !strpos($_SERVER["HTTP_USER_AGENT"], "TencentTraveler")){
                $browser = '360';
            }elseif(strpos($_SERVER["HTTP_USER_AGENT"], "MSIE 9.0")){
                $browser = 'ie9';
            }elseif(strpos($_SERVER["HTTP_USER_AGENT"], "MSIE 8.0")){
                $browser = 'ie8';
            }elseif(strpos($_SERVER["HTTP_USER_AGENT"], "MSIE 7.0")){
                $browser = 'ie7';
            }elseif(strpos($_SERVER["HTTP_USER_AGENT"], "MSIE 6.0")){
                $browser = 'ie6';
            }elseif(strpos($_SERVER["HTTP_USER_AGENT"], "Firefox")){
                $browser = 'firefox';
            }elseif(strpos($_SERVER["HTTP_USER_AGENT"], "Chrome")){
                $browser = 'chrome';
            }elseif(strpos($_SERVER["HTTP_USER_AGENT"], "Safari")){
                $browser = 'safari';
            }
    
            redirect("/start/$browser");exit;
        }
    1. 中英文混合截取指定长度。

    有一些自己写的函数,来实现完美截取,但是比较麻烦,繁琐。
    如果精确度不需要太高的话那就用系统自带的mb_substr()函数好了:
    mb_substr('我们123a好', 0, 6,'utf-8'); //输出:我们123a
    'utf-8' 一定要加上去
    他没有把中文算成2个字符,所有的算成1个字符,这对于有中英文混合的字符串,只需要截图前6位,这样的例子来说,非常实用。

    1. 获取url后缀
      一个内置函数搞定:

    $ext = strrchr($filename,'.');
    1. 等于与全等于
      ==、=== 对应的是!=和!==。

    没有!=== 啊,混蛋!

    1. 子frame如何跳出自身的框架,执行父框架的操作。

     echo
      "<script>alert('登陆超时,请重新登陆');parent.location.href='/index.php/Public/login/'</script>"; 
    die;1

    用parent.xx.xx 执行。

    1. 换行符
      unix系列用 n

    windows系列用 rn
    mac用 r
    PHP中可以用PHP_EOL来替代,以提高代码的源代码级可移植性
    如:

    <?php
        echo PHP_EOL;
        //windows平台相当于    echo "\r\n";
        //unix\linux平台相当于    echo "\n";
        //mac平台相当于    echo "\r";
    ?>

    类似常用的还有
    DIRECTORY_SEPARATOR
    可以用函数get_defined_constants()来获取所有PHP常量

    1. define 一个常量

    define(ROOT,direname(_FILE__));
    echo ROOT;
    
    上面输出的确可以输出ROOT的值,但是也会有一个警告:
    Use of undefined constant ROOT - assumed 'ROOT'
    
    所以,定义常量时,一定要加个引号。
    define('ROOT',direname(_FILE__));
    echo ROOT;
    1. 数组装换成带引号的字符串

    $row = array('ayi','太原','hello',78);
    $b = "'".implode( "','", $row ) . "'";
    var_dump($b);
    //   "'ayi','太原','hello','78'"
    1. PHP返回404

    header('HTTP/1.1 404 Not Found');
    header("status: 404 Not Found"); 
    1. PHP面向对象和面向过程区别
      面向过程 和 面向对象 只是思维方式的差异,与语言无关

    从软件工程学上看
    面向过程 自顶向下分析,自底向上编程
    面向对象 自顶向下分析,自顶向下编程
    因此
    面向过程 必须清晰的了解项目的每一个细节后才可动手
    面向对象 可在粗略了解项目时就可动手,在实现过程中逐步细化
    现在的人都很浮躁,不愿意沉下心来做艰苦细致的调差分析工作。这就是 oop 备受推崇的主要原因之一

    1. xml转换成json

    $xml_obj = simplexml_load_string($xml_info);
    $json = json_encode($xml_obj); 
    1. 分页
      传统的分页,我们都是先select count(*) 求出总共有多少,再用LIMIT 0,20 来求出这一页有多少。

    $sql = "SELECT SQL_CALC_FOUND_ROWS * FROM user WHERE username = 'yangyi' LIMIT {$start},{$limit}";
    $list = $this->db->fetchAll($sql);
    $total = $this->db->fetchOne('SELECT FOUND_ROWS()');
    return array('list' => $list, 'total' => $total);
    用到了 SELECT SQL_CALC_FOUND_ROWS * FROM 和SELECT FOUND_ROWS()来联合求出。

    14.去除换行
    PHP在不同的系统中,换行是不同的

    Linux:\n
    Windows:\r\n
    mac:\r
    所以去除回车换行的方法:
    1.使用str_replace 来替换换行
    $str= str_replace(array("\r\n", "\r", "\n"), "", $str);
    
    2.使用php定义好的变量(比较好的方法)
    $str= str_replace(PHP_EOL, '', $str); 

    15 . smarty 里面直接使用 php的内置函数

    $start_time = ‘2015-05-23 23:01:23’; 变成 ‘2015年05月23日 23:01’
    {=$start_time|strtotime|date_format:"%Y年%m月%d日 %H:%M"=}
    
    $score = ‘3:5’ 。分别获取 3 和 5
    {=$score|substr:0:1=}
    {=$score|substr:2:1=}
    1. 用php内置函数完成二维数组排序
      用到的函数是array_multisort() 专门给多纬数组排序。

    它的官方介绍文档array_multisort
    直接例子:

    $data[0] = array(‘volume' => 67, ‘edition' => 2); 
    $data[1] = array(‘volume' => 86, ‘edition' => 1); 
    $data[2] = array(‘volume' => 85, ‘edition' => 6); 
    $data[3] = array(‘volume' => 98, ‘edition' => 2); 
    $data[4] = array(‘volume' => 86, ‘edition' => 6); 
    $data[5] = array(‘volume' => 67, ‘edition' => 7); 
    上面是一个简单的二维数组,如果我想按照里面的volume字段排序:
    根据文档介绍,先得把这个需要排序的字段数组给初始化出来:
    foreach ($data as $key => $row) { 
        $volume[$key] = $row['volume']; 
        $edition[$key] = $row['edition']; 
    } 
    
    然后按照这个字段数组排序:
    array_multisort($volume, SORT_ASC, $data); //直接影响$data的值。
    
    也可以有按照多个值排序,先按照volume倒序排序,如果相同的,再按照edition正序排:
    array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data); 
    
    最后得到的$data值就是排序好的值了。
    volume | edition 
    ——-+——– 
    98 | 2 
    86 | 1 
    86 | 6 
    85 | 6 
    67 | 2 
    67 | 7 

    17 . 在一个数组中的指定位置插入一个元素,其他元素往后移。
    用到的是php的内置函数:array_slice。这个函数的作用是分割数组。
    官方用法
    它一般有2个用法:

    $b = array_slice($a, 0, 3); //表示从0个开始取出3个元素。返回值$b也是一个数组

    上面是我们平时用的最多的用法,用分割数组。
    如果你再加一个字段,就可以分割并且再拼接了,就是我要用到的:
    //在数组$a的第n个元素的位置上插入$p,原来的第n位以以后往后移。
    //$p如果是个数组就是支持2维数组了。

    array_splice($a, $n-1, 0, $p);

    加入这个参数的意思是,用$p 去替换掉被移除的,但是,我们的长度是0,没有别移除,然后又拼接上去了。算是奇淫技巧吧。而且也直接更改了$a 的值。

    删建:
    引用

    if(file_exists("file.htm"))// 检查是否存在此文件 
    if(file_exists("chat"))//检查是否存在此文件夹 
    rename('index.php','index'); //将index.php 改名为 index 
    fopen("name.php","a+"); //建立文件 
    mkdir("boot","0777"); //建立文件夹且设置属性为777 
    rmdir ("include");//删除文件夹 
    unlink("index.php");//删除文件  

    数据库的查询:
    引用

    $db = new db_query; 
    $db->connect(); 
    $db->query("DROP DATABASE $DbName;");//$dbname 为数据库名 

    连接:
    引用

    header("location:index.php");//转到网页 
    echo "第二步:请选择是否删除所有文件[聊天室]<br>";//写出代码 
    unset($tmp); //清除原有缓存 
    require("global.php");//缓存 
    print <<< eot //写出代码 
    eot;

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 17:36:50

    可以看看当下流行的php框架源码,特别是laravel,写的很友好,注释很清楚。

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-10 17:36:50

    你这是分享笔记么?

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 17:36:50

    这是个很好的需求,我也希望能由一个提供这种需求的平台,但现实是残酷的。

    这里建议可以读一些微框架比如slim
    也可以针对性的阅读大框架中某个独立单元模块,比如active record。

    大框架代码量很大,但是如果针对单一模块来说,代码量还是很小的,而且能满足你的阅读需求

    reply
    0
  • Cancelreply