2012-06-07 28 views
3

我一直在寻找一种方法来调用类的构造函数,类似于“parent :: _ 构造”,但对于类本身(类似于“self :: _construct “,尽管这不起作用)。为什么要这样做?考虑以下(不工作,顺便说一句)...从自己的方法调用PHP构造函数

class A { 
    var $name; 
    function __construct($name) { 
    $this->name = $name; 
    } 
    function getClone($name) { 
    $newObj = self::__construct($name); 
    return $newObj; 
    } 
} 

class B extends A { 
} 

在真正实施还有将从A级区分B类其他属性,但两者都应该有“getClone”的方法。如果对类A的对象进行调用,它应该产生类A的另一个对象,并且如果在类B上调用它应该产生类B的另一个对象。

当然,我可以通过在类中重写“getClone” B中,并将类名硬编码到方法中(即$ newObj = new B($ name)),但只需编写一次方法,告诉它实例化它自己的类的一个对象,那个班可能是。

PHP会让我这样做吗?

+0

我不应该以任何方式调用我的方法“getClone”或暗示克隆。新对象可能与其调用该方法的对象非常不同,并且不应复制其祖先的内部数据。所以我不认为内置的克隆适合我。 – nttaylor

+0

同样,我不认为“init()”有助于bc我仍然需要从方法内部生成并返回一个新的obj,唯一的方法是使用构造函数。否则会爱。我想我很惊讶没有相当于“父母”意味着“自我”。 – nttaylor

+0

有一个等价物,它可以是“self”或“static”,具体取决于您的需要。 – Niko

回答

4

您可以使用

$clsName = get_class($this); 
return new $clsName(); 

但尼科的解决方案也适用,有用的单例模式http://php.net/manual/en/language.oop5.static.php

与PHP 5.3开始,你可以使用static关键字的新功能。

<?php 

abstract class Singleton { 

    protected static $_instance = NULL; 

    /** 
     * Prevent direct object creation 
     */ 
    final private function  __construct() { } 

    /** 
     * Prevent object cloning 
     */ 
    final private function  __clone() { } 

    /** 
     * Returns new or existing Singleton instance 
     * @return Singleton 
     */ 
    final public static function getInstance(){ 
        if(static::$_instance == null){ 
      static::$_instance = new static(); 
        } 
        return static::$_instance; 
    } 
    
} 
?> 
+0

谢谢! $ clsName = get_class($ this)为我做了诡计! – nttaylor

0

你想要做的是使用内置的对象克隆功能http://php.net/manual/en/language.oop5.cloning.php

但你对召回的构造直接的问题,你应该做的是让一个init()函数,并把所有的__constructor代码在init()中有__constructor调用init()

+0

谢谢你的回答,但我不确定这是我需要的。 PLS。看到我上面的新评论。 – nttaylor

2

您不仅可以使用变量,还可以使用特殊的与类相关的关键字,例如“self”或“static”来创建新实例:$newObj = new static($name); - 这将创建一个新的当前类的实例。

您应该考虑使用内置支持克隆对象:$copy = clone $instance; - 您可以通过指定魔术方法__clone()轻松地将该运算符的行为扩展到您的类的实例上。

class A { 
    var $name; 
    function __construct($name) { 
    $this->name = $name; 
    } 
    function getClone($name) { 
    $newObj = new static($name); 
    return $newObj; 
    } 
} 

class B extends A { 
} 

$tmp = new A('foo'); 
$a = $tmp->getClone('bar'); 
// $a instanceof A => true, $a instanceof B => false 

$tmp = new B('foo'); 
$b = $tmp->getClone('bar'); 
// $b instanceof A => true, $b instanceof B => true 
相关问题