ntt*_*lor 6 php methods constructor extends class
我一直在寻找一种方法来调用类的构造函数,该构造函数类似于“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 {
}
Run Code Online (Sandbox Code Playgroud)
在实际实现中,还有其他属性可以区分 B 类和 A 类,但两者都应该有“getClone”方法。如果在类 A 的对象上调用它应该产生类 A 的另一个对象,如果在类 B 上调用它应该产生类 B 的另一个对象。
当然,我可以通过覆盖 B 类中的“getClone”并将类名硬编码到方法中来做到这一点(即,$newObj = new B($name)),但只对方法进行编码会好得多一次,告诉它实例化它自己的类的一个对象,不管那个类是什么。
PHP 会让我这样做吗?
您可以使用
\n\n $clsName = get_class($this);\n return new $clsName();\nRun Code Online (Sandbox Code Playgroud)\n\n但 niko 的解决方案也有效,对于单例模式很有用http://php.net/manual/en/language.oop5.static.php
\n\n从 php 5.3 开始,您可以使用关键字的新功能static。
<?php\n\nabstract class Singleton {\n\n\xc2\xa0\xc2\xa0\xc2\xa0 protected static $_instance = NULL;\n\n\xc2\xa0\xc2\xa0\xc2\xa0 /**\n\xc2\xa0\xc2\xa0 \xc2\xa0 * Prevent direct object creation\n\xc2\xa0\xc2\xa0 \xc2\xa0 */\n\xc2\xa0\xc2\xa0\xc2\xa0 final private function\xc2\xa0 __construct() { }\n\n\xc2\xa0\xc2\xa0\xc2\xa0 /**\n\xc2\xa0\xc2\xa0 \xc2\xa0 * Prevent object cloning\n\xc2\xa0\xc2\xa0 \xc2\xa0 */\n\xc2\xa0\xc2\xa0\xc2\xa0 final private function\xc2\xa0 __clone() { }\n\n\xc2\xa0\xc2\xa0\xc2\xa0 /**\n\xc2\xa0\xc2\xa0 \xc2\xa0 * Returns new or existing Singleton instance\n\xc2\xa0\xc2\xa0 \xc2\xa0 * @return Singleton\n\xc2\xa0\xc2\xa0 \xc2\xa0 */\n\xc2\xa0\xc2\xa0\xc2\xa0 final public static function getInstance(){\n\xc2\xa0\xc2\xa0 \xc2\xa0 \xc2\xa0\xc2\xa0 if( static::$_instance == null){\n static::$_instance = new static();\n\xc2\xa0\xc2\xa0 \xc2\xa0 \xc2\xa0\xc2\xa0 }\n\xc2\xa0\xc2\xa0 \xc2\xa0 \xc2\xa0\xc2\xa0 return static::$_instance;\n\xc2\xa0\xc2\xa0\xc2\xa0 }\n\xc2\xa0\xc2\xa0\xc2\xa0 \n}\n?>\nRun Code Online (Sandbox Code Playgroud)\n