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. 一句话下载总结(用于后渗透上传payload)

    利用ftp来下载payload文件 echo open 192.168.1.1 21> ftp.txt echo ftp>> ftp.txt echo bin >> ft ...

  2. NX二次开发-NXOPEN设置工程图表格注释字体workPart->Fonts()->AddFont("chinesef_fs", NXOpen::FontCollection::TypeNx);

    NX9+VS2012 #include <uf.h> #include <uf_tabnot.h> #include <NXOpen/Part.hxx> #incl ...

  3. JS对象的可枚举属性和不可枚举属性

    昨天在写文章(转载)的时候发现了有些对象的方法是分可枚举性和不可枚举性的.简单的查了一下资料,今天来捋一捋啥是对象的可枚举啥是不可枚举. 可枚举性: 对象的每一个属性都有一个描述对象,用来描述和控制该 ...

  4. Python中将dict转换为kwargs

    Python中将dict转换为kwargs 我们都知道kwargs是变长kv参数,能否将dict转换成kwargs. 在python调用函数的时候func(**{'type'='event'}),可以 ...

  5. Java-Idea-笔记:lombok、微信支付依赖

    ylbtech-Java-Idea-笔记:lombok.微信支付依赖 1. idea-install-lombok返回顶部 1.0. P:问题描述Idea每打开一个类文件,类名就标红,不影响运行,但g ...

  6. hive简述

    显示表头,当前终端有效 set hive.cli.print.header=true; 查看表结构 desc table; 详细的表结构 desc formatted table; 删除表 drop ...

  7. jQuery 引入多个库文件冲突

    index.html <head><meta http-equiv="Content-Type" content="text/html; charset ...

  8. A1075 PAT Judge (25 分)

    The ranklist of PAT is generated from the status list, which shows the scores of the submissions. Th ...

  9. 8分钟带你深入浅出搞懂Nginx

    Nginx是一款轻量级的Web服务器.反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用. 图基本上说明了当下流行的技术架构,其中Nginx有点入口网关的味道. 反向代 ...

  10. 【Wikioi】P1401 逆序统计 代码

    题目链接:http://wikioi.com/solution/list/1401/ 题解链接:http://user.qzone.qq.com/619943612/blog/1377265690 代 ...