__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()的理解与使用方法
"一般来说,总是把类的属性定义为private,这更符合现实的逻辑. 但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数"__get()"和&q ...
- PHP面向对象.__set(),__get(),__isset(),__unset()四个方法的
一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是, 对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数”__get()”和”__set()”来获取和赋值其属性 ...
- PHP拦截器之__set()与__get()的理解与使用
“一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“__get()”和“__set()”来获取和赋值其属性 ...
- 【PHP面向对象(OOP)编程入门教程】10.__set(),__get(),__isset(),__unset()四个方法的应用
一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是, 对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数”__get()”和”__set()”来获取和赋值其属性 ...
- __set()与__get() 魔术方法
在面向对象编程的过程中,对于类当中的各个成员变量,都有不同的访问属性,比如公有的(public)属性,在类内部和类外部都可直接调用:而私有的(private)和受保护的(protected),在类外不 ...
- PHP中 对象自动调用的方法:__set()、__get()、__tostring()
总结: (1)__get($property_name):获取私有属性$name值时,此对象会自动调用该方法,将属性name值传给参数$property_name,通过这个方法的内部 执行,返回我们传 ...
- PHP面向对象(OOP):__set(),__get(),__isset(),__unset()四个方法的应用
一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是, 对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数”__get()”和”__set()”来获取和赋值其属性 ...
- PHP面向对象(OOP)编程完全教程:10.__set(),__get(),__isset(),__unset()四个方法的应用
一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是, 对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数”__get()”和”__set()”来获取和赋值其属性 ...
- 详解PHP的__set()、__get()、__isset()、unset()四个方法
PHP系统中给我们提供了很多预定义的方法,这些方法大部分都需要在类中声明,只有需要时才添加到类中.它们的作用.方法名称.使用的参数列表和返回值都是在PHP中预定好的,并且都是以两个下划线开始的方法名称 ...
随机推荐
- python-爬虫之urllib模块
urllib是python的一个获取url(Uniform Resource Locators,统一资源定址器)了,我们可以利用它来抓取远程的数据进行保存哦 1.基本方法 urllib.request ...
- [转]Install ASP.NET MVC 4 for Visual Studio 2010
本文转自:https://docs.microsoft.com/en-us/aspnet/mvc/mvc4
- canvas绘制经典星空连线效果
来自:https://segmentfault.com/a/1190000009675230 下面开始coding:先写个canvas标签 <canvas height="620&qu ...
- 特殊引用类型(string)
private string FuncWithParameters(int param1, String param2, List<string> param3) { // 我们在这里改变 ...
- RabbitMQ - 任务队列
这次我们试着实现这样一个小程序: 嗯,就是任务队列(task queue).不是将任务集中在一堆并一直等到所有任务一并完成为止,而是将每一个任务封装为一个消息,并将其发送到队列,后台的workers就 ...
- 如何使用 MySQL EntityFramework 组件处理 MYSQL PaaS DB
MySQL Database on Azure 是 Azure 平台上推出的 MySQL 云数据库服务,通过全面兼容 MySQL 协议,为用户提供了一个全托管的性能稳定.可快速部署.高可用.高安全性的 ...
- git 批量删除 tag
1. master分支存在大量冗余tag aa0e24dfd920a85c39da400a404309cb6fc69dc0 refs/tags/rc_69 f36f3f21f1ce61db3974e9 ...
- response.setHeader()下载的用法
1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma 主要: Cache-Control , Connecti ...
- UNIX/Linux系统管理技术手册(1)----脚本和shell
1. 管道和重定向 (i) 要让第二条命令只有在第一条命令成功完成之后才执行,可以用一个 && 符号把两条命令隔开.例如: $ > /dev/null && cd ...
- CentOS 7运维管理笔记(10)----MySQL源码安装
MySQL可以支持多种平台,如Windows,UNIX,FreeBSD或其他Linux系统.本篇随笔记录在CentOS 7 上使用源码安装MySQL的过程. 1.下载源码 选择使用北理工的镜像文件: ...