2016-08-11 3 views
0

Hier ist meine Situation:
Ich habe eine Klasse, die von einem Dutzend anderer geerbt wird, in dieser Klasse habe ich eine Kopiermethode, die eine Kopie von sich selbst zurückgibt.
Ich kann diese Methode in der Vererbungsklasse verwenden, aber offensichtlich liefert die Methode immer eine Instanz der Superklasse, nicht die, die von ihr erbt.

Ich möchte, dass meine Kopiermethode eine Instanz der ihneriting-Klasse zurückgibt.
PHP - Vererbbare Kopiermethode

BaseEntity.php:

class BaseEntity 
{ 
    protected $id; 
    protected $name; 
    protected $active; 
    protected $deleted; 

    // ... 

    public function copy() 
    { 
     $copy = new BaseEntity(); 

     $copy->id = $this->id; 
     $copy->name = $this->name; 
     $copy->active = $this->active; 
     $copy->deleted = $this->deleted; 

     return $copy; 
    } 
} 

User.php:

class User extends BaseEntity 
{ 
    // ... 
    // Properties are the same as BaseEntity, there is just more methods. 
} 
+2

Warum nicht verwendest du 'clone'? – PeeHaa

+0

Dann müssen Sie die Methode copy() in der Klasse "User" erben und dort Ihre Logik hinzufügen. –

+1

'$ copy = new get_class ($ this)' probiere das anstelle von '$ copy = new BaseEntity();' – ineersa

Antwort

1

Eine weitere Möglichkeit, zu erreichen Was Sie wollen:

<?php 
class BaseEntity 
{ 
    protected $id; 

    public function copy() 
    { 
     $classname = get_class($this); 
     $copy = new $classname; 

     return $copy; 
    } 
} 
class Test extends BaseEntity 
{ 

} 

$test = new Test; 
$item = $test->copy(); 
var_dump($item); // object(Test) 
+0

Irgendwann in meiner Situation verwende ich lieber diese als die __clone() Überladung. – aurelienC

1

Ich sehe zwei Möglichkeiten dies zu tun:

  1. clone mit - es wird eine flache Kopie des Objekts macht
  2. mit static für ein neues Objekt erstellen

    <?php 
    
    class BaseEntity { 
        public function copy() { 
         return new static; 
        } 
    } 
    
    class User extends BaseEntity { 
    
    } 
    
    $user = new User; 
    var_dump($user->copy()); 
    

Ergebnis dieses Code: https://3v4l.org/2naQI

+0

Kannst du mir etwas mehr über diese 'return new static' sagen? – aurelienC

+0

TL; DR Späte statische Bindung - https://secure.php.net/manual/en/language.oop5.late-static-bindings.php PHP-Dokumente beschreiben es ziemlich gut :) – radmen

+0

Ich sehe nicht, wie zu verwenden 'return new static', um eine Kopie zu erstellen, da es nur eine neue Instanz der Klasse zurückgibt, an der die Kopie aufgerufen wird. – aurelienC