Kenny 2007-8-1 22:21
PHP5.0对象模型探索之重载
<p><p>PHP4中已经有了重载的语法来建立对于外部<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, '%B6%D4%CF%F3');" target="_self"><u><strong>对象</strong></u></a>模型的映射,就像<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, 'Java');" target="_self"><u><strong>Java</strong></u></a>和COM那样. PHP5带来了强大的<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, '%C3%E6%CF%F2%B6%D4%CF%F3');" target="_self"><u><strong>面向对象</strong></u></a>重载,允许程序员建立自定义的行为来访问属性和调用<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, '%B7%BD%B7%A8');" target="_self"><u><strong>方法</strong></u></a>。</p><p>重载可以通过__get, __set, and __call几个特殊方法来进行. 当<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, 'Zend');" target="_self"><u><strong>Zend</strong></u></a>引擎试图访问一个成员并没有找到时,PHP将会调用这些方法.</p><p>在下面的例子中,__get和__set代替所有对属性变量数组的访问. 如果必要,你可以实现任何类型你想要的过滤. 例如,脚本可以禁止设置属性值, 在开始时用一定的前缀或包含一定类型的值.</p><p>__call方法说明了你如何调用未经定义的方法. 你调用未定义方法时,方法名和方法接收的参数将会传给__call方法, <a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, 'PHP');" target="_self"><u><strong>PHP</strong></u></a>传递__call的值返回给未定义的方法.</p>Listing1 User-level overloading<br><br><table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>class Overloader <br>{ <br> private $properties = array(); <br><br> function __get($property_name) <br> { <br> if(isset($this->properties[$property_name])) <br> { <br> return($this->properties[$property_name]); <br> } <br> else <br> { <br> return(NULL); <br> } <br> } <br><br> function __set($property_name, $value) <br> { <br> $this->properties[$property_name] = $value; <br> } <br><br> function __call($function_name, $args) <br> { <br> <a class="bluekey" href="http://www.yesky.com/key/3451/13451.html" target="_blank"><u><font color="#ffffff">print</font></u></a>("Invoking $function_name() n"); <br> print("Arguments: "); <br> print_r($args); <br><br> return(TRUE); <br> } <br>} <br>$o = new Overloader(); <br><br>//invoke __set() 给一个不存在的属性变量赋值,激活__set() <br>$o->dynaProp = "Dynamic Content"; <br><br>//invoke __get() 激活__get() <br>print($o->dynaProp . "n"); <br><br>//invoke __call() 激活__call() <br>$o->dynaMethod("Leon", "Zeev"); <br>?> </td></tr></tbody></table></p> <center><input type="image" onclick=copyToClipBoard() src="http://www.phpchina.com/images/phpcn_book_bu_tj.gif" border="0"></center>