php中常用的一些魔术方法的使用介绍

一、__set和__get

1、__set()方法:这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。这个方法同样不用我们手工去调用,它也可以做成私有的,是在直接设置私有属性值的时候自动调用的,同样属性私有的已经被封装上.

2、__get()方法:这个方法用来获取私有成员属性值的,有一个参数,参数传入你要获取的成员属性的名称,返回获取的属性值,这个方法不用我们手工的去调用,因为我们也可以把这个方法做成私有的方法,是在直接获取私有属性的时候对象自动调用的。

使用方式:

<?php
class Object{
    protected $array = array();	
    function __set($key,$value)
    {
	$this->array[$key] = $value;
    }	
    function __get($key)
    {
	return $this->array[$key];
    }
}
?>

首先我们定义一个Object类,其中包含了两个魔法函数,__set和__get,以及一个叫做$array的数组。

__set方法当该类的一个实例化对象给其中的属性赋值的时候调用。
__get方法当获取该属性值的时候调用,效果如下:

$obj = new Object();
$obj->name = "I'm name";//此时调用__set方法,并且参数中,$key为name,$value为"I'm name";
echo $obj->name; //此时调用__get方法,输出"I'm name"

二、__construct和__destruct

1. 构造函数__construct(),PHP 5 允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。

2. 析构函数__destruct(),PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。析构函数即使在使用 exit() 终止脚本运行时也会被调用。在析构函数中调用 exit() 将会中止其余关闭操作的运行。

<?php
class MyDestructableClass 
{
   function __construct() 
   {
       print "In constructor\n";       $this->name = "MyDestructableClass";
   }   
   function __destruct() 
   {
       print "Destroying " . $this->name . "\n";
   }
}
$obj = new MyDestructableClass();?>

效果如下:

In constructor
Destroying MyDestructableClass

三、__clone() 对象复制调用方法

在多数情况下,我们并不需要完全复制一个对象来获得其中属性。但有一个情况下确实需要:如果你有一个 GTK 窗口对象,该对象持有窗口相关的资源。你可能会想复制一个新的窗口,保持所有属性与原来的窗口相同,但必须是一个新的对象(因为如果不是新的对象,那么一个窗口中的改变就会影响到另一个窗口)。还有一种情况:如果对象 A 中保存着对象 B 的引用,当你复制对象 A 时,你想其中使用的对象不再是对象 B 而是 B 的一个副本,那么你必须得到对象 A 的一个副本。

对象复制可以通过 clone 关键字来完成(如果可能,这将调用对象的 __clone() 方法)。对象中的 __clone() 方法不能被直接调用。

<?php
class SubObject{
    static $instances = 0;
    public $instance;    
    public function __construct() 
    {
        $this->instance = ++self::$instances;
    }    
    public function __clone() 
    {
        $this->instance = ++self::$instances;
    }
}
class MyCloneable{
    public $object1;    
    public $object2;    
    function __clone()
    {
        // 强制复制一份this->object, 否则仍然指向同一个对象
        $this->object1 = clone $this->object1;
    }
}
$obj = new MyCloneable();
$obj->object1 = new SubObject();
$obj->object2 = new SubObject();
$obj2 = clone $obj;print("Original Object:\n");
print_r($obj);print("Cloned Object:\n");
print_r($obj2);
?>

以上例程会输出:

Original Object:
MyCloneable Object
(
    [object1] => SubObject Object
        (
            [instance] => 1
        )

    [object2] => SubObject Object
        (
            [instance] => 2
        )

)
Cloned Object:
MyCloneable Object
(
    [object1] => SubObject Object
        (
            [instance] => 3
        )

    [object2] => SubObject Object
        (
            [instance] => 2
        )

)

点赞