使用相同的超类投射对象

时间:2014-02-12 16:41:57

标签: php oop

假设:

  • class X扩展A
  • Y类延伸A

我有一个类X的对象,并希望创建一个类Y的对象,该对象与通过类A共有的类X的对象(无论是深拷贝还是浅拷贝)共享所有字段。

我可以将类X的对象转换为类Y,或者以其他方式复制它们共有的所有属性吗?

1 个答案:

答案 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来解决这个问题,但是我猜这个时候你得到了你需要的答案。

希望这有帮助。

祝你好运!