php __call 与 __callStatic

php __call 与 __callStatic

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

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

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

__call($funcname, $arguments)

__callStatic($funcname, $arguments)


参数说明:

$funcname String 调用的方法名称。

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

__call 例子

[php] view plaincopy

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

__callStatic例子

[php] view plaincopy

    1. <?php
    2. class Member{
    3. protected static $memberdata = array();
    4. public static function __callStatic($func, $arguments){
    5. list($type, $name) = explode(‘_‘, $func);
    6. if(!in_array($type, array(‘set‘,‘get‘)) || $name==‘‘){
    7. return ‘‘;
    8. }
    9. $feature = get_called_class();
    10. switch($type){
    11. case ‘set‘:
    12. self::$memberdata[$feature][$name] = $arguments[0];
    13. break;
    14. case ‘get‘:
    15. return isset(self::$memberdata[$feature][$name])? self::$memberdata[$feature][$name] : ‘‘;
    16. break;
    17. default:
    18. }
    19. }
    20. }
    21. class User extends Member{
    22. public static function show(){
    23. $feature = get_called_class();
    24. if(self::$memberdata[$feature]){
    25. foreach(self::$memberdata[$feature] as $key=>$member){
    26. echo $key.‘:‘.$member.‘<br>‘;
    27. }
    28. }
    29. }
    30. }
    31. class Profession extends Member{
    32. public static function show(){
    33. $feature = get_called_class();
    34. if(self::$memberdata[$feature]){
    35. foreach(self::$memberdata[$feature] as $key=>$member){
    36. echo $key.‘:‘.$member.‘<br>‘;
    37. }
    38. }
    39. }
    40. }
    41. User::set_name(‘fdipzone‘);
    42. User::set_age(29);
    43. User::show();
    44. Profession::set_profession(‘IT SERVICE‘);
    45. Profession::set_price(2500);
    46. Profession::show();
    47. ?>
时间: 2024-08-12 05:57:41

php __call 与 __callStatic的相关文章

PHP中的__call和__callStatic方法

如何防止调用不存在的方法而出错,使用__call魔术重载方法. __call方法原型如下: mixed __call(string $name,array $arguments) 当调用一个不可访问的方法(如未定义,或者不可见时), __call()就会被调用.其中$name参数是要调用的方法名称.$arguments参数是一个数组,包含者要传递给方法的参数, 如下所示: <?php class HandsonBoy { private $name = 'chenqionghe'; privat

PHP魔术方法之__call与__callStatic方法

//魔术方法__call /* $method 获得方法名 $arg 获得方法的参数集合 */ class Human { private function t(){ } public function __call($method,$arg){ echo '你想调用我不存在的方法',$method,'方法<br/>'; echo '还传了一个参数<br/>'; echo print_r($arg),'<br/>'; } public static function _

php -- 魔术方法 之 调用方法:__call()、__callStatic()

方法重载:当调用一个不存在或者权限不够的方法的时候,会自动调用__call()方法 public function __call($name,$args){}  :用对象调用方法 public static function __callStatic($name,$args){}: 用类调用静态方法 $name:被调用的方法名 $args:被调用的方法的参数列表数组 <?php //PHP方法重载 class Person{ //方法 private function test(){ echo

魔术方法之__call与__callStatic方法

<?php class human{ private function t(){ } /** * 魔术方法__call * * @param string $method 获得方法名 * @param string $arg 获得方法的参数集合 */ public function __call($method, $params){ echo '你想调用我不存在的方法', $method, '方法'; echo '还传了一个参数'; print_r($params); } //魔术方法__cal

php中的魔术方法(Magic methods)和魔术常亮

PHP中把以两个下划线__开头的方法称为魔术方法,这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __construct(),类的构造函数 __destruct(),类的析构函数 __call(),在对象中调用一个不可访问方法时调用 __callStatic(),用静态方式中调用一个不可访问方法时调用 __get(),获得一个类的成员变量时调用 __set(),设置一个类的成员变量时调用 __isset(),当对不可访问属性调用isset()或empty()时调用 __unset(),

Php内核学习之类与对象详解

本文和大家分享的主要是php内核开发中的类与对象相关内容,一起来看看吧,希望对大家有所帮助. 类是什么,什么是对象,相信不需要我在这里解释.本文也不是要说什么OO思想,而是想探究一个问题.作为 PHP 底层的实现 C 语言,是一个面向过程的语言,C 语言是如何构建出可以使用类与对象的 PHP(PHP 绝对称不上是面向对象的语言),这就是本文探讨的重点.为了方便查阅,也方便说明,以下所涉及的源码和实现均来源于 PHP7,后面所有出现的 PHP 均表示 PHP7 版本. 类 通常,我们概念中,类是一

php核心知识要点

Php:脚本语言,网站建设,服务器端运行 PHP定义:一种服务器端的 HTML 脚本/编程语言,是一种简单的.面向对象的.解释型的.健壮的.安全的.性能非常之高的.独立于架构的.可移植的.动态的脚本语言.是一种广泛用于 Open Source(开放源代码)的尤其适合 Web 开发并可以嵌入 HTML 的多用途脚本语言.它的语法接近 C,Java 和 Perl,而且容易学习.该语言让 Web 开发人员快速的书写动态生成的网页. PHP简介:Rasmus Lerdorf发展历程(1994:1.0个人

php面试总结

总结: php部分我是按照面试常问的问题总结的,下面的问题在面试中出场率很高.问题比较基础 --------------------PHP部分--------------------- PHP中几个输出函数echo,print(),print_r(),sprintf(),var_dump()的区别 1:echo:是语句不是函数,没有返回值,可输出多个变量值,不需要圆括号.不能输出数组和对象,只能打印简单类型(如int,string). 2:print:是语句不是函数,有返回值 1 ,只能输出一个

PHP面试出场率较高的题目&lt;转载&gt;

--------------------PHP部分--------------------- PHP中几个输出函数echo,print(),print_r(),sprintf(),var_dump()的区别 1:echo:是语句不是函数,没有返回值,可输出多个变量值,不需要圆括号.不能输出数组和对象,只能打印简单类型(如int,string). 2:print:是语句不是函数,有返回值 1 ,只能输出一个变量,不需要圆括号.不能输出数组和对象,只能打印简单类型(如int,string). 3:p