日期:2014-05-17  浏览次数:20567 次

php5 学习记录(2)

一、重载性能

1、属性和方法的重载

php 允许通过实现特殊的代理方法对属性的访问和方法的调用进行重载,这些代理方法将在相关的属性或者方法不存在时调用。这种特性让你在中端这些动作并定义你自己的功能时获得巨大的灵活性。

你可以实现下面的方法原型:

function __get($property) // 传递属性的名字,并且返回属性值

function __set($property, $value) // 传递属性的名字和新的值

function __call($method, $args) // 传递方法的名字和一个数字索引的数组,数字包含传递的参数,第一个参数的索引是0。

?

?

class Users {
    
    private $arr = array();

    function __get($name) {
        return $this->arr[$name] === NULL ? 'null' : $this->arr[$name];
    }

    function __set($name, $value) {
        $this->arr[$name] = $value;
    }

}

$user = new Users();
$user->a = 'xiezheng';
print $user->a;

__call()具有很多用途,它主要用来监控一个对象中的其他方法。如果你试着调用一个对象中不存在的方法,__call方法将会被自动调用。

?

class HelloWorld {
    function display($count) {
        for($i=0; $i<$count; $i++)
            print __CLASS__.'<br />';
        return $count;
    }
}

class HelloWorldCall {
    private $obj;
    function __construct() {
        $this->obj = new HelloWorld();
    }

    function __call($method, $args) {
        return call_user_func_array(array($this->obj, $method), $args);
    }
}

$hwc = new HelloWorldCall();
print $hwc->display(3);
?

?

2、使用数组语句访问的重载。

为了让你的类能够重载数组语句的访问,你的类需要实现ArrayAccess接口。

bool offsetExists($index)

mined offsetGet($index)

void offsetSet($index, $new_value)

void offsetUnset($index)

以上是ArrayAccess需要实现的方法。

?

?

class Users implements ArrayAccess {
    
    private $uname;

    function offsetExists($name) {
        return $this->uname === NULL;
    }

    function offsetGet($name) {
        return $this->offsetExists($this->uname) ? 'NULL' : $this->uname;
    }

    function offsetSet($name, $value) {
        $this->uname = $value;
    }

    function offsetUnset($name) {
        $this->uname = null;
    }

}

$user = new Users();
$user['name'] = 'xiezheng';
// unset($user['name']);
print $user['name'];
?

?

?