__call、__set 和 __get的用法
1. __call的用法
PHP5 的对象新增了一个专用方法 __call(),这个方法用来监视一个对象中的其它方法。如果你试着调用一个对象中不存在的方法,__call 方法将会被自动调用。
例:__call
<?php
class foo {function __call($name,$arguments) {print("Did you call me? I'm $name!<br>");print_r($arguments);print("<br><br>");}function doSecond($arguments){print("Right, $arguments!<br>");}
} $test = new foo();
$test->doFirst('no this function');
$test->doSecond('this function exist');
?>
2. __call 实现“过载”动作
这个特殊的方法可以被用来实现“过载(overloading)”的动作,这样你就可以检查你的参数并且通过调用一个私有的方法来传递参数。
例:使用 __call 实现“过载”动作
<?php
class Magic {function __call($name,$arguments) {if($name=='foo') {if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);}} private function foo_for_int($x) {print("oh an int!");} private function foo_for_string($x) {print("oh a string!");}
} $test = new Magic();
$test->foo(3);
$test->foo("3");
?>
3. 面向对象重载
<?php
/*__call(string $name,array $arg)的用法
*当调用一个不可访问的方法的时候调用$name是方法名称 $arg是个数组包含要传递给方法的参数
*/
class Account{private $user=1;private $pwd=2;public function __call($name,$arg){switch(count($arg)){case 2:echo $arg[0]*$arg[1],PHP_EOL;break;case 3:echo array_sum($arg),PHP_EOL;break;default:echo "参数不对",PHP_EOL;break;}}}$a= new Account();//这里模拟了重载//重载:一个类中可以定义参数列表不同但名字相同的多个方法$a->make(5);$a->make(5,6);
4. 使用__call()方法来实现数据库连贯操作
<?php// 使用__call()方法来实现数据库连贯操作// 申明一个Db类(数据库操作类)的简单操作模型class Db{private $sql = array("field" => "","where" => "","order" => "","limit" => "","group" => "","having" => "",);// 连贯操作调用field() where() order() limit() group() having()方法,组合sql语句function __call($methodName,$args){// 将第一个参数(代表不存在方法的方法名称),全部转成小写方式,获取方法名称$methodName = strtolower($methodName);// 如果调用的方法名和成员属性数组$sql下标对应上,则将第二个参数给数组中下标对应的元素if(array_key_exists($methodName,$this->sql)){$this->sql[$methodName] = $args[0];}else{echo '调用类'.get_class($this).'中的方法'.$methodName.'()不存在';}// 返回自己对象,则可以继续调用本对象中的方法,形成连贯操作return $this;}// 输出连贯操作后组合的一个sql语句,是连贯操作最后的一个方法function select(){echo "SELECT {$this->sql['field']} FROM user {$this->sql['where']} {$this->sql['order']} {$this->sql['limit']} {$this->sql['group']}{$this->sql['having']}";}
}$db = new Db();// 连贯操作
$db->field('sex, count(sex)')->where('where sex in ("男","女")')->group('group by sex')->having('having avg(age) > 25')->select();
?>
5. __set 和 __get的用法
这是一个很棒的方法,__set 和 __get 方法可以用来捕获一个对象中不存在的变量和方法。
例: __set 和 __get
<?php
class foo {function __set($name,$val) {print("Hello, you tried to put $val in $name<br>");}function __get($name) {print("Hey you asked for $name<br>");}
}$test = new foo();
$test->__set('name','justcoding');
$test->__get('name');
?>
__call、__set 和 __get的用法相关推荐
- PHP中 对象自动调用的方法:__set()、__get()、__tostring()
总结: (1)__get($property_name):获取私有属性$name值时,此对象会自动调用该方法,将属性name值传给参数$property_name,通过这个方法的内部 执行,返回我们传 ...
- (实用篇)浅谈PHP拦截器之__set()与__get()的理解与使用方法
"一般来说,总是把类的属性定义为private,这更符合现实的逻辑. 但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数"__get()"和&q ...
- 【PHP面向对象(OOP)编程入门教程】10.__set(),__get(),__isset(),__unset()四个方法的应用...
一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是, 对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数"__get()"和"__ ...
- __set() And __get() 使用详解.
正确姿势: final class private_{private $name='adminmas';private $sex ='20';public function __get($name){ ...
- php 魔术方法__get,PHP魔术方法之__set()和__get()
先来看一段代码: class Article{ //私有成员属性 private $title = '标题'; //受保护的成员属性 protected $author = '作者'; //公有成员属 ...
- php4和php5的区别,php4和php5区别是什么
php4和php5区别是什么 导语:PHP4和PHP5,已经是两个版本了.下面的是百分网小编为大家搜集的php4和php5区别,供大家参考. PHP5 中的对象已经进行了较系统.较全面的调整,现在的样 ...
- 1.简单认识PHP和环境搭建
1.关于PHP PHP(Hypertext Perprocessor,超文本预处理器),是一种服务器端.跨平台.HTML嵌入式的脚本语言,其独特的语法混合了C.Java.和Perl语言的特点,是一种被 ...
- php数组为什么其他语言,PHP语言特性和各版本的差异
PHP语言简介 PHP 独特的语法混合了 C.Java.Perl 以及 PHP 自创新的语法. 它可以比 CGI或者Perl更快速的执行动态网页.用PHP做出的动态页面与其他的编程语言相比,PHP是将 ...
- php php5,初探 PHP5 (一)_PHP
虽然 PHP5 还没有正式发布(开发版本已经提供下载),但我们现在就可以开始体验一下新的版本 将要带给我们的惊喜.在以下的介绍中,我们将重点讲述 PHP5 中的三大特色功能.这三大特点为: * 新的对 ...
最新文章
- 重磅 | MIT启动IQ计划:研究人类智能,让全世界的机构共同合作
- springMVC get请求及其请求地址写法
- 共享几套silverlight2 toolkit最新的皮肤控件样式下载
- 高精除(信息学奥赛一本通-T1308)
- Fatal error LNK1168: cannot open *.exe file for writing
- hive时间函数入门
- 栈溢出 __stack_chk_fail
- GVRP基础配置【eNSP实现】
- 【射影几何01】 射影几何介绍
- iOS 新特性实现 3DTouch 开发
- java绘图机器猫_canvas哆啦A梦图形代码
- 单目标跟踪SiamMask:特定目标车辆追踪 part2
- App高危漏洞 Android用户记得更新百度全家桶
- 鸿蒙灵儿宠物奔驰法拉利,鄂P66666,从奔驰换成法拉利,车主还有限量版劳斯莱斯,中国只有三台...
- UVA1103 古代象形符号 Ancient Messages
- 放置类游戏用过的资源存档
- 对抗生成网络(GAN)中的损失函数
- 综合布线与工程七个系统
- 财务人员必学的数据赋能实战案例:一秒钟对账
- sql怎么连接mysql数据库服务器_MSSQL数据库的跨库查询与链接服务器
热门文章
- 打印字符(信息学奥赛一本通-T1021)
- 升级 项目跑不起来_不做“睡城”!嘉定新城“十四五”加速度,产城融合跑起来,远香湖,看好你...
- 开启防火墙并添加出入站规则
- python批量修改labelme(COCO)标注的json文件的label标签名称
- MVVM和MVC有什么区别
- Oracle SQL中的!=与
- VSCode 如何新建vue模板 - 插件引入篇
- 苏州大学计算机组成与结构,苏州大学计算机组成结构期末.docx
- java策略文件_[讨论]java类文件保护策略
- mysql增删改查 工具类_JDBC工具类实现对数据库数据的增删改查