jacob
V2EX  ›  问与答

php 的代码看不懂怎么破

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

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

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

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