__call、__set 和 __get的用法

1. __call的用法

PHP5 的对象新增了一个专用方法 __call(),这个方法用来监视一个对象中的其它方法。如果你试着调用一个对象中不存在的方法,__call 方法将会被自动调用。

例:__call

Php代码  

  1. <?php
  2. class foo {
  3. function __call($name,$arguments) {
  4. print("Did you call me? I‘m $name!<br>");
  5. print_r($arguments);
  6. print("<br><br>");
  7. }
  8. function doSecond($arguments)
  9. {
  10. print("Right, $arguments!<br>");
  11. }
  12. }
  13. $test = new foo();
  14. $test->doFirst(‘no this function‘);
  15. $test->doSecond(‘this function exist‘);
  16. ?>

2. __call 实现“过载”动作

这个特殊的方法可以被用来实现“过载(overloading)”的动作,这样你就可以检查你的参数并且通过调用一个私有的方法来传递参数。

例:使用 __call 实现“过载”动作

Php代码  

  1. <?php
  2. class Magic {
  3. function __call($name,$arguments) {
  4. if($name==‘foo‘) {
  5. if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);
  6. if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);
  7. }
  8. }
  9. private function foo_for_int($x) {
  10. print("oh an int!");
  11. }
  12. private function foo_for_string($x) {
  13. print("oh a string!");
  14. }
  15. }
  16. $test = new Magic();
  17. $test->foo(3);
  18. $test->foo("3");
  19. ?>

3.  面向对象重载

Php代码  

  1. <?php
  2. /*__call(string $name,array $arg)的用法
  3. *当调用一个不可访问的方法的时候调用$name是方法名称 $arg是个数组包含要传递给方法的参数
  4. */
  5. class Account{
  6. private $user=1;
  7. private $pwd=2;
  8. public function __call($name,$arg){
  9. switch(count($arg)){
  10. case 2:
  11. echo $arg[0]*$arg[1],PHP_EOL;
  12. break;
  13. case 3:
  14. echo array_sum($arg),PHP_EOL;
  15. break;
  16. default:
  17. echo "参数不对",PHP_EOL;
  18. break;
  19. }
  20. }
  21. }
  22. $a= new Account();
  23. //这里模拟了重载
  24. //重载:一个类中可以定义参数列表不同但名字相同的多个方法
  25. $a->make(5);
  26. $a->make(5,6);

4. 使用__call()方法来实现数据库连贯操作

Php代码  

  1. <?php
  2. // 使用__call()方法来实现数据库连贯操作
  3. // 申明一个Db类(数据库操作类)的简单操作模型
  4. class Db{
  5. private $sql = array(
  6. "field" => "",
  7. "where" => "",
  8. "order" => "",
  9. "limit" => "",
  10. "group" => "",
  11. "having" => "",
  12. );
  13. // 连贯操作调用field() where() order() limit() group() having()方法,组合sql语句
  14. function __call($methodName,$args){
  15. // 将第一个参数(代表不存在方法的方法名称),全部转成小写方式,获取方法名称
  16. $methodName = strtolower($methodName);
  17. // 如果调用的方法名和成员属性数组$sql下标对应上,则将第二个参数给数组中下标对应的元素
  18. if(array_key_exists($methodName,$this->sql)){
  19. $this->sql[$methodName] = $args[0];
  20. }else{
  21. echo ‘调用类‘.get_class($this).‘中的方法‘.$methodName.‘()不存在‘;
  22. }
  23. // 返回自己对象,则可以继续调用本对象中的方法,形成连贯操作
  24. return $this;
  25. }
  26. // 输出连贯操作后组合的一个sql语句,是连贯操作最后的一个方法
  27. function select(){
  28. echo "SELECT {$this->sql[‘field‘]} FROM  user {$this->sql[‘where‘]} {$this->sql[‘order‘]} {$this->sql[‘limit‘]} {$this->sql[‘group‘]}
  29. {$this->sql[‘having‘]}";
  30. }
  31. }
  32. $db = new Db();
  33. // 连贯操作
  34. $db->field(‘sex, count(sex)‘)
  35. ->where(‘where sex in ("男","女")‘)
  36. ->group(‘group by sex‘)
  37. ->having(‘having avg(age) > 25‘)
  38. ->select();
  39. ?>

5.  __set 和 __get的用法

这是一个很棒的方法,__set 和 __get 方法可以用来捕获一个对象中不存在的变量和方法。

例: __set 和 __get

Php代码  

  1. <?php
  2. class foo {
  3. function __set($name,$val) {
  4. print("Hello, you tried to put $val in $name<br>");
  5. }
  6. function __get($name) {
  7. print("Hey you asked for $name<br>");
  8. }
  9. }
  10. $test = new foo();
  11. $test->__set(‘name‘,‘justcoding‘);
  12. $test->__get(‘name‘);
  13. ?>
时间: 2024-10-13 20:26:02

__call、__set 和 __get的用法的相关文章

public、protected和private的区别以及__set()和__get()的用法

public.protected和private的区别 public       表示全局,类内部外部子类都可以访问; protected  表示受保护的,只有本类或子类或父类中可以访问; private      表示私有的,只有本类内部可以使用; 其中public具有全局性.继承性:protected具有被继承性:private只能被本类使用,不具有全局性和被继承性. __set()和__get()的用法 如果外部程序想要得到类内部的私有属性,例如private $name,可在类中定义一个

(实用篇)浅谈PHP拦截器之__set()与__get()的理解与使用方法

"一般来说,总是把类的属性定义为private,这更符合现实的逻辑. 但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数"__get()"和"__set()"来获取和赋值其属性,以及检查属性的"__isset()"和删除属性的方法"__unset()". 我们为每个属性做了设置和获取的方法,在PHP5中给我们提供了专门为属性设置值和获取值的方法,"__set()"和&qu

PHP中的__set和__get方法

当调用或者设置类不存在的方法时,_会调用_set和__get方法 以下是示例 <?php class HandsonBoy { private $name = 'chenqionghe'; private $age = 18; public function __set($name,$value) { echo '您正在设置私有属性'.$name.'<br >值为'.$value.'<br>'; $this->$name = $value; } public funct

PHP常用魔术方法(__set、__get魔术方法:)

__set.__get魔术方法: //文件名:Object.php <?phpnamespace IMooc;class Object{ protected $array = array(); function __set($name, $value)//set魔术方法 { var_dump(__METHOD__);//输出当前方法 $this->array[$name]=$value;//$name=title,$value="哎哟喂" } function __get(

PHP面向对象(OOP):__set(),__get(),__isset(),__unset()四个方法的应用

一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是, 对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数”__get()”和”__set()”来获取和赋值其属性,以及检查属性 的”__isset()”和删除属性的方法”__unset()”. 上一节中,我们为每个属性做了设置和获取的方法,在PHP5中给我们提供了专门为属性设置值和获取值的方法,”__set()”和 “__get()”这两个方法,这两个方法不是默认存在的, 而是我们手工添加到类里面去的,像构造

php--opp--10.__set(),__get(),__isset(),__unset()四个方法的应用

一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是, 对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数”__get()”和”__set()”来获取和赋值其属性,以及检查属性的”__isset()”和删除属性的方法”__unset()”. 上一节中,我们为每个属性做了设置和获取的方法,在PHP5中给我们提供了专门为属性设置值和获取值的方法,”__set()”和“__get()”这两个方法,这两个方法不是默认存在的, 而是我们手工添加到类里面去的,像构造方法

详解PHP的__set()、__get()、__isset()、unset()四个方法

PHP系统中给我们提供了很多预定义的方法,这些方法大部分都需要在类中声明,只有需要时才添加到类中.它们的作用.方法名称.使用的参数列表和返回值都是在PHP中预定好的,并且都是以两个下划线开始的方法名称.如果需要使用这些方法,方法体中的内容需要用户自己按需求编写.每一个预定义的方法都有它特定的作用,使用时不需要用户直接调用,而是在特定的情况下自动被调用.这一节中使用到的__set().__get().__isset().和unset()四个方法,以及前面介绍过的构造方法“__construct()

__set()与__get() 魔术方法

在面向对象编程的过程中,对于类当中的各个成员变量,都有不同的访问属性,比如公有的(public)属性,在类内部和类外部都可直接调用:而私有的(private)和受保护的(protected),在类外不能直接赋值和使用,必须通过在类当中定义成员函数对该属性的成员变量进行操作,今天要提的__set()和__get()魔术方法就是针对私有成员进行赋值和获取值操作. 具体的方法可以参考下面的示例代码: 首先,不用魔术方法进行操作,直接定义函数: <!DOCTYPE html> <html>

phpz中的魔术方法__call、__set、__get、__sleep、__invoke、__autoload、__construct、__destruct、__clone、__tostring、__callstatic

PHP5.3新增了一个叫做__invoke的魔术方法,这样在创建实例后,可以直接调用对象. class testClass { public function __invoke { print “hello world”; } } $n = new testClass; $n(); 执行结果为: hello world. 官方示例 class CallableClass { public function __invoke($x) { var_dump($x); } } $obj = new C