编写动态类不仅限于数据库访问。请看清单 8 中的 Customer 对象这个例子。
清单 8. 简单的 Customer 对象- <?php
- class Customer
- {
- private $name;
- function set_name( $value )
- {
- $this->name = $value;
- }
- function get_name()
- {
- return $this->name;
- }
- }
- $c1 = new Customer();
- $c1->set_name( "Jack" );
- $name = $c1->get_name();
- echo( "name = $name\n" );
- ?>
-
复制代码 这个对象足够简单。但是如果我想在每次检索或设置客户名称时都记录日志,会发生什么呢?我可以把这个对象包装在一个动态日志对象内,这个对象看起来像 Customer 对象,但是会把 get 或 set 操作的通知发送给日志。清单 9 显示了这类包装器对象。
清单 9. 动态包装器对象- <?php
- class Customer
- {
- private $name;
- function set_name( $value )
- {
- $this->name = $value;
- }
- function get_name()
- {
- return $this->name;
- }
- }
- 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 Customer() );
- $c1->set_name( "Jack" );
- $name = $c1->get_name();
- echo( "name = $name\n" );
- ?>
复制代码 调用日志版本的 Customer 的代码看起来与前面相同,但是这时,对 Customer 对象的任何访问都被记入日志。清单 10 显示了运行这个日志版代码时输出的日志。
清单 10. 运行日志版对象- % php log2.php
- set_name( Jack )
- get_name( )
- name = Jack
- %
-
复制代码 在这里,日志输出表明用参数 Jack 调用了set_name 方法。然后,调用 get_name 方法。最后,测试代码输出 get_name 调用的结果。 |