2013-12-17 43 views
0

的擴展版本,我有2類,其中一人伸出另一:PHP複製變量

class a{ 
    private $name; 
    public function __construct(){ 

    } 
    public function get($v){ 
     $this->name=$v; 
    } 
} 
class b extends a{ 
    public $user; 
} 

在我創建一個對象頁面的頂部:

$a=new a(); 
$a->get(1234); 

,然後我從課堂b創建另一個對象。

$b=new b(); 

,但我想的$一個$所有當前變量複製b。所以class $ b將具有變量$ name具有值。

我該怎麼做?

+0

b類取決於a類。因此,類b應該有一個方法作爲輸入。如果你想複製所有的屬性(我質疑這一點),請看['get_object_vars()'](http://php.net/get_object_vars) –

+0

所有「class a」變量都存在於「class b」上。我只是將對象$ a的當前變量狀態複製到$ b。並通過get_object_vars我不能得到私人。並且由於安全性,我不想更改對象類型! – Hossein

+0

除非你有一個getter,否則你不能讀取子類中的'$ name',因爲'$ name'是私有的。 – h2ooooooo

回答

0

將一個構造函數添加到b需要參數類型爲a

class b extends a{ 
    public $user; 

    function __construct(a $a) 
    { 
     parent::__construct($a.name); 
    } 
} 
+0

我認爲它會工作!但我不熟悉物體。你可以通過像copyVars()這樣的其他方法來做到嗎? 這種方式將適用於私有變量? thanx :) – Hossein

+0

不使用'private'關鍵字,而是使用'protected'關鍵字。這樣,所有從'a'延伸出來的孩子或班級都可以訪問該成員。 – afuzzyllama

+0

非常感謝。它正在工作。 – Hossein

1

有很好的理由不這樣做..

然而 - 一些黑客與序列化/反序列化可以使類的一個實例B級

function copyDown($obj, $newInstance) { 
    $data = serialize($obj); 
    $newData = preg_replace('~(^O:[0-9]+:)"([^"]+")~', '$1"' . $newInstance . '"', $data); 
    return unserialize($newData); 
} 

$a = new ClassA(); 
$b = copyDown($a, 'ClassB'); 

但要知道,ClassB的應該繼承自ClassA

+0

[這是這個工作的演示](https://eval.in/80405)。OP:認真 - 有*有很好的理由不這樣做,所以請.. ..認爲*。 – h2ooooooo

+0

謝謝。但我認爲這不安全! – Hossein

+0

爲什麼?只要你不弄亂你的代碼,這個小小的「演員」完美的工作 - 也許它不是那麼快.. btw:http://www.adaniels.nl/articles/a-dark-corner-of-php -class-casting/comment-page-1/ – Philipp

0

我認爲如果通過傳遞值來創建類b的對象,那麼您可以訪問類b中的類a的變量,因爲類b正在擴展類a。

<?php 
class a { 
    private $name; 

    public function __construct($v){ 
     $this->name=$v; 
    } 
} 
class b extends a { 
    public $user; 
} 

$b = new b(1234); 

var_dump($b); 
?>