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. 微信小程序之自定义组件

    在微信小程序项目中 肯定会存在很多功能和样式上相似的部分 面对这种情况 只是单单的ctrl+c ctrl+v 就显得很low了,而且也不便于后期维护那么这时候 使用微信小程序中的自定义组件功能就很合适 ...

  2. Spring中使用到的设计模式

    1.工厂模式:Beanfactory和ApplicationContext 2.单例模式:bean的构建 3.代理模式:AOP 4.模板模式:jdbcTemplate,hibernateTemplat ...

  3. Spring Boot学习笔记一

    Spring Boot简介 前言:本章简单介绍Spring boot的使用. (第二天springboot的学习之路:https://www.cnblogs.com/LBJLAKERS/p/12003 ...

  4. JavaScript中深拷贝实现

    JavaScript 中深拷贝实现   拷贝时候涉及到: 1.循环结构 2.判断数组 Array 还是对象 Object   函数实现 /** * 获取满足条件的数组中的第一个元素 * @param ...

  5. bzoj1010题解

    [解题思路] 设s[i]=i+∑c[j](j∈[1,n]∩N) 易得转移方程f[i]=min{f[j]+(s[i]-s[j]-L-1)2},朴素算法复杂度O(n2). 考虑斜率优化:记T[i]=s[i ...

  6. delphi里为程序任务栏右键菜单添加自定义菜单

    本文讲解的是为自身程序的任务栏右键菜单里添加自己定义的菜单的方法: delphi添加任务栏右键菜单 procedure TForm1.FormCreate(Sender: TObject); var ...

  7. 关于resin的一个错误,Resin 启动报错,访问页面500

    背景 客户集成javaagent报错,客户用的是resin,在本地复现问题,修改了bug,其中在resin中发布war包遇到的错误. 完整错误 500 [show] WEB-INF/web.xml:5 ...

  8. CodeForces-1234C-Pipes-dfs

    You are given a system of pipes. It consists of two rows, each row consists of nn pipes. The top lef ...

  9. jvm监控命令-jstat

    jstat 用于查看服务器上某个服务的GC情况. 一般使用方式jstat –gcpid或jstat –utilpid 时间间隔-每个一定时间(指定的时间间隔)输出一次进程pid的内存情况及gc情况. ...

  10. uoj192 【UR #14】最强跳蚤

    题目 和成爷达成一致,被卡随机的话就是过了 考虑一个完全平方数的所有质因子次幂一定是偶数,于是对于每一条边我们都只保留其出现次数为奇数的质因子 注意到有一个点的\(w\leq 80\),于是考虑状压质 ...