V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jacob
V2EX  ›  问与答

php 的代码看不懂怎么破

  •  
  •   jacob · 2014-12-16 15:06:40 +08:00 · 4642 次点击
    这是一个创建于 3667 天前的主题,其中的信息可能已经有所发展或是发生改变。

    静态方法,引用传递,正则替换,还有用0,1,2,3表示页面类型…..我真的看蒙圈了,

    <?php
    class Page{
        static $instances             = array();
        static $instancesByName     = array();
        static $instancesBySpecial   = array();
        function __construct($v,$byField=0,$fromRow=0,$pvq=0){
            # byField: 0=ID; 1=Name; 3=special
            if (!$byField && is_numeric($v)){ // by ID
                $r=$fromRow?$fromRow:($v?dbRow("select * from pages where id=$v limit 1"):array());
            }
            else if ($byField == 1){ // by name
                $name=strtolower(str_replace('-','_',$v));
                $fname='page_by_name_'.md5($name);
                $r=dbRow("select * from pages where name like '".addslashes($name)."' limit 1");
            }
            else if ($byField == 3 && is_numeric($v)){ // by special
                $fname='page_by_special_'.$v;
                $r=dbRow("select * from pages where special&$v limit 1");
            }
            else return false;
            if(!count($r || !is_array($r)))return false;
            if(!isset($r['id']))$r['id']=0;
            if(!isset($r['type']))$r['type']=0;
            if(!isset($r['special']))$r['special']=0;
            if(!isset($r['name']))$r['name']='NO NAME SUPPLIED';
            foreach ($r as $k=>$v) $this->{$k}=$v;
            $this->urlname=$r['name'];
            $this->dbVals=$r;
            self::$instances[$this->id] =& $this;
            self::$instancesByName[preg_replace('/[^a-z0-9]/','-',strtolower($this->urlname))] =& $this;
            self::$instancesBySpecial[$this->special] =& $this;
            if(!$this->vars)$this->vars='{}';
            $this->vars=json_decode($this->vars);
        }
        function getInstance($id=0,$fromRow=false,$pvq=false){
            if (!is_numeric($id)) return false;
            if (!@array_key_exists($id,self::$instances)) self::$instances[$id]=new Page($id,0,$fromRow,$pvq);
            return self::$instances[$id];
        }
        function getInstanceByName($name=''){
            $name=strtolower($name);
            $nameIndex=preg_replace('#[^a-z0-9/]#','-',$name);
            if(@array_key_exists($nameIndex,self::$instancesByName))return self::$instancesByName[$nameIndex];
            self::$instancesByName[$nameIndex]=new Page($name,1);
            return self::$instancesByName[$nameIndex];
        }
        function getInstanceBySpecial($sp=0){
            if (!is_numeric($sp)) return false;
            if (!@array_key_exists($sp,$instancesBySpecial)) $instancesBySpecial[$sp]=new Page($sp,3);
            return $instancesBySpecial[$sp];
        }
    }
    
    29 条回复    2014-12-18 11:49:25 +08:00
    em70
        1
    em70  
       2014-12-16 15:34:11 +08:00 via Android
    自己一行一行读,加上注释
    mahone3297
        2
    mahone3297  
       2014-12-16 15:58:07 +08:00
    一共也没几行,慢慢啃吧。。。
    yangxiongwei
        3
    yangxiongwei  
       2014-12-16 15:59:56 +08:00
    共也没几行,仔细读吧。
    例外PHP是最好的语言。
    kevinroot
        4
    kevinroot  
       2014-12-16 16:01:15 +08:00
    那么问题来了,哪里看不懂
    jacob
        5
    jacob  
    OP
       2014-12-16 16:02:50 +08:00
    多说要慢慢读,可是真的有点读不来了,虽说没多少,可是包含的知识真不少.还得分别从基础搞起.
    zgk
        6
    zgk  
       2014-12-16 16:18:51 +08:00 via Android
    慢慢加注释
    tini8
        7
    tini8  
       2014-12-16 16:19:34 +08:00
    看不懂正常,高手看别人的代码也头疼
    Paranoid
        8
    Paranoid  
       2014-12-16 16:27:03 +08:00
    只能跟你说,只要不是自己敲出来的代码,都是一坨屎!!!!!
    anewg
        9
    anewg  
       2014-12-16 16:27:49 +08:00
    格式整理下再读吧。。。
    xidianlz
        10
    xidianlz  
       2014-12-16 16:28:05 +08:00
    小黄鸭调试法
    macdino
        11
    macdino  
       2014-12-16 16:39:28 +08:00
    @Paranoid 自已敲出的,然后自已再看,也是一坨屎!!!!
    Paranoid
        12
    Paranoid  
       2014-12-16 16:51:22 +08:00
    @macdino 至少你看懂你自己写的吧。
    jacob
        13
    jacob  
    OP
       2014-12-16 17:09:51 +08:00
    @kevinroot

    构造函数里的pvq参数的作用,最看不懂的是这个
    else if ($byField == 3 && is_numeric($v)){ // by special
    $fname='page_by_special_'.$v;
    $r=dbRow("select * from pages where special&$v limit 1");
    }


    special是bigint 字段,代表页面的类型.

    special&$v 按位与


    完全不懂这样做的目的和效果.
    tmkook
        14
    tmkook  
       2014-12-16 17:21:08 +08:00   ❤️ 1
    干嘛要看懂?有什么需求慢慢调试啊。
    tini8
        15
    tini8  
       2014-12-16 17:25:35 +08:00
    @tmkook 对头,顺藤摸瓜是很重要的能力,特别是接受别人烂摊子的时候(话说别人的摊子没有不烂的),这种能力从书本上学不到,就像善用搜索的能力。

    像看书一样看别人的代码根本行不通,一个几千行的文件足够把人看晕了。
    wesley
        16
    wesley  
       2014-12-16 17:26:42 +08:00
    special&$v 按位与
    ============
    你理解成SQL中的 a AND b就可以了
    wesley
        17
    wesley  
       2014-12-16 17:29:36 +08:00
    special&$v我解释错了。。。。
    另外pvq这参数似乎没用上吧
    jacob
        18
    jacob  
    OP
       2014-12-16 17:30:43 +08:00
    @tmkook 以前也是这么搞.这次我是想弄懂来着.慢慢看吧.
    @wesley 好像有点懂了- -.
    hackwjfz
        19
    hackwjfz  
       2014-12-16 17:32:57 +08:00 via Android
    难道只有我每次都想把别人的代码读懂→_→
    jacob
        20
    jacob  
    OP
       2014-12-16 17:34:21 +08:00
    @wesley 这.好像就是你说的,就是为了确定$v在special里有没有这个内容吧.是不是只要与的结果不是0就行?

    pvq这参数确实没找到.不知道干啥的.
    66beta
        21
    66beta  
       2014-12-16 17:41:44 +08:00
    "select * from pages where special&$v limit 1"
    第一次见这个SQL查询方法,学习了
    难道special里面存的就是id?
    sampeng
        22
    sampeng  
       2014-12-16 19:26:27 +08:00
    人家都给了你注释。。这很好读啊。。。
    sampeng
        23
    sampeng  
       2014-12-16 19:29:10 +08:00
    除了没空格。。
    lygmqkl
        24
    lygmqkl  
       2014-12-16 20:25:07 +08:00
    这种代码风格不可取。。。

    可读性太差。。。虽然我能看得懂。
    kevinroot
        25
    kevinroot  
       2014-12-16 21:53:34 +08:00
    @jacob 那个奇葩的写法就是a and b,不是什么位运算
    kevinroot
        26
    kevinroot  
       2014-12-16 21:55:12 +08:00
    @lygmqkl 确实也不规范 if 大括号也没有
    blakefan
        27
    blakefan  
       2014-12-16 22:51:43 +08:00 via Android
    @tini8 赞同极了,正在接收烂摊子
    ivanlw
        28
    ivanlw  
       2014-12-17 05:31:59 +08:00
    这个格式看起来好清爽,请问用什么实现解析的呢?
    jacob
        29
    jacob  
    OP
       2014-12-18 11:49:25 +08:00
    @ivanlw v2的帖子编辑时可以选择markdown.发帖时没有,很奇怪.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1062 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 19:38 · PVG 03:38 · LAX 11:38 · JFK 14:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.