假设:
我有一个类X的对象,并希望创建一个类Y的对象,该对象与通过类A共有的类X的对象(无论是深拷贝还是浅拷贝)共享所有字段。
我可以将类X的对象转换为类Y,或者以其他方式复制它们共有的所有属性吗?
答案 0 :(得分:0)
如果您只是问:我如何轻松创建class Y
的变量,该变量包含变量class A
的{{1}}的所有常见内容?然后我想你会得到一个更快的答案。但是你问了一个关于施法的问题。
Casting是一种“欺骗”编译器(或在本例中为解释器)将一种类型的变量解释为另一种类型的变量的方法。如果你知道自己在做什么,这有时会派上用场。但大多数时候,这是一个坏主意。
投射到对象不是possible in PHP,但如果是,你可以写:
class X
您是否希望PHP认为变量class A {
public $foo = 1;
}
class X extends A {
public $bar = "2";
}
class Y extends A {
public $bom = 3;
}
$x = new X();
$y = (Y) x;
的类型为Y,或者您希望它实际上是Y型?以上将实现第一个,而不是后者。一旦您访问$y
,您的程序执行就会遇到问题,因为没有为$y->bom
分配内存,也没有初始化。在允许其使用的语言中,如c ++,这可能会导致GPF。
因此你不需要施放,你不想施放,你不能施展开始。忘记施法:)
您要做的是创建一些将另一个对象的字段复制到对象实例的方法。这是一个例子:
$bom
此示例中的复制方法是通过分配。但这并不是很灵活,因为这意味着每次添加属性或重命名其中一个类中的属性时,您都必须更新复制方法以反映更改。
这是实现同样目标的更灵活方式:
class A {
public $foo;
public function copy($cA) {
$this->foo = $cA->foo;
}
}
class X extends A {
public $bar;
public function copy($cX) {
if ($cX instanceof A) parent::copy($cX);
if ($cX instanceof X) {
$this->bar = $cX->bar;
}
}
}
class Y extends A {
public $bom;
public function copy($cY) {
if ($cY instanceof A) parent::copy($cY);
if ($cY instanceof Y) {
$this->bom = $cY->bom;
}
}
}
$x = new X();
$x->foo = "hello";
$x->bar = "world";
$otherX = new X();
$otherX->copy($x);
echo "$otherX->foo $otherX->bar \n"; // hello world
$y = new Y();
$y->copy($otherX);
echo "$y->foo \n"; // hello
虽然这种方法更灵活,但也有些粗糙。
class A {
protected $foo;
public function copy($cA) {
foreach (get_object_vars($cA) as $key => $value) {
$this->$key = $value;
}
}
public function setFoo($foo) {
$this->foo = $foo;
}
}
class X extends A {
public $bar;
public function out() {
echo "$this->foo $this->bar \n";
}
}
class Y extends A {
public $bom;
public function out() {
echo "$this->foo $this->bom \n";
}
}
// setup x
$x = new X();
$x->setFoo("hello");
$x->bar = "world";
// setup otherX
$otherX = new X();
$otherX->copy($x);
$x->setFoo("hi");
$otherX->out(); // -> hello world
// setup Y
$y = new Y();
$y->copy($x);
$y->bom = "php";
$y->out(); // -> hi php
这是因为echo $y->bar; // has become "world"
没有查看每个类类型可以具有的变量。你可以在某种程度上使用ReflectionClass来解决这个问题,但是我猜这个时候你得到了你需要的答案。
希望这有帮助。
祝你好运!