1
<?php

    class A{

     //many properties
     protected $myProperty1;
     protected $myProperty2;
     protected $myProperty3; 

     public function __construct(){
      $this->myProperty1='some value';
      $this->myProperty2='some value';
      $this->myProperty3='some value';
     }

     public function getProperty1(){
      return $this->myProperty1;
     }
     public function getProperty2(){
      return $this->myProperty2;
     }
     public function getProperty3(){
      return $this->myProperty3;
     }

     //edited: I added some setters, meaning that the object returned from the functions may already have these properties altered

     public function setProperty1($p){
      $this->myProperty1=$p;
     }
     public function setProperty2($p){
      $this->myProperty2=$p;
     }
     public function setProperty3($p){
      $this->myProperty3=$p;
     }


    }

    class B extends A{

     private $myProperty4;

     public function __construct(A $a){
      $this=$a; //this line has error,it says $this cannot be re-assigned
      $this->myProperty4='some value';
     }

     public function getProperty4(){
      return $this->myProperty4;
     }   
    }

   //$a = new A();
   $a = someClass::getAById(1234); //edited: $a is returned by a function (I cannot modify it)
   $b= new B($a); //error

?>

我想通过将 A 的对象传递给 B 的构造函数来创建 B 的对象,如您所见,我无法重新分配 $this 变量。我不允许修改A类,当A中有很多属性时,我在B的构造函数中做这样的事情会很乏味:

 public function __construct(A $a){

  parent::__construct();
  $this->myProperty1=$a->getProperty1(); 
  $this->myProperty2=$a->getProperty2();
  $this->myProperty3=$a->getProperty3();

  $this->myProperty4='some value';

 }

我的问题是,如何使用 A 的对象以最少的编码安全地创建 B 类的对象?

4

2 回答 2

3
class A
{
  public $property = 'Foobar';
}

class B extends A
{
  public function __construct()
  {
    echo $this->property; // Foobar
  }
}

我错过了什么吗?听起来您正试图强迫 OOP 做一些它不打算做的事情,或者您在理解继承时遇到了困难。

类 A 中的每个公共或受保护方法和属性在类 B 中都可用。通过直接引用它(如我的示例中所示)或使用 parent:: 语法。

编辑

(作者澄清问题)

如果 A 类的属性是可访问的,您可以使用以下内容将它们复制到 B 类

class B
{
  public function __construct()
  {
    $a = new A(); // Or however A is instantiated
    foreach(get_object_vars($a) as $key => $value)
    {
      $this->$key = $value;
    }
  }
}
于 2009-10-26T16:48:35.120 回答
0

既然 B 扩展了 A,为什么不直接创建 B 开始呢?如果您需要初始化一些额外的属性,您可以像这样覆盖构造函数:

class B extends A {
    public function __construct(){
      parent::__construct(); //calls A's constructor
      $this->Bproperty='somevalue';
    }

}

如果这还不够好,那么您可能需要查看反射。

于 2009-10-26T16:49:26.240 回答