您的位置:首页 > 编程语言 > PHP开发

php中__call与__callstatic()使用

2013-09-06 10:23 190 查看
php 5.3 后新增了 __call 与__callStatic 魔法方法。

__call 当要调用的方法不存在或权限不足时,会自动调用__call 方法。

__callStatic 当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法。

__call($funcname, $arguments)

__callStatic($funcname, $arguments)



参数说明:


$funcname String 调用的方法名称。

$arguments Array 调用方法时所带的参数。

__call:

1 <?php
class Pc {
function __call($name,$arguments) {
print("调用的未定义的函数名: $name,");
if(is_int($arguments[0])){
echo '传入的第一个参数为整形数:'.$arguments[0].'<br />';
}else if(is_string($arguments[0])){
echo '传入的第一个参数为字符串:'.$arguments[0].'<br />';
}
}
}
$pc = new Pc();
$pc->fun_pc1(2);
$pc->fun_pc2('字符abc');
?>
/*
调用的未定义的函数名: fun_pc1,传入的第一个参数为整形数:2
调用的未定义的函数名: fun_pc2,传入的第一个参数为字符串:字符abc
*/


<?php
class Pc{
function __call($name,$arguments) {
echo '你调用的函数'.$name.'(参数:';
print_r($arguments);
echo '不存在<br />';
}
}
$pc = new Pc();
$pc->fun_pc1(1,2,3);
$pc->fun_pc2('a1','a2');
?>
/*
你调用的函数fun_pc1(参数:Array ( [0] => 1 [1] => 2 [2] => 3 ) 不存在
你调用的函数fun_pc2(参数:Array
(
[0] => a1
[1] => a2
)
不存在
*/


__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();

?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: