返回列表 发帖

用 PHP 走向动态7 -- 动态类的更多用途

编写动态类不仅限于数据库访问。请看清单 8 中的 Customer 对象这个例子。


清单 8. 简单的 Customer 对象
  1. <?php
  2. class Customer
  3. {
  4.   private $name;
  5.   function set_name( $value )
  6.   {
  7.     $this->name = $value;
  8.   }
  9.   function get_name()
  10.   {
  11.     return $this->name;
  12.   }
  13. }
  14. $c1 = new Customer();
  15. $c1->set_name( "Jack" );
  16. $name = $c1->get_name();
  17. echo( "name = $name\n" );
  18. ?>
复制代码
这个对象足够简单。但是如果我想在每次检索或设置客户名称时都记录日志,会发生什么呢?我可以把这个对象包装在一个动态日志对象内,这个对象看起来像 Customer 对象,但是会把 get 或 set 操作的通知发送给日志。清单 9 显示了这类包装器对象。


清单 9. 动态包装器对象
  1. <?php
  2. class Customer
  3. {
  4.   private $name;
  5.   function set_name( $value )
  6.   {
  7.     $this->name = $value;
  8.   }
  9.   function get_name()
  10.   {
  11.     return $this->name;
  12.   }
  13. }
  14. class Logged
  15. {
  16.   private $obj;
  17.   function __call( $method, $args )
  18.   {
  19.     echo( "$method( ".join( ",", $args )." )\n" );
  20. return call_user_func_array(array(&$this->obj,
  21.    $method), $args );
  22.   }
  23.   function __construct( $obj )
  24.   {
  25.     $this->obj = $obj;
  26.   }
  27. }
  28. $c1 = new Logged( new Customer() );
  29. $c1->set_name( "Jack" );
  30. $name = $c1->get_name();
  31. echo( "name = $name\n" );
  32. ?>
复制代码
调用日志版本的 Customer 的代码看起来与前面相同,但是这时,对 Customer 对象的任何访问都被记入日志。清单 10 显示了运行这个日志版代码时输出的日志。


清单 10. 运行日志版对象
  1. % php log2.php
  2. set_name( Jack )
  3. get_name(  )
  4. name = Jack
  5. %
复制代码
在这里,日志输出表明用参数 Jack 调用了set_name 方法。然后,调用 get_name 方法。最后,测试代码输出 get_name 调用的结果。

返回列表