php中的常用魔术方法汇总

这篇文章详细的对php中的常用魔术方法进行了整理归纳,分享给大家供大家参考,具体内容如下

1、PHP把所有”__”开头的方法当做魔术方法,所以任何自定义的方法都不能是”__”开头
php提供的重载,是指动态的创建属性或方法。重载是通过魔术方法来实现的。这些魔术方法的参数不能饮用传递,__get(),__set(),__isset(),__unset(),实现类属性重载。
2、当访问类中不可访问的属性时,将调用__get()方法
3、当访问类中不可访问的属性时,根据不同的情况会调用__get(),__set(),__isset(),__unset(),其中当访问属性 时,使用函数isset()或empty()时,将调用__isset()方法使用unset()函数时,将调用__unset()方法。
4、这四个方法不能使用static关键词定义,在php5.3.0后,一个warning级别的警告将发生,当使用static方法定义这4个方法。
5、何谓不可访问的属性:(1)类中没有的属性,(2)私有变量在类外被访问。方法重载,通过__call()和__callstatic()来实 现,两者的区别是一个上下文环境是否是静态方法,后者在调用不可访问的静态方法时会被调用。__callstatic()是在php5.3.0中才被添 加。
6、__sleep()和__wakeup()
serialize()序列化时,会先检查是否存在__sleep()函数,如果存在,则先调用__sleep(),返回一个包含所有变量名称的数组,如果该方法不返回任何内容,则null被序列化,并产生一个notice级别的错误。
__wakeup()方法和__sleep()相反,在调用unserialize()时被调用
7、__toString(),让一个类决定它如何转换成字符串,在php5.2.0之前,这个方法只能结合echo或print方法生效,php5.2.0之后,可以结合printf()修饰,但修饰的时候也不能用类似%d之类的非字符修饰符。
8、__invoke(),当尝试以调用函数的方式调用对象时,将出发这个函数,只在php5.3之后生效。
9、__set_state()静态方法,当调用var_export()的时候,才会调用这个静态方法,php5.1.0之后生效。唯一参数是接收一个数组。
10、__construct()和__destruct(),构造函数和析构函数,构造函数主要用于类的初始化,析构函数在某个对象的所有引用都 删除后或者对象被显示的销毁时运行。在析构函数中不允许抛出异常,否则会出发一个fatal error,析构函数在脚本结束时调用,此时所有的http header都已经发出.
11、__clone(),对象复制,此方法不能直接被调用,必须通过clone关键字显示调用

代码:

//实例化对象时,会调用对象的__construct方法
$obj = new Object();
//给对象不存在的属性赋值时,会调用对象的__set方法
$obj->title = "hello";
//使用对象不存在的属性时,会调用对象的__get方法
echo $obj->title;
//调用对象不存在的方法时,会调用对象的__call方法
$obj->test("hello",123,567);
//调用不存在的类静态方法时,会调用类的__callStatic方法
Object::staticMethod("static","not found method");
//直接输出对象时,会调用对象的__toString方法
echo $obj;
//将一个对象当作函数一样使用时,会调用对象的__invoke方法
echo $obj("test");
//克隆对象时,会调用对象的__clone方法
$obj2 = clone $obj;
//判断对象属性是否存在时,会调用对象的__isset方法
var_dump(isset($obj->aaa));
//销毁对象属性时,会调用对象的__unset方法
unset($obj->aaa);

class Object{

  protected $array = array();

  function __construct()
  {
    echo __METHOD__."你正在实例化对象<br>";
  }

  function __set($name, $value)
  {
    $this->array[$name]=$value;
  }

  function __get($name)
  {
    return $this->array[$name];
  }

  function __call($name, $arguments)
  {
    var_dump($name,$arguments);
    return "magic function\n";
  }

  static function __callStatic($name, $arguments)
  {
    var_dump($name,$arguments);
    return "magic static function";
  }

  function __toString()
  {
    return __CLASS__.'<br>';
  }

  function __invoke($arguments)
  {
    var_dump($arguments);
    return __METHOD__.'<br>';
  }

  function __clone()
  {
    echo __METHOD__."你正在克隆对象<br>";
  }

  function __isset($name)
  {
    echo __METHOD__."你想判断有没有属性".$name."<br>";
    return 1;
  }

  function __unset($name)
  {
    echo __METHOD__."你想删除属性".$name."<br>";
  }

  function __destruct()
  {
    echo __METHOD__."你正在注销对象<br>";
  }

}

以上就是关于php中的常用魔术方法的全部内容,希望对大家的学习有所帮助。

(0)

相关推荐

  • PHP类中的魔术方法(Magic Method)简明总结

    1. __construct()和__destruct() 在实例被 创建/销毁 的时候被调用,都可以传递0个或多个参数. class A { function A() { echo "build A"; } function __destruct() { echo "destroy A"; } } $obj = new A(); //unset($obj); Note:The destructor method will be called as soon as

  • php魔术方法功能与用法实例分析

    本文实例讲述了php魔术方法功能与用法.分享给大家供大家参考,具体如下: <?php //php中的魔术方法 header('content-type:text/html;charset=utf-8'); class Person{ public $name; protected $sex; private $salary; //构造方法,实例化对象是自动触发的方法 public function __construct($name,$sex,$salary){ $this->name=$na

  • ThinkPHP查询中的魔术方法简述

    我们在使用thinkphp开发的时候,有时候会用到getById('1')这个方法快速的获取一条信息的内容,这个方法比用where(" id =1 ")->find()好用多了,同时查询效率也比find快速. 很多人在刚开始接触这个方法的时候,没有多留意它的内部实现机制,仅仅认为是通过id来获取信息,而事实并非如此. 例如有的系统里存在getByTitle("nihao").getByMoney('1000')这类方法,这些与刚才提到的getById('1')

  • php 魔术方法使用说明

    PHP5.0后,php面向对象提成更多方法,使得php更加的强大!! 一些在PHP叫魔术方法的函数,在这里介绍一下:其实在一般的应用中,我们都需要用到他们!! 1.__construct() 当实例化一个对象的时候,这个对象的这个方法首先被调用. Java代码 class Test { function __construct() { echo "before"; } } $t = new Test(); class Test { function __construct() { ec

  • 深入PHP5中的魔术方法详解

    从PHP 5以后的版本,PHP中的类就可以使用魔术方法了.其规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非是为了重载已有的魔术方法. 1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的.◆__get( $property ) 当调用一个未定义的属性时,此方法会被触发,传递的参数是被访问的属性名.◆__set( $property, $value ) 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值

  • PHP 5.3新增魔术方法__invoke概述

    PHP自从5.3版以来就新增了一个叫做__invoke的魔术方法,使用该方法就可以在创建实例后,直接调用对象.如下示例所示: class testClass { public function __invoke { print "hello world"; } } $n = new testClass; $n(); 执行结果为: hello world. php官方示例如下: class CallableClass { public function __invoke($x) { va

  • php魔术方法与魔术变量、内置方法与内置变量的深入分析

    php内置变量了:DIRECTORY_SEPARATORDIRECTORY_SEPARATOR是一个返回跟操作系统相关的路径分隔符的php内置命令,在windows上返回/,而在linux或者类unix上反悔/,就是这么个区别,通常在定义包含文件路径或者上传保存目录的时候会用到.PHP 把所有以 __ (两个下划线)开头的类方法当成魔术方法.所以你定义自己的类方法时,不要以   __ 为前缀. 1 . __construct()当实例化一个对象的时候,这个对象的构造方法将首先被调用:我们知道 p

  • php中的常用魔术方法总结

    常用的魔术方法有:__Tostring ()  __Call()  __autoLoad()  __ clone()  __GET()   __SET()    __isset()  __unset() 1.__Tostring()   用于定义输出对象引用时调用  常用于打印一些对象的信息 必须有返回值eg:有一个persion类Persion per =new persion()Echo per;    //直接调用会出错我们可以在类的定义中添加__tostring()方法 复制代码 代码如

  • 详解php的魔术方法__get()和__set()使用介绍

    先看看php官方文档的解释: __set() is run when writing data to inaccessible properties. __get() is utilized for reading data from inaccessible properties. 究竟用中文怎么翻译呢? inaccessible :n. 难达到:难接近:无法理解. 有代码有真相: 复制代码 代码如下: <?php error_reporting(E_ALL); class stu{ priv

  • PHP中的魔术方法总结和使用实例

    魔术方法是PHP面向对象中特有的特性.它们在特定的情况下被触发,都是以双下划线开头,你可以把它们理解为钩子,利用模式方法可以轻松实现PHP面向对象中重载(Overloading即动态创建类属性和方法).魔术方法很多还是成对出现的,以下列出目前PHP中所有的模式方法. 1.__construct,__destruct __constuct构建对象的时被调用: __destruct明确销毁对象或脚本结束时被调用: 2.__get,__set __set当给不可访问或不存在属性赋值时被调用 __get

  • PHP魔术方法__ISSET、__UNSET使用实例

    __isset()   – 在对类中属性或者非类中属性使用isset()方法的时候如果没有或者非公有属性,则自动执行__isset()的方法 __unset() - 在对类中属性或者非类中属性使用unset()方法的时候如果没有或者非公有属性,则自动执行__unset()的方法 复制代码 代码如下: <?php     /**      * 针对类中的魔术方法 __isset() 和 __unset() 的例子      */ class Example {     public $public

  • PHP魔术方法__GET、__SET使用实例

    __get() - 读取不可访问属性的值时,__get() 会被调用. __set() - 在给不可访问属性赋值时,__set() 会被调用. 复制代码 代码如下: <?php /**  * 清晰的认识__get() __set()  */ class Example {         //公有的属性     public $public = 'pub' ;     //受保护的 - 子类中该属性可用     protected $protected = 'pro';     //私有的 -

  • php面向对象中的魔术方法中文说明

    1.__construct() 实例化对象是被自动调用.当__construct和以类名为函数名的函数 同时存在时调用__construct,另一个不背调用. 类名为函数名的函数为老版的构造函数. 2.__destruct() 当删除一个对象或一个对象操作结束是被调用. 3.__call() 对象调用某个方法.若方法不存在,这调用__call 这个方法 4.__get() 读取一个对象属性,如果对象属性是私有的会调用它 5.__set() 给一个对象属性赋值时如果属性是私有的会调用它 6.__t

随机推荐