php 5.3 后新增了 call 与callstatic 魔法方法。
call 当要调用的方法不存在或权限不足时,会自动调用call 方法。
callstatic 当调用的静态方法不存在或权限不足时,会自动调用callstatic方法。
call($funcname, $arguments)
callstatic($funcname, $arguments)
参数说明:
$funcname string 调用的方法名称。
$arguments array 调用方法时所带的参数。
call 例子
<?php
class member{
protected $memberdata = array();
public function call($func, $arguments){
list($type, $name) = explode('_', $func);
if(!in_array($type, array('set','get')) || $name==''){
return '';
}
switch($type){
case 'set':
$this->memberdata[$name] = $arguments[0];
break;
case 'get':
return isset($this->memberdata[$name])? $this->memberdata[$name] : '';
break;
default:
}
}
}
class user extends member{
public function show(){
if($this->memberdata){
foreach($this->memberdata as $key=>$member){
echo $key.':'.$member.'<br>';
}
}
}
}
class profession extends member{
public function show(){
if($this->memberdata){
foreach($this->memberdata as $key=>$member){
echo $key.':'.$member.'<br>';
}
}
}
}
$userobj = new user();
$userobj->set_name('fdipzone');
$userobj->set_age(29);
$userobj->show();
$probj = new profession();
$probj->set_profession('it service');
$probj->set_price(2500);
$probj->show();
?>
callstatic例子
<?php
class member{
protected static $memberdata = array();
public static function callstatic($func, $arguments){
list($type, $name) = explode('_', $func);
if(!in_array($type, array('set','get')) || $name==''){
return '';
}
$feature = get_called_class();
switch($type){
case 'set':
self::$memberdata[$feature][$name] = $arguments[0];
break;
case 'get':
return isset(self::$memberdata[$feature][$name])? self::$memberdata[$feature][$name] : '';
break;
default:
}
}
}
class user extends member{
public static function show(){
$feature = get_called_class();
if(self::$memberdata[$feature]){
foreach(self::$memberdata[$feature] as $key=>$member){
echo $key.':'.$member.'<br>';
}
}
}
}
class profession extends member{
public static function show(){
$feature = get_called_class();
if(self::$memberdata[$feature]){
foreach(self::$memberdata[$feature] as $key=>$member){
echo $key.':'.$member.'<br>';
}
}
}
}
user::set_name('fdipzone');
user::set_age(29);
user::show();
profession::set_profession('it service');
profession::set_price(2500);
profession::show();
?>
以上就是php中 __call 与 __callstatic用法与区别详解的详细内容。