[学习] 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:\n");
print_r($obj);
print("Cloned Object:\n");
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 对象比较
当使用比较运算符(==)比较两个对象变量时,比较的原则是:如果两个对象的属性和属性值 都相等,而且两个对象是同一个类的实例,那么这两个对象变量相等。
而如果使用全等运算符(===),这两个对象变量一定要指向某个类的同一个实例(即同一个对象)。