教程 > php教程 > 阅读:28

php 对象复制与比较——迹忆客-ag捕鱼王app官网


对象复制

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

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

$copy_of_object = clone $object;

当对象被复制后,php 5 会对对象的所有属性执行一个浅复制(shallow copy)。所有的引用属性 仍然会是一个指向原来的变量的引用。

__clone ( ) : void

当复制完成时,如果定义了 __clone() 方法,则新创建的对象(复制生成的对象)中的 __clone() 方法会被调用,可用于修改属性的值(如果有必要的话)。

示例

复制一个对象

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
        )
)

对象比较

php 5 中的对象比较要比 php 4 中复杂,所期望的结果更符合一个面向对象语言。

当使用比较运算符(==)比较两个对象变量时,比较的原则是:如果两个对象的属性和属性值 都相等,而且两个对象是同一个类的实例,那么这两个对象变量相等。

而如果使用全等运算符(===),这两个对象变量一定要指向某个类的同一个实例(即同一个对象)。

通过下面的示例可以理解以上原则。

示例

php 5 的对象比较

flag = $flag;
    }
}
class otherflag
{
    public $flag;
    function otherflag($flag = true) {
        $this->flag = $flag;
    }
}
$o = new flag();
$p = new flag();
$q = $o;
$r = new otherflag();
echo "two instances of the same class\n";
compareobjects($o, $p);
echo "\ntwo references to the same instance\n";
compareobjects($o, $q);
echo "\ninstances of two different classes\n";
compareobjects($o, $r);
?>

以上程序会输出:

two instances of the same class
o1 == o2 : true
o1 != o2 : false
o1 === o2 : false
o1 !== o2 : true
two references to the same instance
o1 == o2 : true
o1 != o2 : false
o1 === o2 : true
o1 !== o2 : false
instances of two different classes
o1 == o2 : false
o1 != o2 : true
o1 === o2 : false
o1 !== o2 : true

注意:php 扩展中可以自行定义对象比较的原则。

查看笔记

扫码一下
查看教程更方便
网站地图