我一直在寻找一种方法来调用类的构造函数,类似于“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会让我这样做吗?
答案 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()