linux上装php

 今天在linux上装apache2和php5
编译都通过
最后启动apache的时候却出了错:
Syntax error on line 232
of /usr/local/apache2/conf/httpd.conf:
Cannot load /usr/local/apache2/modules/libphp5.so into
server: /usr/local/apache2/modules/libphp5.so: undefined
symbol: sapi_module

搞了好半天,google了下,似乎也没其他人碰到这个问题。
突然想到make clean一下,重新编译安装php,然后居然就好了。

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

 
                 本来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(&$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(&$container, $property, $class) {
        $this->container=&$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已经变成了实际的对象了。

             

寒假

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

             

重构

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

程序接口

 在弄一个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。