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

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 会让我这样做吗?

Jua*_*des 4

您可以使用

\n\n
 $clsName = get_class($this);\n return new $clsName();\n
Run Code Online (Sandbox Code Playgroud)\n\n

但 niko 的解决方案也有效,对于单例模式很有用http://php.net/manual/en/language.oop5.static.php

\n\n

从 php 5.3 开始,您可以使用关键字的新功能static

\n\n
<?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?>\n
Run Code Online (Sandbox Code Playgroud)\n