PHP魔术方法

上面我将对PHP全部的魔术点子进行介绍表达。其实上面包车型大巴大好些个措施,对于三个合格的PHP程序猿来讲,都是很了然的东西了。笔者在那处作个总括,自个儿作个记录学习,同期也给还没熟知那个方式的同室们做个介绍。如有遗漏和谬误,希望各位能建议。下边所涉嫌的,大大多是PHP5所扩大的魔术点子,少一些在PHP4里就早就存在,少一些则是PHP5.1.0之后才现身的,那几个在下边作者将会波及。

咱俩在PHP中时时用到魔术点子,像布局方法,析构方法等等魔术变量,下边计算一下部分常用的魔术变量:

总的看, 有上面几个魔术函数
__construct() __destruct() __get() __set() __isset()
__unset() __call() __callStatic()
__sleep() __wakeup() __toString() __set_state() __clone()
__autoload()

__construct()和__destruct()布局函数__construct(卡塔尔(قطر‎和析构函数__澳门新葡萄京官网首页,destruct(State of Qatar,那八个不用自个儿多说了吗,是个程序猿都知情。__construct(卡塔尔会在实例成立的时候被调用,__destruct(卡塔尔在实例销毁的时候被调用。须要在意的时候,虽然你不显式地调用unset去销毁一个实例,它也会在剧本运营停止的时候被销毁。这八个主意都得以传递0个大概两个参数。

__construct(),__destruct(),__clone(),__autoload(),__tostring(),__invoke(),__set(),__get(),__unset(),__isset(),__call(),__callstatic;

__construct(卡塔尔(قطر‎当实例化三个对象的时候,那么些目的的那些主意首先被调用。
__destruct(卡塔尔当删除三个对象或对象操作终止的时候,调用该办法。
__set(State of Qatar在给不可访谈属性赋值时会被调用。
__get(卡塔尔读取不可访谈属性的值时会被调用。
__isset(State of Qatar当对不可访问属性调用 isset(卡塔尔(قطر‎或 empty(卡塔尔国时,会被调用。
__unset(卡塔尔国当对不可访谈属性调用 unset(卡塔尔国时会被调用。
__sleep当举行种类化对象时候调用
__wakeup当实行反连串对象时候调用
__toString当直接打字与印刷多个对象的时候,这些艺术将会被调用
__call($func, $param卡塔尔(قطر‎ 当尝试调用叁个不设有的点子的时候被调用.
这些主意必须有多个参数,第三个为调用的诀窍名,第一个是二个被调用方法的参数数组。
__callStatic(State of Qatar当尝试调用二个不设有的静态方法的时候被调用.这几个点子必需有八个参数,第三个为调用的办法名,第叁个是一个被调用方法的参数数组。
__set_state()当用var_export导出实例的时候被调用
__clone(卡塔尔(قطر‎当克隆实例时候被调用.
__autoload(State of Qatar函数.当创设三个实例化的时候,纵然对应的类不设有,则会被调用。(可跟spl_autoload_register(卡塔尔国做一下相比)

?phpclass o{ public function __construct() { echo ''building instance''; } public function __destruct() { echo ''destroy instance''; }}$i = new o;unset($i);//这句有无都不影响最后的输出。__destruct()总是会被调用的//输出//building instance//destroy instance?

1,__constuct(卡塔尔国布局函数

__get, __set, __isset,
__unset
当对叁本性质实行操作的时候,假如该属性不可获得,则调用以上措施的里边一个。调用什么点子是基于对属性所开展的操作。注:在php
5.0.*里,那4个点子必需为public。__get触发事件:调用属性参数 1
:所调用的天性名例子:

不足为道实例化完八个对象之后,都要对该对象的脾气进行初阶化!在实例化四个目的的时候,PHP系统会活动的调用一个名字叫做__construct(卡塔尔国的艺术,大家把那几个主意叫作“布局方法”!

?phpclass o{ protected function __get($var) { return ''No Member:''.$var; }}$i=new o();echo $i-name; // 输出 No Member:name?

?phpclass o{ private $name=''surfchen'';//注意这里的private protected function __get($var) { return ''No Member:''.$var; }}class child extends o{function test(){echo $this-name;}}$c=new child();echo $c-test(); // 输出 No Member:name?

里头,构造方法能够未有参数!

__set触发事件:对多个属性进行赋值参数 1 :所调用的属性名参数 2
:所赋予的值例子:

<?php

class Stu {

 public $stu_name;
 public $stu_age;

//构造方法,实例化时自动调用
  public function __construct($name,$age){

      $this->stu_name = $name;
      $this->stu_age = $age;
   }  

}

//实例化stu对象
$stu = new Stu('孙悟空','500');
?phpclass o{protected function __set($var,$val){echo ''setting ''.$var.'' to ''.$val.;}}$c=new o();echo $c-name=''wolfzeus''; /*输出:setting name to wolfzeuswolfzeus*/?

2.__destruct(卡塔尔析构方法

__isset触发事件:用isset检验属性是或不是留存参数 1 :所调用的习性名例子:

  与布局方法是有的,布局方法是在三个对象“出生”的时候由系统活动调用的,而析构方法是在八个对象“消失”的时候由系统活动调用的!

?phpclass o{protected function __isset($var){echo $var.'' have not been set'';}}$c=new o();isset($c-name); /*输出:name have not been set*/?

析构方法的名字叫__destruct(卡塔尔(قطر‎;注意里面不能有其它的参数!

__unset触发事件:unset一个特性参数 1 :所调用的性情名例子:

<?php

//析构方法
public function __destruct(){

}

?>
?phpclass o{protected function __unset($var){echo $var.'' is unset'';}}$c=new o();unset($c-name); /*输出:name is unset*/?

留心:析构方法是在指标销毁以前调用的!  

__call($func,$para)当尝试调用二个对象的方法的时候,纵然该办法不设有,则调用__call($func,$para卡塔尔(قطر‎方法。那几个措施必得有多少个参数,第多个为调用的章程名,首个是八个被调用方法的参数数组。

作用:

析构方法的效应一般是用来刑释该对象所占用的额外的能源,并不是绝迹该指标自己!

3,__clone()克隆

触发机会:是在仿制一个对象的时候,对新对象进行初阶化的办事

//克隆方法在克隆对象的时候对新对象的初始化工作

public function __clone(){

  $this->is_clone=true;
}

  

思考:

克隆出来的靶子依然不是Student类中的贰个实例呢?

大家得以应用instanceof运算符来进行推断!

instanceof正是用来判定某些对象是否是有个别类的八个实例!

内需八个操作数,后面是四个对象变量,前边是八个类名!再次来到叁个布尔值!

var_dump($stu instanceof Stu);     //返回bool(true)

4.__autoload(卡塔尔自动加载类

当调用不设有的类的时候自动调用!

<?php 

/**
* 自动加载类
* 需要什么类__autoload会自动调用需要的文件
*
*/

public function __autoload($class_name)
{
    require_once "../Model/{$class_name}.class.php";
}

 ?>

5.__tostring()

当将对象正是字符串使用的时候自动调用

6.__invoke()

当将目标便是函数使用的时候自动调用

7,__set()

当对不能够访问的品质赋值时自动调用(比如:类向外调拨运输用私有属性)

8.__get()

当对获得不可能访谈的属性值的时候自动调用

9.__unset()

当销毁不能访谈的性质的时候自动调用

10.__isset()

当决断不可能访问的属性是不是留存的时候自动调用

11.__call()

当调用无法访谈的家常方法时自动触发

 

<?php 
class Stu{

    public function __call(){
    echo "error";
    }
}

$stu = new Stu();
//此时Stu类里没有show()方法,会触发__call()函数
$stu->show();

 

12.__callststic()

当不能通过静态方法访谈时自动触发

 

<?php 
class Stu{

    public static function __callstatic(){
        echo "error";
    }
}

$stu = new Stu();
//此时Stu类里没有show()方法,会触发__call()函数
$stu::show();

 

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注