2013-12-17 47 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); 
?>