__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中预定好的,并且都是以两个下划线开始的方法名称 ...
随机推荐
- FZU2168——防守阵地 I——————【找规律或前缀和】
防守阵地 I Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- Hibernate生成数据库表
首先创建实体类 import java.util.Date; public class ProductionEntity { public Integer getId() { return id; } ...
- forward和redirect请求方式
之前一直对forward和redirect有点疑问,现在练习一下加深点记忆,理解理解,forward是一次请求,在一个request范围内,而redirect是二次请求 实例: @Controller ...
- Java 基础(2)——编译运行 & 规范
上节学到 Java 的编译与运行,我们已经学会了怎么去执行一个写好(假装我们已经会写了)的代码,这篇当然要试试手啦 O(∩_∩)O 哈哈~ 小试一下 新建一个 HelloAhanWhite.java ...
- ssm框架文件上传
有两种方法 导包和上传配置自己搞: 第一种: 上传单个文件: @RequestMapping("/addfile1") public String addfile(@Request ...
- MyBaits_查询缓存02_Ehcache二级缓存
一.Ehcache二级缓存的开启 导入jar(https://github.com/mybatis/ehcache-cache/releases) <cache type="org.m ...
- [Java反射基础四]通过反射了解集合泛型的本质
本文接上文"方法反射的基本操作",利用反射了解下java集合中泛型的本质 1.初始化两个集合,一个使用泛型,一个不使用 ArrayList list1 = new ArrayLis ...
- 反编译DLL文件
我们平时在工作中经常会遇到一些已经被编译后的DLL,而且更加麻烦是没有源代码可以进行修改,只能针对这个DLL的文件进行修改才能得到我们想要的结果:本文将通过一个实例来演示如果完成一个简单的修改;我们将 ...
- PHP获取当前时间戳
PHP提供了专门的获取当前时间戳的函数,那就是time()函数. time()函数获取当前的UNIX时间戳,返回值为从时间戳纪元(格林威治时间1970年1月1日 00:00:00)到当前的秒数. ...
- Python入门-内置函数二
看到标题你也能猜到今天要说大概内容是什么了,没错,昨天没有说完的部分再给大家说说(有一些重合的部分),内置函数的内容比较多,并且工作中经常用到的却不太多,很多都是不太常用的,所以我就着重说一些比较常用 ...