__call、__set 和 __get的用法
程序员文章站
2022-05-12 10:35:02
...
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'); ?>
上一篇: 预防查询语句数据库注入漏洞攻击
下一篇: php数组去重的函数代码示例
推荐阅读
-
Python编程中对super函数的正确理解和用法解析
-
基于WebClient实现Http协议的Post与Get对网站进行模拟登陆和浏览实例
-
C#中const和readonly的用法比较
-
SQL事务用法begin tran,commit tran和rollback tran的用法
-
C#中StringBuilder用法以及和String的区别分析
-
python dict.get()和dict['key']的区别详解
-
winform中的ListBox和ComboBox绑定数据用法实例
-
winform中的ListBox和ComboBox绑定数据用法实例
-
基于java Files类和Paths类的用法(详解)
-
Android搜索框(SearchView)的功能和用法详解