`
afeix
  • 浏览: 13241 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

php __call 与 __callStatic

    博客分类:
  • PHP
 
阅读更多

转自:http://blog.csdn.net/fdipzone/article/details/8581125

 

php 5.3 后新增了 __call 与__callStatic 魔法方法。

__call 当要调用的方法不存在或权限不足时,会自动调用__call 方法。

__callStatic 当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法。

 

__call($funcname, $arguments)

__callStatic($funcname, $arguments)


参数说明:

$funcname String 调用的方法名称。

$arguments Array 调用方法时所带的参数。

 

__call 例子

 

  1. <?php  
  2.   
  3. class Member{  
  4.   
  5.     protected $memberdata = array();  
  6.   
  7.     public function __call($func$arguments){  
  8.         list($type$name) = explode('_'$func);  
  9.       
  10.         if(!in_array($typearray('set','get')) || $name==''){  
  11.             return '';  
  12.         }  
  13.   
  14.         switch($type){  
  15.             case 'set':  
  16.                 $this->memberdata[$name] = $arguments[0];  
  17.                 break;  
  18.               
  19.             case 'get':  
  20.                 return isset($this->memberdata[$name])? $this->memberdata[$name] : '';  
  21.                 break;  
  22.               
  23.             default:  
  24.         }  
  25.   
  26.     }  
  27.   
  28. }  
  29.   
  30.   
  31. class User extends Member{  
  32.   
  33.     public function show(){  
  34.         if($this->memberdata){  
  35.             foreach($this->memberdata as $key=>$member){  
  36.                 echo $key.':'.$member.'<br>';  
  37.             }  
  38.         }  
  39.     }  
  40.   
  41. }  
  42.   
  43.   
  44. class Profession extends Member{  
  45.   
  46.     public function show(){  
  47.         if($this->memberdata){  
  48.             foreach($this->memberdata as $key=>$member){  
  49.                 echo $key.':'.$member.'<br>';  
  50.             }  
  51.         }  
  52.     }  
  53.   
  54. }  
  55.   
  56. $userobj = new User();  
  57. $userobj->set_name('fdipzone');  
  58. $userobj->set_age(29);  
  59. $userobj->show();  
  60.   
  61. $probj = new Profession();  
  62. $probj->set_profession('IT SERVICE');  
  63. $probj->set_price(2500);  
  64. $probj->show();  
  65.   
  66. ?>  

 

__callStatic例子

 

  1. <?php  
  2.   
  3. class Member{  
  4.   
  5.     protected static $memberdata = array();  
  6.   
  7.     public static function __callStatic($func$arguments){  
  8.   
  9.         list($type$name) = explode('_'$func);  
  10.           
  11.         if(!in_array($typearray('set','get')) || $name==''){  
  12.             return '';  
  13.         }  
  14.   
  15.         $feature = get_called_class();  
  16.   
  17.         switch($type){  
  18.             case 'set':  
  19.                 self::$memberdata[$feature][$name] = $arguments[0];  
  20.                 break;  
  21.   
  22.             case 'get':  
  23.                 return isset(self::$memberdata[$feature][$name])? self::$memberdata[$feature][$name] : '';  
  24.                 break;  
  25.   
  26.             default:  
  27.         }  
  28.       
  29.     }  
  30.   
  31. }  
  32.   
  33.   
  34. class User extends Member{  
  35.   
  36.     public static function show(){  
  37.   
  38.         $feature = get_called_class();  
  39.   
  40.         if(self::$memberdata[$feature]){  
  41.             foreach(self::$memberdata[$featureas $key=>$member){  
  42.                 echo $key.':'.$member.'<br>';  
  43.             }  
  44.         }  
  45.     }  
  46.   
  47. }  
  48.   
  49.   
  50. class Profession extends Member{  
  51.   
  52.     public static function show(){  
  53.   
  54.         $feature = get_called_class();  
  55.   
  56.         if(self::$memberdata[$feature]){  
  57.             foreach(self::$memberdata[$featureas $key=>$member){  
  58.                 echo $key.':'.$member.'<br>';  
  59.             }  
  60.         }  
  61.     }  
  62.   
  63. }  
  64.   
  65. User::set_name('fdipzone');  
  66. User::set_age(29);  
  67. User::show();  
  68.   
  69. Profession::set_profession('IT SERVICE');  
  70. Profession::set_price(2500);  
  71. Profession::show();  
  72.   
  73. ?>  
分享到:
评论

相关推荐

    PHP魔术方法之__call与__callStatic使用方法

    PHP魔术方法__call和__callStatic是PHP面向对象编程中两个非常有用的功能,它们允许开发者定义当尝试调用一个不存在的方法时所要执行的操作。具体到__call和__callStatic的使用,它们主要针对对象实例方法和静态方法...

    PHP_5.3_与_PHP_5.2_开发区别和新特性

    在静态上下文中调用 `__call` 时,可以使用 `__callStatic`。 5. **对象处理的改进**: - **对象到数组转换**:在 PHP 5.3 中,一些函数(如 `array_flip`, `array_unique`)不再直接接受对象作为参数。需要先将...

    php魔术函数__call()用法实例分析

    - `__callStatic()`: 类似于 `__call()`,但处理静态方法的调用。 - `__get()`: 当尝试访问一个不存在的属性时被调用。 - `__set()`: 当尝试设置一个不存在的属性时被调用。 - `__isset()`: 当使用 `isset()` ...

    php常见的魔术方法详解

    PHP中的魔术方法有 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone, __autoload  1、__get、__set  这两个方法是为在...

    laravel框架模型中非静态方法也能静态调用的原理分析

    `__call()`和`__callStatic()`是PHP中的特殊方法,它们在对象的调用中被用作“方法不存在时的回调”。当尝试调用对象的不存在的方法时,`__call()`会被触发;当尝试在静态上下文中调用不存在的静态方法时,`__...

    php面向对象系列(完整)

    - 方法重载(Overloading):PHP不支持方法名的重载,但可以通过魔术方法`__call()`和`__callStatic()`实现类似效果。 - 方法重写(Override):子类可以覆盖父类的方法,实现不同的行为。 - 接口(Interface):...

    php教程之魔术方法的使用示例(php魔术函数)

    `__call()` 在对象上下文中调用不存在的方法时触发,而 `__callStatic()` 在静态上下文中调用不存在的方法时触发。它们都可以接收方法名称 `$name` 和参数数组 `$arguments`,然后开发者可以自定义如何处理这些调用...

    PHP程序设计-3期(KC016) 课后习题2-2 魔术常量.doc

    `__call()`和`__callStatic()`方法在`MethodTest`类中展示了如何处理未定义的方法调用,动态执行代码。`__get()`, `__set()`, `__isset()`和`__unset()`在同一个类中用于存储对象属性在一个私有数组中,提供了对动态...

    PHP 魔术变量和魔术函数详解_.docx

    除了魔术变量,PHP还有魔术函数,如`__construct()`用于对象的构造,`__destruct()`用于对象销毁,`__get()`和`__set()`处理未定义的属性访问,`__call()`和`__callStatic()`处理未定义的方法调用等。这些函数可以...

    PHP面向对象之刀客教程03

    - **__callStatic()** 类似于__call,但针对静态方法。 通过学习“PHP面向对象之刀客教程03”,你将对这些概念有深入理解,并能在实际项目中灵活运用。实践是检验真理的唯一标准,理论结合实际案例将有助于巩固...

    php-5.2.9.tar

    2. **魔术常量和魔术方法**:例如__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__等魔术常量,以及__construct, __destruct, __call, __callStatic等魔术方法,提供了更多的元编程能力。 3. **PDO(PHP ...

    php语言历史版本更新概要php4-php7(20151209)

    3. **访问控制**:`__call`在尝试访问私有或受保护的方法时被调用。 4. **函数内部限制**:禁止在函数内部使用`func_get_arg()`等函数。 5. **命名空间**:引入了命名空间的概念,允许更好的代码组织。 6. **静态晚...

    第37天:WEB漏洞-反序列化之PHP&JAVA全解(上)1

    常见的魔术方法有 __construct()、__destruct()、__call()、__callStatic()、__get()、__set()、__isset()、__unset()、__invoke() 等。 二、PHP 反序列化漏洞示例 以下是一个简单的反序列化漏洞示例: ```php &lt;?...

    php 的十个高级技巧

    - 魔术方法如`__construct()`, `__destruct()`, `__call()`, `__callStatic()`等,提供类对象的生命周期管理和方法调用处理。 3. **命名空间(Namespaces)**: - 命名空间允许在相同名称的类或函数之间创建逻辑...

    PHP的十个高级技巧(TXT)

    2. **魔术方法**: PHP中的魔术方法如`__construct`, `__destruct`, `__call`, `__callStatic`等,可以在特定场景下自动执行,比如对象创建、方法调用等,为代码提供了更多的元编程能力。 3. **类型声明**: 自PHP 7...

    最全的PHP面试题总汇

    4. 魔术方法__call和__callStatic的用途是什么? 八、PHP与数据库交互 1. mysqli和PDO是PHP的两种数据库连接方式,它们的区别在哪里? 2. SQL注入是什么?如何在PHP中防止SQL注入? 3. PHP中如何执行预处理语句? 4...

    php魔术函数

    - **定义与用途**:`__call()` 当试图调用对象上不存在的方法时被调用;`__callStatic()` 类似,但针对静态方法。 - **示例**: ```php class MyClass { public function __call($name, $arguments) { echo ...

    php代码-PHP中一__开头的属性

    5. **__call() 和 __callStatic()**: 当尝试调用类中不存在的方法时,会触发__call()。如果是静态方法,则调用__callStatic()。 ```php class MyClass { public function __call($name, $arguments) { // 处理...

Global site tag (gtag.js) - Google Analytics