• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > PHP如何使用面向对象魔术方法之__call函数

PHP如何使用面向对象魔术方法之__call函数

作者:站长图库 字体:[增加 减小] 来源:互联网 时间:2022-04-29

站长图库向大家介绍了PHP,面向对象,魔术方法,__call函数等相关知识,希望对您有所帮助

PHP使用面向对象魔术方法之__call函数:1、当调用一个不可以访问的成员方法时,【__call】魔术方法就会被调用;2、该成员方法不存在以及成员方法是protected或者private时,调用【__call】魔术方法。


PHP如何使用面向对象魔术方法之__call函数


PHP使用面向对象魔术方法之__call函数:

基本介绍:

(1) 当我们调了一个不可以访问的成员方法时,__call魔术方法就会被调用.

(2) 不可以访问的成员方法的是指(1. 该成员方法不存在, 2. 成员方法是protected或者 private)

需求

我们就是希望,在类的外部直接调用不可访问的成员方法(private , protected).

案例说明

<?php    header('content-type:text/html;charset=utf-8');    //__call魔术方法    class Monk{        public $name;        protected $hobby;        public function __construct($name, $hobby){            $this->name = $name;            $this->hobby = $hobby;        }        //输出该对象的信息        public function showInfo(){            echo '<br> 名字是 ' . $this->name;            foreach($this->hobby as $hobby){                echo '<br> 爱好有 ' . $hobby;            }        }        //会做算术题, 保护的        protected function getSum($num1, $num2){            return $num1 + $num2;        }        // 编写这个__call魔术方法, __call 魔术方法会接收到两个参数        /*        * @param $method_name 就是函数名        * @param $parameters 就是参数,类型是array        */        public function __call($method_name, $parameters){            // echo '<br> method_name = ' . $method_name;            // echo '<br> $parameters <br>';            // var_dump($parameters);            //判断 $this 中是否有  $method_name 函数,有就返回true,否则返回false            if(method_exists($this, $method_name)){                return $this->$method_name($parameters[0], $parameters[1]);            }else{                return '没有你要调用的函数';            }        }    }    $monk = new Monk('济公', array('no1'=>'腾云驾雾', 'no2'=>'喝酒'));    $monk->showInfo();    // 当我们直接调用 protected 方法时,就会触发 __call 魔术方法    echo '<br> 结果是' . $monk->getSum(100, 200);

练习题:

<?php    header('content-type:text/html;charset=utf-8');    /*    练习题:     请编写一个Cat类(有 年龄, 名字 二个属性),要求二个属性全部都是public。    Cat类有一个 方法 jiSuan($n1, $n2, $oper) 可以计算+ - * / 是私有的.    在类外部,$对象名->play('jiSuan', $n1, $n2, $oper) 得到结果,注意play这个方法,在类中没有定义.    要求 play 是固定的,如果没有按规则写,则给出相应的错误提示!    */    class Cat{        public $name;        public $age;        public function __construct($name, $age){            $this->name = $name;            $this->age = $age;        }        private function jiSuan($n1, $n2, $oper){            $res = 0;            switch($oper){                case '+':                    $res = $n1 + $n2;                    break;                case '-':                    $res = $n1 - $n2;                    break;                case '*':                    $res = $n1 * $n2;                    break;                case '/':                    $res = $n1 / $n2;                    break;                default :                    echo '你输入的运算符号不对';            }            return $res;        }        //编写一个__call 魔术方法        public function __call($method_name, $parameters){            //先判断是否通过 'play' 调用            if($method_name == 'play'){                //继续                if( method_exists($this, $parameters[0]) ){                    //继续                    return $this->$parameters[0]($parameters[1], $parameters[2], $parameters[3]);                }else{                    return ' 你调用的 ' . $parameters[0] . ' 不存在';                }            }else{                return ' 你调用的方式有问题 ';            }        }    }    $cat = new Cat('小花猫', 3);    echo '<br> 运算的结果是 ' . $cat->play('jiSuan', 10, 20, '-');




分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 如何使用yum安装指定版本的php
  • PHP存入mysql乱码怎么办
  • laravel与thinkphp之间的区别与优缺点
  • ThinkPhp5.1制作微信支付以及支付后的几种状态说明
  • PHP读取文件的两种方式:file_get_contents和fread(附代码实例)
  • 记录某PHP后台系统,图片无法上传处理过程
  • PHP怎么只保留汉字
  • PHP怎么返回四位数不满补零
  • ThinkPHP3.2.3如何从php5升级到php7
  • PHP怎么遍历数组替换数组中的元素的值

相关文章

  • 2022-04-29Ember.js和Vue.js对比,哪个框架更优秀?
  • 2022-04-29Photoshop绘制美国队长盾牌图标教程
  • 2022-04-29怎么为WordPress上下篇文章链接添加缩略图
  • 2022-04-29PHP中preg_match函数使用详解(附代码实例)
  • 2022-04-29Photoshop绘制梦幻炫彩效果的艺术字
  • 2022-04-29Photoshop绘制漂亮的粉色立体心形教程
  • 2022-04-29聊聊node中怎么使用Nest.js 实现简易版请求监控
  • 2022-04-29PHP工厂方法模式的好处是什么
  • 2022-04-29怎么利用Node.js进行html页面跳转
  • 2022-04-29一张图搞定如何在PhpStorm中修改类文件头部作者

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • 分享帝国CMS随机会员头像的方法
    • 一起聊聊PHP中return语句的作用和echo的区别(详解及实例)
    • 如何解决LayUI时间控件闪退问题
    • TP6+vue-element-admin实现后台登录验证码
    • JavaScript 对象可以做到的几件事
    • 广告联盟被屏蔽后显示图片链接广告方法代码
    • N种使用 CSS 实现三角形的技巧
    • 解决Laravel 8 undefined variable错误问题
    • vue3 watch和watchEffect的使用以及有哪些区别
    • JS中循环遍历数组的四种方式总结

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有