• php的动态代理的又一种实现

    神仙 2006-01-28 15:23
     
                     本来php4里,在对象内部是可以对$this赋值的(或许是bug)。但php5不让这样了,如果对$this赋值会引发一个fatel error:can not re-asign to $this。今天突然想到了一个办法。既然不让对$this赋值,那能不能绕个圈实现呢?
    运行一下下面的代码
    <?php
    class Container {
        public $foo;
        function __construct() {
            $this->foo=new Proxy($this);
        }
    }
    class Proxy {
        private $container;
        function __construct(&amp;$container) {
            $this->container=$container;
        }
        function go() {
            $this->container->foo=10;
        }
    }
    $c=new Container;
    echo "开始\n";
    echo 'gettype($c->foo) = \''.gettype($c->foo)."'\n";
    echo 'get_class($c->foo) = \''.get_class($c->foo)."'\n";
    echo "然后\n";
    $c->foo->go();
    echo 'gettype($c->foo) = \''.gettype($c->foo)."'\n";
    echo '$c->foo = '.$c->foo."\n";
    ?>
    结果是:

    开始
    gettype($c->foo) = 'object'
    get_class($c->foo) = 'Proxy'
    然后
    gettype($c->foo) = 'integer'
    $c->foo = 10

    可以看到,$c->foo已经从一个Proxy对象变成了一个整数,而这一切是在对象内部完成的。这样,我们就可以做一个清爽的动态代理了。

    class Container {
        var $p;
        function __construct() {
            $this->p=new Proxy($this,'p','Target');
        }
    }

    class Target {
        var $v=777;
    }

    class Proxy {
        private $container;
        private $property;
        private $className;
        function __construct(&amp;$container, $property, $class) {
            $this->container=&amp;$container;
            $this->property=$property;
            $this->className=$class;
        }

        function __get($key) {
            $class=$this->className;
            $obj=new $class;
            $property=$this->property;
            $this->container->$property=$obj;
            return $obj->$key;
        }

        function __call($func, $arg) {
            $class=$this->className;
            $obj=new $class;
            $property=$this->property;
            $this->container->$property=$obj;
            return call_user_func_array(array($obj,$func), $arg);
        }
    }

    $c=new Container;
    echo get_class($c->p)."\n";
    echo $c->p->v."\n";
    echo get_class($c->p)."\n";
    echo $c->p->v."\n";
    可以看到,使用代理和使用实际对象没有区别,而且当第二次访问的时候,$c->p已经变成了实际的对象了。


                 
  • 寒假

    神仙 2006-01-28 12:53
      要过年了,寒假也过了一半了。似乎从高中的时候,就开始觉得放假无聊,于是每次放假都要想点事做。这次还没放假的时候,就想着寒假里要写一个PHP的ORM,把几本以前没看完的书看了。现在程序是写得差不多了,不过书却没看几页。每天坐在电脑前面,在QQ群里和别人侃侃,在几个blog里转一圈,晃晃论坛,再写会程序,大半天就没了。晚上关机的时候,总有一点失落——又一天就这么过去了。有时候也想出去走走,但出了门就不知道该去哪里,最后不是到书店去就是漫无目的在小区周围里转一圈。
      嗯——突然有了个主意,过几天到复兴路去拍老房子去。这也是一件想了很久的事情了。上海那么多好看的老房子,哪天没了就可惜了。接下来就春节了,顺便也去拍点应景的照片。

                 
  • 关于我的一个测试

    神仙 2006-01-27 18:39
     
    http://syre.testren.com
    看到好些人在玩这个,也凑个热闹
    看看你能得几分
     
  • 重构

    神仙 2006-01-26 15:32
      Martin说,如果你添加新功能的时候遇到了困难,就重构它。今天算是认识了。做获取数据集的时候,很多东西和获取单个数据的是一样的,想重复利用,但感觉很困难。就把代码重构了一下,把得到sql的部分抽出来,单独弄了个类,然后把两个函数搬到数据库抽象层去,现在就好办了。

  • 程序接口

    神仙 2006-01-25 14:03
     在弄一个ORM。
    取一个数据集的时候大致是这样。
    $dataSet=$manager->getList($filter);
    需要一个过滤条件,相当于select语句的where子句
    考虑了很多形式
    一开始想
    $filter->addFilter('Author::name=="XiaoWang"');
    似乎很直观。但后来写测试的时候发现一个问题。如果用户用字符串值,还要自己去处理转义。
    看了下hibernate的方法,是类似于
    $filter->add(Condition::eq('Author::name',"XiaoWang"));
    感觉很怪。我想没必要去追求完美的面向对象结构,好用就行,就先弄成这样:
    $filter->add('Author::name','==',"XiaoWang");
    反正以后修改涉及的地方也就这一个类和TestCase。

  • sf.net

    神仙 2006-01-22 17:08
    最近sf.net上不去,不知道什么原因。
    不过可以通过代理网站,有些原来上不了的网站都可以上了。
    http://hidemyass.com
    http://anonymouse.org
    速度还可以。


                 
  • 欢欢好人啊

    神仙 2006-01-21 13:24
     成绩出来了
    组成居然有81……
    欢欢好人啊。


  • 软件界面

    神仙 2006-01-20 23:04
    今天一天没写程序。晚上看到一个UI的收藏贴。头几个是ms的office,不过没见过这样的,或许是未来版本?也可能是某个设计师的YY版本。不过,office要是真那样就是兼顾了美观和实用了。现在的office工具栏上找个按钮不容易啊。
    http://www.fs.org.cn/article.asp?id=130
  • 关于firefox

    神仙 2006-01-19 23:59
         http://blog.donews.com/tinyfool/archive/2005/12/05/647499.aspx
    无意中发现一篇顶firefox的文章。
    顺便想说一些关于浏览器兼容性的问题。
      我看到的firefox不能兼容的网站都是国内的网站。为什么呢?因为咱们国家电脑普及的晚,在ie还没垄断的年代,netscape的用户是很多的。至今国外还有很多人还在用netscape。洋人写的js的书都对浏览器兼容性十分关注,甚至考虑到了ns3,ie3的地步。另一方面,多数洋人的网站都很简单,考虑了机器配置低的和用旧浏览器的用户,不想放弃任何一个用户。不要以为人人的电脑都很好。我有个同学在用赛扬433的,有个亲戚的还是老奔的。当然,D版windows也起了不少作用。至少升级系统都不用花钱了。

                 
  • 单元测试

    神仙 2006-01-19 14:14
      最近在改自己的php的ORM。尝试用phpunit2自动测试。有了这个确实很舒服。看一个'ok'比人工比较结果方便多了,而且Test Case还可以重复利用。改了一点就运行一下测试,如果ok了就继续。不过phpunit2有时候会莫名其妙什么都不出来,过一会又会好了,不知道室那里的问题。

                 

日历

关于神仙

神仙

世人都晓神仙好~~~~