本帖最后由 小鲁哥哥 于 2017-12-16 13:31 编辑
PHP类的重载技术(overloading) (下)
今天为大家带来的是类的重载技术(overloading)之方法重载,大家要好好关注啊,这个可是在框架当中应用非常广泛的哟~
方法重载
__call( ) 魔术方法 当对一个对象调用一个不存在(未定义)的实例方法的时候,就会自动调用该魔术方法; 形式: function __call ($name, $args ){ //这里,$name就表示正在调用的那个不存在的方法名; //$args表示正在调用的那个不存在的方法时使用的实参数据(可能有多个),它是一个数组! ........ } [PHP] 纯文本查看 复制代码 <?php
/*黑马程序员济南中心出品*/
class Person{
function __cal($name,$args){
if($name == "eat"){
$v1 = $args[0]; //获得第一个实参数据
echo "<br />正在优雅的吃".$v1;
}else if($name == "drink"){
$v1 = $args[0];//获得第一个实参数据
echo "<br />正在悠闲的喝".$v1;
}else if($name == "big_eat"){
$v1 = $args[0];//获得第一个实参数据
$v2 = $args[1];
$v3 = $args[2];
echo "<br />正在使用{$v2}和{$v3}豪放的大吃".$v1;
}
}
}
$p1 = new Person();
$p1->eat("饭");
$p1->drink("饮料");
$p1->big_eat("牛排","刀","叉");
得到结果:
正在优雅的吃饭 正在悠闲的喝饮料 正在使用刀和叉豪放的大吃 牛排
一个应用:
使用php中的重载技术,实现常规面向对象语言中的方法的重载效果: [PHP] 纯文本查看 复制代码 <?php[/align]/*黑马程序员济南中心出品*/
class Jisuanqi{
function __call($name,$args){
if($name == "jisuan"){
$len = count($args);//实参的个数
if($len == 1){
$v1 = $args[0];//取得一个
return -$v1;//取相反值后返回
}else if($len == 2){
$v1 = $args[0];
$v2 = $args[1];
$re = $v1*$v1 + $v2 * $v2;
return $re;
}else if($len == 3){
$v1 = $args[0];
$v2 = $args[1];
$v3 = $args[2];
//pow()函数返回 x 的 y 次方。
$re = pow($v1,3) + pow($v2,3) + pow($v3,3);
return $re;
}else{
//创建用户级别的错误消息,并提示错误信息
trigger_error("参数无效",E_USER_ERROR);
}
}else{
//创建用户级别的错误消息,并提示错误信息
trigger_error("该方法未定义,不允许使用!",E_USER_ERROR);
}
}
}
$obj1 = new Jisuanqi();
$v1 = $obj1->jisuan(1);
$v2 = $obj1->jisuan(2,3);
$v3 = $obj1->jisuan(2,3,4);
var_dump($v1,$v2,$v3);
$v4 = $obj1->jisuan();
$v5 = $obj1->f1();
结果为:
int(-1) int(13) int(99) Fatal error : 参数无效!
__callstatic ( ) 魔术方法
当对一个类使用其不存在(未定义)的静态方法的时候,就会自动调用该静态方法; 其基本原理跟__call()是一样的,只是这是一个静态方法,适用于类调用未定义的静态方法的情形; 形式: static function __callstatic ($name, $args ){ //这里,$name就表示正在调用的那个不存在的方法名; //$args表示正在调用的那个不存在的方法时使用的实参数据(可能有多个),它是一个数组! ........ } [PHP] 纯文本查看 复制代码 <?php
/*黑马程序员济南中心出品*/
class A{
static function __callstatic($name,$args){
echo "正在调用一个不存在的静态方法:$name";
echo "其实参数据为:";
print_r($args);
}
}
A::f1(1);
[align=left]A::f2(1,2); 结果为: 正在调用一个不存在的静态方法:f1 其实参数据为:array([0]=>1)
正在调用一个不存在的静态方法:f2 其实参数据为:array([0]=>1 [1]=>2)
不知道大家对今天讲的类的重载技术之方法重载学习的怎么样啊?有什么疑问欢迎来黑马程序员济南中心来咨询哟~
点进这个帖子的同学肯定是要奋发图强,学技术拿高薪的有志青年,这里我看你骨骼惊奇,是个绝世的练武奇才,你我有缘,今天我就把这个武林秘籍如来神掌传授于你! 什么?不想学如来神掌?不要紧!这里有各个门派的武林绝学,链接拿好!!哈哈哈哈
|