从自己的方法调用PHP构造函数

时间:2012-06-07 06:23:42

标签: php class methods constructor extends

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

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

class B extends A {
}

在实际实现中,还有其他属性可以区分B类和A类,但两者都应该具有“getClone”方法。如果在类A的对象上调用它,它应该产生另一个类A的对象,如果在类B上调用,它应该产生另一个类B的对象。

当然我可以通过覆盖B类中的“getClone”并将类名硬编码到方法中来实现这一点(即$ newObj = new B($ name)),但它会更好对方法进行一次编码,告诉它实例化一个自己类的对象,无论该类是什么。

PHP会让我这样做吗?

3 个答案:

答案 0 :(得分:4)

您可以使用

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

但是niko的解决方案也有效,对单例模式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;
    }
    
}
?>

答案 1 :(得分: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

答案 2 :(得分:0)

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

但是关于回忆构造函数的直接问题,你应该做的是创建一个init()函数,并将所有__constructor代码放在init()中并让__constructor调用init()