V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
jacob
V2EX  ›  问与答

php 的代码看不懂怎么破

  •  
  •   jacob · Dec 16, 2014 · 5058 views
    This topic created in 4150 days ago, the information mentioned may be changed or developed.

    静态方法,引用传递,正则替换,还有用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 replies    2014-12-18 11:49:25 +08:00
    em70
        1
    em70  
       Dec 16, 2014 via Android
    自己一行一行读,加上注释
    mahone3297
        2
    mahone3297  
       Dec 16, 2014
    一共也没几行,慢慢啃吧。。。
    yangxiongwei
        3
    yangxiongwei  
       Dec 16, 2014
    共也没几行,仔细读吧。
    例外PHP是最好的语言。
    kevinroot
        4
    kevinroot  
       Dec 16, 2014
    那么问题来了,哪里看不懂
    jacob
        5
    jacob  
    OP
       Dec 16, 2014
    多说要慢慢读,可是真的有点读不来了,虽说没多少,可是包含的知识真不少.还得分别从基础搞起.
    zgk
        6
    zgk  
       Dec 16, 2014 via Android
    慢慢加注释
    tini8
        7
    tini8  
       Dec 16, 2014
    看不懂正常,高手看别人的代码也头疼
    Paranoid
        8
    Paranoid  
       Dec 16, 2014
    只能跟你说,只要不是自己敲出来的代码,都是一坨屎!!!!!
    anewg
        9
    anewg  
       Dec 16, 2014
    格式整理下再读吧。。。
    xidianlz
        10
    xidianlz  
       Dec 16, 2014
    小黄鸭调试法
    macdino
        11
    macdino  
       Dec 16, 2014
    @Paranoid 自已敲出的,然后自已再看,也是一坨屎!!!!
    Paranoid
        12
    Paranoid  
       Dec 16, 2014
    @macdino 至少你看懂你自己写的吧。
    jacob
        13
    jacob  
    OP
       Dec 16, 2014
    @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  
    PRO
       Dec 16, 2014   ❤️ 1
    干嘛要看懂?有什么需求慢慢调试啊。
    tini8
        15
    tini8  
       Dec 16, 2014
    @tmkook 对头,顺藤摸瓜是很重要的能力,特别是接受别人烂摊子的时候(话说别人的摊子没有不烂的),这种能力从书本上学不到,就像善用搜索的能力。

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

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

    可读性太差。。。虽然我能看得懂。
    kevinroot
        25
    kevinroot  
       Dec 16, 2014
    @jacob 那个奇葩的写法就是a and b,不是什么位运算
    kevinroot
        26
    kevinroot  
       Dec 16, 2014
    @lygmqkl 确实也不规范 if 大括号也没有
    blakefan
        27
    blakefan  
       Dec 16, 2014 via Android
    @tini8 赞同极了,正在接收烂摊子
    ivanlw
        28
    ivanlw  
       Dec 17, 2014
    这个格式看起来好清爽,请问用什么实现解析的呢?
    jacob
        29
    jacob  
    OP
       Dec 18, 2014
    @ivanlw v2的帖子编辑时可以选择markdown.发帖时没有,很奇怪.
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   969 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 114ms · UTC 19:51 · PVG 03:51 · LAX 12:51 · JFK 15:51
    ♥ Do have faith in what you're doing.