PHP知识、源码、教程、框架、程序分享! -- PHP社区 关于我们 联系我们 联系电话 联系QQ

PHP编程语言中属性和方法的重载

发表时间:2013-09-24 点击:

[本文摘要]:PHP编程 语言中属性和方法的重载 重载性能 在 PHP 5 中,用C编写的扩展几乎可以重载对象语法的每一个部分。它还允许 PHP代码 重载一些经常需要的有限子集的内容。这个章节将为你讲述...

PHP编程语言中属性和方法的重载

重载性能

PHP 5中,用C编写的扩展几乎可以重载对象语法的每一个部分。它还允许PHP代码重载一些经常需要的有限子集的内容。这个章节将为你讲述如何在PHP代码中控制重载功能。

属性和方法的重载

PHP允许通过实现特殊的代理方法对属性的访问和方法的调用进行重载,这些代理方法将在相关的属性或者方法不存在时调用。这种特性让你在中断这些动作并定义你自己的功能时获得巨大的灵活性。

你可以实现下面的方法原型:

function _get ($property)

function  __set( $property, $value)

function __call($method, $args)

__get传递属性的名字,并且返回属性的值

__set传递属性的名字和新的值

__call传递方法的名字和一个数字索引的数组,数组包含传递的参数,第一个参数的索引是0。

下面的例子展示了如何使用__set和__get函数(array_kay_exists()在本站的后续文章中将讲述,它检查一个关键字在指定的数组中是否存在):

class StrictCoordinat_eClass {
	private  $arr =  array ('x'  => NULL,  'y'  => NULL);
	function __get ($property){
	  if (array_key_exists($property,$this->arr)){
	    return  $this->arr[$property];
	  } else {
	    print "Error: Can't read a property other than x & y\n";
	  }
	}
	function __set ($property,  $value){
	  if (array_key_exists($property, $this->arr)){
	    $this->arr[$property] = $value;
	  } else {
	    print "Error: Can't write a property other than x & y\n";
	  }
	}
}
	$obj = new StrictCoordinateClass;
	$obj ->x  =  1;
	print $obj->x;
	$obj->n = 2;
	print  $obj ->n;

输出是:

1

Error:Can't write a property other than x & y

Error:Can't read a property other than x & y

因为x存在于对象的数组中,设置和取值方法处理器同意读取,写入值。但是,当访问n属性时,两个读取和写入方法中array_key_exists()函

数都返回false,因此打印出报错信息。

__call()具有很多用途。下面的例子显示如何创建一个授权模型,通过该模型一个HelloWorldDelegator类的实例可以授权所有的方法去调用一个HelloWorld类的实例:

class HelloWorld {
	function  display ($count)
	{
	  print "Hello, World\n";
	  return $count;
	}
	class HelloWorldDelegaLor{
	  function _construct ()
	  {
	    $this->obj = new HelloWorld();
	  }
	  function __call ($method, $args)
	  {
	    return call_user_func_array(array($this->obj , $method),$args);
	  }
	}
	private $obj;
}
$obj  = new HelloWorldDelegator() ;
print $obj->display(3) ;

这个脚本的输出是

Hello,World

Hello,World

Hello,World

3

call_user_func_array()函数允许__call()把它的参数通过call_user_func_array()调用传递给World::display(),后者打印3 "Hello,World\n"。然后_call()返回$count的值(在这个例子中是3)并在屏幕中打印出来。你不但可以通过__call()方法调用到一个不同的对象(或者用你想要的方法处理它),而且你还可以从__call()函数返回值,就像正常的方法一样。

版权声明:本文系技术人员研究整理的智慧结晶,转载勿用于商业用途,并保留本文链接,侵权必究!

本文链接:http://php.aixc.cn/phpzs/phphanshu/320.html

声明:本站技术及源码均为原创,转载请勿用于商业用途,并注明出处及原文链接,侵权必究。