关于PHP的拦截器运用

WBOY
풀어 주다: 2016-06-13 10:56:04
원래의
1157명이 탐색했습니다.

关于PHP的拦截器使用
成考终于结束了,又可以安心下来看看代码的书

好吧,继续学习PHP

php提供了内置的拦截器,可以拦截发送到一些未定义的方法和属性消息

先看下__get($property),它主要访问未定义的属性时被调用

看下示例:
class Coder{
  function __get($property){
    $method = "get{$property}";
    if(method_exists($this,$method)){
      return $this->$method();
    }
  }

  function getName(){
    return "SUN";
  }
}

$coder = new Coder();
print $coder->name;

程序执行后会输出SUN,如果程序里没有这个方法,就会什么也不做,会被解析成NULL

类似的方法还有__set(),__isset,__unset

下面主要来看下__call()这个方法,它是调用未定义的方法时被调用,有两个参数
1.$method, 这个是方法的名称;
2.$arg_array,是传递给要调用方法的所有参数(数组)

__call()方法对于实现委托的示例

class CoderWrite{
  function printName(Coder $c){
    print $c->getName();
  }
}

class Coder{
  private $write;
  function __construct(CoderWrite $cw){
    $this->write=$cw;
  }

  function __call($methodname,$args){
   if(method_exists($this->write,$methodname)){
     return $this->write->$methodname($this);
   }
  }

  function getName(){
    return "SUN";
  }
}

调用:$coder = new Coder(new CoderWrite());
$coder->printName();
_call()方法会被调用,然后查找CoderWrite对象中有没有printName()方法,有的话就会调用。呵呵,是不是变相的给Coder对象增加了一个方法?

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿