Rumah  >  Artikel  >  php教程  >  PHP语言动态特性

PHP语言动态特性

WBOY
WBOYasal
2016-06-06 19:51:001069semak imbas

PHP语言动态特性的更多用例 下面的例子类似面向切面编程,其和面向对象不同的地方在于,面向对象关注于每个对象定义的完整性, 而切面是关注于整个对象系统的某个/某些特定功能面,比如日志、过滤等,把这些特定功能面剥离出来达到共用的目的。 Listing 8.

PHP语言动态特性的更多用例

下面的例子类似面向切面编程,其和面向对象不同的地方在于,面向对象关注于每个对象定义的完整性,

而切面是关注于整个对象系统的某个/某些特定功能面,比如日志、过滤等,把这些特定功能面剥离出来达到共用的目的。


Listing 8. 简单的User类

<?php class User
{
  private $name;

  function set_name( $value )
  {
    $this->name = $value;
  }

  function get_name()
  {
    return $this->name;
  }
}

$c1 = new User();
$c1->set_name( "Jack" );
$name = $c1->get_name();
echo( "name = $name\n" );
?>

这个对象足够简单,现在如果想在用户名字设置或读取的时候记录日志,该怎么做?

你可以创建一个动态的日志处理对象,把这个用户对象包装在其中,这样看起来用户对象的动作都会通知到其包装日志类一样。


Listing 9. 动态包装类
<?php class Logged
{
  private $obj;

  function __call( $method, $args )
  {
    echo( "$method( ".join( ",", $args )." )\n" );
    return call_user_func_array(array(&$this->obj,$method), $args );
  }

  function __construct( $obj )
  {
    $this->obj = $obj;
  }
}

$c1 = new Logged( new User() );
$c1->set_name( "Jack" );
$name = $c1->get_name();
echo( "name = $name\n" );
?>

调用代码还是一样,但这一次,任何对User方法的访问,都会被echo出来。(你可以把echo替换其他的逻辑,如安全控制、日志记录、数据过滤等)

就好比在User对象的方法被调用时被某个钩子函数给挂载了,进行了预处理或后置处理。


by iefreer

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn