如何复制另一个 class 的对象?
How can I copy an object of another class?
我有一个 class 延伸到另一个。
Class 测试
class Test
{
private $id;
private $name;
private $age;
private $number;
public function getId() {
return $this->id;
}
public function setId($id) {
$this->id = $id;
return $this;
}
public function getName() {
return $this->name;
}
public function setName($name) {
$this->name = $name;
return $this;
}
public function getAge() {
return $this->age;
}
public function setAge($age) {
$this->age = $age;
return $this;
}
public function getNumber() {
return $this->number;
}
public function setNumber($number) {
$this->number = $number;
return $this;
}
}
Class 测试复制
use Test;
class TestCopy extends Text
{
}
然后我有一个 class 测试的对象:
$object = new Test();
$object->setId = 1;
$object->setName = Tom;
$object->setAge = 20;
$object->setNumber = 10;
如何创建 class TestCopy 的对象(将具有相同的属性),并克隆对象 $object 的所有值?
我试过克隆:
$objectCopy = clone $object;
但是对象 $objectCopy 必须实例化 class TestCopy,当我克隆时,它实例化 class Test。
我也试过:
foreach (get_object_vars($object) as $key => $name) {
$objectCopy->$key = $name;
}
但是属性是私有的,当我调用函数时 get_object_vars 它 returns 为空。
任何的想法?非常感谢!
试试这个,一旦你实例化了一个对象,你就不能改变class(或其他实现细节)
你可以这样模拟:
<?php
class Test
{
private $id;
private $name;
private $age;
private $number;
public function getId() {
return $this->id;
}
public function setId($id) {
$this->id = $id;
return $this;
}
public function getName() {
return $this->name;
}
public function setName($name) {
$this->name = $name;
return $this;
}
public function getAge() {
return $this->age;
}
public function setAge($age) {
$this->age = $age;
return $this;
}
public function getNumber() {
return $this->number;
}
public function setNumber($number) {
$this->number = $number;
return $this;
}
public function toArray()
{
return get_object_vars($this);
}
}
class TestCopy extends Test
{
public $fakeAttribute;
}
function getTestCopy($object)
{
$copy = new TestCopy();
foreach($object->toArray() as $key => $value) {
if(method_exists($copy, 'set'.ucfirst($key))) {
$copy->{'set'.ucfirst($key)}($value);
}
}
return $copy;
}
$object = new Test();
$object->setId(1);
$object->setName('Tom');
$object->setAge(20);
$object->setNumber(10);
$copy = getTestCopy($object);
$copy->fakeAttribute = 'fake value';
echo "<pre>";
print_r($object->toArray());
print_r($copy->toArray());
输出:
Array
(
[id] => 1
[name] => Tom
[age] => 20
[number] => 10
)
Array
(
[fakeAttribute] => fake value
[id] => 1
[name] => Tom
[age] => 20
[number] => 10
)
我有一个 class 延伸到另一个。
Class 测试
class Test
{
private $id;
private $name;
private $age;
private $number;
public function getId() {
return $this->id;
}
public function setId($id) {
$this->id = $id;
return $this;
}
public function getName() {
return $this->name;
}
public function setName($name) {
$this->name = $name;
return $this;
}
public function getAge() {
return $this->age;
}
public function setAge($age) {
$this->age = $age;
return $this;
}
public function getNumber() {
return $this->number;
}
public function setNumber($number) {
$this->number = $number;
return $this;
}
}
Class 测试复制
use Test;
class TestCopy extends Text
{
}
然后我有一个 class 测试的对象:
$object = new Test();
$object->setId = 1;
$object->setName = Tom;
$object->setAge = 20;
$object->setNumber = 10;
如何创建 class TestCopy 的对象(将具有相同的属性),并克隆对象 $object 的所有值?
我试过克隆:
$objectCopy = clone $object;
但是对象 $objectCopy 必须实例化 class TestCopy,当我克隆时,它实例化 class Test。
我也试过:
foreach (get_object_vars($object) as $key => $name) {
$objectCopy->$key = $name;
}
但是属性是私有的,当我调用函数时 get_object_vars 它 returns 为空。 任何的想法?非常感谢!
试试这个,一旦你实例化了一个对象,你就不能改变class(或其他实现细节)
你可以这样模拟:
<?php
class Test
{
private $id;
private $name;
private $age;
private $number;
public function getId() {
return $this->id;
}
public function setId($id) {
$this->id = $id;
return $this;
}
public function getName() {
return $this->name;
}
public function setName($name) {
$this->name = $name;
return $this;
}
public function getAge() {
return $this->age;
}
public function setAge($age) {
$this->age = $age;
return $this;
}
public function getNumber() {
return $this->number;
}
public function setNumber($number) {
$this->number = $number;
return $this;
}
public function toArray()
{
return get_object_vars($this);
}
}
class TestCopy extends Test
{
public $fakeAttribute;
}
function getTestCopy($object)
{
$copy = new TestCopy();
foreach($object->toArray() as $key => $value) {
if(method_exists($copy, 'set'.ucfirst($key))) {
$copy->{'set'.ucfirst($key)}($value);
}
}
return $copy;
}
$object = new Test();
$object->setId(1);
$object->setName('Tom');
$object->setAge(20);
$object->setNumber(10);
$copy = getTestCopy($object);
$copy->fakeAttribute = 'fake value';
echo "<pre>";
print_r($object->toArray());
print_r($copy->toArray());
输出:
Array
(
[id] => 1
[name] => Tom
[age] => 20
[number] => 10
)
Array
(
[fakeAttribute] => fake value
[id] => 1
[name] => Tom
[age] => 20
[number] => 10
)