[学习] php对象

php对象

php里需要通过类来创建对象,每一个对象都有对应的类。

php 对象clone

对象clone的语法:

$copy_of_object = clone $object;

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

例子:

// php 版本5.6.9
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(); // 类SubObject的构造函数调用,$instances为1,$instance为1
$obj->object2 = new SubObject(); // 类SubObject的构造函数调用,$instances为2,$instance为2

$obj2 = clone $obj; // MyCloneable类的__clone执行,__clone()内部又clone了SubObject的实例$object1,所以SubObject的__clone()执行,此时SubObject类的$instances为3,$obj2->object1的$instance为3。


print("Original Object:
");
print_r($obj);

print("Cloned Object:
");
print_r($obj2);

上面例子中$obj2->object2为引用属性,和$obj->object2指向同一个对象。

$obj2->object2->instance = 100;
print_r($obj); // $obj->object2->instance的值也变成了100

数组不是引用赋值,这点与js不同:

// php 版本5.6.9
// php 官方手册评论区的例子
class MyClass {

    private $myArray = array();
    function pushSomethingToArray($var) {
        array_push($this->myArray, $var);
    }
    function getArray() {
        return $this->myArray;
    }

}

//push some values to the myArray of Mainclass
$myObj = new MyClass();
$myObj->pushSomethingToArray('blue');
$myObj->pushSomethingToArray('orange');
$myObjClone = clone $myObj;
$myObj->pushSomethingToArray('pink');

//testing
print_r($myObj->getArray());     //Array([0] => blue,[1] => orange,[2] => pink)
print_r($myObjClone->getArray());//Array([0] => blue,[1] => orange)
//so array  cloned

上面例子中clone对象的同时,值为数组的属性也clone了。

php 对象比较

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

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

原文地址:https://www.cnblogs.com/fogwind/p/15204442.html