2016-08-11 63 views
0

這裏是我的情況:
我有一個類被其他十幾個人繼承,在這個類中我有一個複製方法,它返回它自己的副本。
我可以在繼承類中使用此方法,但顯然,該方法始終返回超類的實例,而不是從其繼承的實例。

我想我的複製方法返回ihneriting類的實例。
PHP - 可繼承的複製方法

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

爲什麼不你使用'clone'? – PeeHaa

+0

然後你需要在'User'類中繼承copy()方法並在那裏添加你的邏輯。 –

+1

'$ copy = new get_class($ this)'試試這個而不是'$ copy = new BaseEntity();' – ineersa

回答

1

還有一個實現方式你想要什麼:

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

最後在我的情況下,我寧願使用這個比__clone()重載。 – aurelienC

1

我看到這樣的方法有兩種:

  1. 使用clone - 這會讓使用static你的對象
  2. 的淺表副本創建一個新的對象

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

結果:https://3v4l.org/2naQI

+0

你能告訴我更多關於'return new static'嗎? – aurelienC

+0

TL; DR後期靜態綁定 - https://secure.php.net/manual/en/language.oop5.late-static-bindings.php PHP文檔描述得相當好:) – radmen

+0

我看不到如何使用'返回新的靜態'做一個副本,因爲它只是返回一個新的副本被調用的類的實例。 – aurelienC