l 基本介绍:

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

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

l 需求

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

l 案例说明

<?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, '-');

PHP面向对象魔术方法之__call函数的更多相关文章

  1. PHP面向对象魔术方法之__toString函数

    l 基本介绍: 当我们希望将一个对象当做字符串来输出时,就会触发__toString魔术方法. <?php header('content-type:text/html;charset=utf- ...

  2. PHP面向对象魔术方法之__clone函数

    l 基本介绍 : 当我们需要将一个对象完全的赋值一份, 保证两个对象的属性和属性值一样,但是他们的数据库空间独立,则可以使用对象克隆. <?php header('content-type:te ...

  3. PHP面向对象-----魔术方法

    PHP面向对象-----魔术方法 __get($name)--触发时机:当调用一个不访问的成员属性的时候,会自动触发,可以利用这个方法来完成对不可调用的属性进行调用,但是不能设置值 ___set($n ...

  4. PHP面向对象魔术方法之__get 和 __set函数

    l 基本的介绍 (1) 当我们去使用不可以访问的属性时,系统就会调用__get方法. (2) 不可以访问的属性指的是(1 . 该属性不存在 2. 直接访问了protected或者private属性) ...

  5. 魔术方法以及__call的调用

    一.什么是魔术方法? 魔术方法是php中对一类方法的统称,这些方法可以在任何类中被实现.他们通常可以完成一些特殊的无法纯粹依靠自己编程实现的功能.他们通常以双下划线"__"作为名称 ...

  6. php里面用魔术方法和匿名函数闭包函数动态的给类里面添加方法

    1.认识  __set  (在给不可访问属性赋值时,__set() 会被调用) 也就是说你再访问一个类里面没有的属性,会出发这个方法 class A{ private $aa = '11'; publ ...

  7. 魔术方法之__call、__callStatic

    1.__call() 作用,当调用不存在的方法时,会调用该方法.实际应用,当程序调用不存在的方法时,意外导致程序终止. .或者当你调用了受保护的或者是私人的方法时,也会自动调用__call方法 结果: ...

  8. PHP常用魔术方法(__call魔术方法:)

    魔术方法  __call <?php //文件名:index.php define('a',__DIR__); include '/IMooc/Loader.php'; spl_autoload ...

  9. 魔术方法之__call与__callStatic方法

    <?php class human{ private function t(){ } /** * 魔术方法__call * * @param string $method 获得方法名 * @pa ...

随机推荐

  1. 酷狗mac版如何新建歌单?酷狗mac版收藏歌单方法

    很多朋友们都喜欢使用酷狗音乐听音乐,不过最近有使用酷狗mac音乐播放器的Mac新用户,想要新建歌单收藏歌单,但有不知道如何操作,那么苹果电脑酷狗mac版如何新建歌单收藏歌单呢?针对此问题,本文给大家介 ...

  2. 使用Git 上传文件到云端(版本库)

    第一步:本地初始化Git版本库 git init 第二步:链接码云(云端) git remote add orgin "你的远程仓库地址"(复制链接后结尾是.git,如果没有记得加 ...

  3. Nginx被动健康检查和主动健康检查

    1.被动健康检查 Nginx自带有健康检查模块:ngx_http_upstream_module,可以做到基本的健康检查,配置如下: upstream cluster{ server max_fail ...

  4. IDEA maven package失败

    选中要打包的模块,选择工具栏中的Build,选择Rebuild Module xxx,重新打包

  5. iOS 获取音频或是视频的时间

    AVURLAsset* audioAsset =[AVURLAssetURLAssetWithURL:audioFileURL options:nil]; CMTime audioDuration = ...

  6. RCC, Reset and Clock Control

  7. A1095 Cars on Campus (30 分)

    Zhejiang University has 8 campuses and a lot of gates. From each gate we can collect the in/out time ...

  8. !!!myeclipse 上加载本地图片问题,无法加载问题

    出现无法加载本地图片的问题, 原因就是把图片放到了本地项目中的image了,但是myeclipse上没有刷新 这样以后 本地的图片比在线的要快 低级错误,诶!

  9. Java父类强制转换子类原则

    最近,微信群友在讨论子类父类的转换问题,其实不难,给大家用实例来说明一下就很明了了. 我们知道Java中子类转换成父类是没有任何问题的,那父类可以转换成子类吗? 来看下面这段程序: public cl ...

  10. IntelliJ IDEA无法创建springboot项目解决办法

    最佳解决办法:IntelliJ IDEA---右键---以管理员身份运行. 方法二: 1.打开控制面板--系统和安全--windows防火墙 2.找到自己的默认浏览器,打勾,这里是谷歌浏览器 3.打开 ...