PHP中常用的魔术方法

下面我将对PHP所有的魔术方法进行介绍说明。其实下面的大多数方法,对于一个合格的PHP程序员来说,都是很熟悉的东西了。我在这里作个总结,自己作个记录学习,同时也给还未熟悉这些方法的同学们做个介绍。如有疏漏和错误,希望各位能指出。下面所提到的,大多数是PHP5所增加的魔术方法,少部分在PHP4里就已经存在,少部分则是PHP5.1.0之后才出现的,这个在下面我将会提到。

我们在PHP中经常用到魔术方法,像构造方法,析构方法等等魔术变量,下面总结一下一些常用的魔术变量:

__construct()和__destruct()构造函数__construct()和析构函数__destruct(),这两个不用我多说了吧,是个程序员都知道。__construct()会在实例创建的时候被调用,__destruct()在实例销毁的时候被调用。需要注意的时候,即使你不显式地调用unset去销毁一个实例,它也会在脚本运行结束的时候被销毁。这两个方法都可以传递0个或者多个参数。

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

?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();

 

 

 

 

发表评论

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