Frage

<?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

?>

Ich möchte ein B-Objekt erstellen, indem ein A des Objekts zu B Konstruktor übergeben, wie Sie sehen können, kann ich nicht neu zuweisen, die $ diese Variable. Ich bin nicht zu ändern Klasse A erlaubt, wenn es viele Eigenschaften in A sind, wäre es langweilig für mich, Dinge wie diese in B Konstruktor zu tun:

 public function __construct(A $a){

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

  $this->myProperty4='some value';

 }

Meine Frage ist, dass, wie kann ich sicher ein Objekt der Klasse B erstellen mit Hilfe eines A des Objekts mit einem minimalen Menge an Codierung?

War es hilfreich?

Lösung

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

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

Bin ich etwas fehlt? Es klingt wie Sie versuchen, OOP zu zwingen, etwas zu tun, ist es nicht zu tun beabsichtigt, oder Sie Probleme Erbe zu verstehen.

Jede öffentliche oder geschützte Methode und Eigenschaft von Klasse A ist direkt in der Klasse B. Entweder verfügbar durch Referenzierung (wie in meinem Beispiel) oder mithilfe der parent :: Syntax.

EDIT

(Autor geklärt Frage)

Wenn die Klasse A die Eigenschaften zugänglich sind, können Sie sie so etwas wie die folgenden kopieren bis zu Klasse B verwenden könnten

class B
{
  public function __construct()
  {
    $a = new A(); // Or however A is instantiated
    foreach(get_object_vars($a) as $key => $value)
    {
      $this->$key = $value;
    }
  }
}

Andere Tipps

Da B A erstreckt, warum nicht nur B erstellen zu beginnen? Wenn Sie einige zusätzliche Eigenschaften initialisieren müssen, können Sie over-ride den Konstruktor wie folgt aus:

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

}

Wenn das nicht gut genug ist, dann mögen Sie vielleicht bei Reflexion suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top