zoukankan      html  css  js  c++  java
  • PHP中常见魔术方法解析

     1 <?php  
     2 class info {  
     3   
     4  private $province; //
     5  public  $city;     //城市  
     6  private $myname;   //姓名  
     7   
     8  //__construct()方法到实例化时自动加载function  
     9  function __construct() {  
    10  echo "实例化我就起作用<br>";  
    11  $this->myname("Steven");  
    12  }  
    13   
    14  //__call()方法用来获取没有定义的function  
    15  function __call($name, $param) {  
    16  echo $name."这个方法没有定义,跑到我这儿来了<br>";  
    17  print_r($param) ;  
    18  echo "<br>";  
    19  }  
    20   
    21  //定义一个方法 ,即普通的定义方法
    22  function myname($param) {  
    23  echo "定义过的就到定义过的这儿来,$param<br>";  
    24  return $this->myname = $param;  
    25  }  
    26   
    27  //__get()得到私有变量值  
    28  private function __get($name) {  
    29  if (isset ($this-> $name)) {  
    30  return ($this-> $name);  
    31  } else {  
    32  return false;  
    33  }  
    34  }  
    35   
    36  //__toString()  
    37  private function __toString() {  
    38  echo '你输入的这个类的名子叫'.__CLASS__."<br>";  
    39  return __CLASS__;  
    40  }  
    41   
    42  //__set()方法用来设置私有变量值  
    43  private function __set($name, $value) {  
    44  echo "设置私有变量时,自动调用了这个__set()方法为私有变量赋值<br>";  
    45  $this-> $name = $value;  
    46  }  
    47   
    48  //__isset()方法判断私有变量值  
    49  private function __isset($name) {  
    50  echo "isset()函数判断私有变量是不是被定义时,自动调用__isset()<br>";  
    51  return isset ($this-> $name);  
    52  }  
    53   
    54  //__unset()方法删除私有变量值  
    55  private function __unset($name) {  
    56  echo "unset()函数删除一个私有变量时,自动调用__unset()<br>";  
    57  unset ($this-> $name);  
    58  }  
    59   
    60  //__destruct()删除类对象时自动会调用  
    61  public function __destruct() {  
    62  echo '删除类对像,就到__destruct()这儿来<br>';  
    63  }  
    64 }  
    65   
    66 $info = new info();        //会调用__construct()方法和__destruct()方法  
    67 $info->province = "陕西";        //会调用__set()方法  
    68 $info->city = "西安";                //不会调用__set()方法  
    69 $info->myname("Steven");      //会调用myname()方法  
    70 $info->nickname("peng");   //会调用__call()方法  
    71 (string)$info;             //会调用__toString()方法  
    72 var_dump(isset ($info->province)) . "<br>";   //会调用__isset()方法和__get()方法  
    73 echo $info->province . "<br>";     //会调用__get()方法  
    74 unset ($info->province);           //会调用__unset()方法  
    75 echo $info->province;              //已经被删除了, 所以不会显示为安徽了,会调用__isset()方法  
    76 ?>  

    结果:

     1 实例化我就起作用  
     2 定义过的就到定义过的这儿来,Steven  
     3 设置私有变量时,自动调用了这个__set()方法为私有变量赋值  
     4 定义过的就到定义过的这儿来,Steven  
     5 nickname这个方法没有定义,跑到我这儿来了  
     6 Array ( [0] => peng )  
     7 你输入的这个类的名子叫info  
     8 isset()函数判断私有变量是不是被定义时,自动调用__isset()  
     9 bool(true) 陕西  
    10 unset()函数删除一个私有变量时,自动调用__unset()  
    11 isset()函数判断私有变量是不是被定义时,自动调用 __isset()  
    12 删除类对像,就到__destruct()这儿来  

    总结:

    1,__set(),__get(),__isset(),__unset()可以归于一类,对于私有变量的赋值,取值,判断,删除操作。以赋值为例,$province是私有变量,$city是全局变量,赋值的时候,$province调用了__set()方法,而$city却没有调用__set()这个方法

    2,__construct()构造函数,__destruct()析构函数,他们二个都是实例化类的时候就会产生,有一点不同,构造在最前面,析构函数在最后面。

    3,当你调用了一个class中没有的方法时,肯定会报fatal error,如果有了__call()函数,就不会报错了。$info->nickname("tank");class中并没有这个方法,但是他没有报错。传的参数是字符串,__call会把他转成数组。Array ( [0] => tank )

    4,(string)$info;把$info这个obj强制转成字符串,从表面意思看是这个,但是实际上是调用__toString()的方法。

    附几个PHP 的魔术常量:

    __LINE__ 文件中的当前行号。
    __FILE__ 文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。
    __DIR__ 文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增) =
    __FUNCTION__  函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
    __CLASS__ 类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 FooBar)。注意自 PHP 5.4 起 __CLASS__ 对 trait 也起作用。当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字。
    __TRAIT__ Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如 FooBar)。
    __METHOD__ 类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
    __NAMESPACE__ 当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。
  • 相关阅读:
    设计模式之-工厂模式、构造函数模式
    发布订阅小示例
    使用vue,react,angular等框架和不使用框架使用jquery的优缺点
    react优化--pureComponent
    Vue、 React比较
    ORACLE触发器和new、old特殊变量
    mysql的存储过程与自定义函数
    MySQL日期
    php(Personal Home Page)简介,安装和配置(apache服务器使用和配置1)
    话谈html语义化
  • 原文地址:https://www.cnblogs.com/Steven-shi/p/5332025.html
Copyright © 2011-2022 走看看