如果我有一个只有静态方法的类,那么在该类中初始化构造函数的最佳方法是什么,例如:
Class Example {
public function __construct(){
/*code here*/
}
public static function method1()
/*code here*/
}
public static function method2() {
/*code here*/
}
}
Example::method1();
构造函数没有启动,最好的方法是什么?
答案 0 :(得分:1)
您可以将您的班级称为单身人士:
class myClass
{
private static $_instance;
/**
* Constructor
*/
private function __construct()
{
// Construct
}
/**
* Returns itself
*
* @return self
*/
public static function getInstance()
{
if (!self::$_instance) {
self::$_instance = new myClass();
}
return self::$_instance;
}
}
称之为: $ myClass = myClass :: getInstance();
答案 1 :(得分:0)
由于该类只有静态方法,因此不需要__construct
。将其声明为私有,以防止用作new Example
private function __construct(){
/*code here*/
}
关键是静态方法不应该有状态,因此您不必进行初始化。
答案 2 :(得分:0)
使用new
关键字时会调用构造函数!
不是在调用静态方法时
答案 3 :(得分:0)
以下是示例代码。
Class Example {
public function __construct(){
/*code here*/
}
public static function method1()
/*code here*/
}
public static function method2() {
/*code here*/
}
}
$obj = new Example(); // Write this way or as below line
$obj = new Example; // I think first one is better, to initiate the construct function
$result = $obj->method1();
答案 4 :(得分:0)
您可以创建类的新实例并像这样调用静态方法:
$example = new Example();
$example->method1();
要调用构造函数。 但由于这些方法是静态的,因此您可以在没有类实例的情况下调用它们:
Example::method1();
答案 5 :(得分:0)
尽管整个解决方案都很糟糕,但您可以使用私有静态方法,该方法在彼此的公共静态方法中调用。
这不是构造函数,通常是因为构造函数用于构造和对象,而在静态上下文中没有构造函数。
因此,为了在每次静态调用后触发一个通用功能,您可以使用:
class Example {
private static function common() {
echo 'called';
}
public static function method1() {
self::common();
echo "</br> method1;";
}
public static function method2() {
self::common();
echo "</br> method2;";
}
}
Example::method2();
结果为
called
method2;
您还可以将对象构建为静态方法
class Example {
private function __construct() {
echo 'contructor called';
}
public static function method1() {
$self = new self();
echo "</br> method1;";
}
public static function method2() {
$self = new self();
echo "</br> method2;";
}
}
Example::method1();
结果:
contructor called
method1;
这里的问题是每个方法都可以构造函数的新实例。
您可以按照建议使用Singleton模式,以便在所有静态方法中拥有该类的共享实例。
class Example {
private static $_inst = null;
private $_x = 0;
private function __construct() {
echo 'contructor called';
}
private static function getInstance() {
if(self::$_inst == null) {
self::$_inst = new self();
}
return self::$_inst;
}
public static function method1() {
self::getInstance();
self::getInstance()->_x = 100;
echo "</br> method1;";
}
public static function method2() {
self::getInstance();
echo self::getInstance()->_x;
echo "</br> method2;";
}
}
Example::method1();
Example::method2();
这将导致:
contructor called
method1;100
method2;
因此,在调用$_x
时会保存实例变量method2()
的值,但第二次不会调用构造函数,因为您可以看到结果中只有一个contructor called
。
而且,重复一遍,这整个想法都很可怕。