php - 启动构造函数

时间:2014-04-25 07:36:30

标签: php

如果我有一个只有静态方法的类,那么在该类中初始化构造函数的最佳方法是什么,例如:

Class Example {
    public function __construct(){
        /*code here*/
    }
    public static function method1()
        /*code here*/
    }
    public static function method2() {
        /*code here*/
    }
}

Example::method1();

构造函数没有启动,最好的方法是什么?

6 个答案:

答案 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

而且,重复一遍,这整个想法都很可怕。