PHP类属性调用构造函数


PHP Class attribute call constructor

我写了下面的例子类:

class Test {
    public $baseSymbol;
    public $counterSymbol;
    public function __construct($baseSymbol,$counterSymbol) {
        $this->baseSymbol = $baseSymbol;
        $this->counterSymbol = $counterSymbol;
    }
    public static $var = new Test("CV", "SWR");
}

正如您可能注意到的,我希望类Test的属性$var成为Test类型的Object。我在Java中轻松地做了同样的事情,作为公共静态变量,但在PHP中它不起作用…我想做的事还有别的选择吗?

因为不能在类变量的定义中设置复杂类型,所以我认为在PHP中做到这一点的唯一方法是使用过程代码的魔力(笑话)。现在需要注意的是,在类存在的文件中,您当然可以这样做。

class Test {
    public $baseSymbol;
    public $counterSymbol;
    protected static $var;

    public function __construct($baseSymbol,$counterSymbol) {
        $this->baseSymbol = $baseSymbol;
        $this->counterSymbol = $counterSymbol;
    }
    public static setVar(Test $var ){
        self::$var = $var;
    }
}
Test::setVar( new Test() );

这是非常标准的做法,但正如上面提到的,通过将设置代码放在类中,当文件被加载时,设置立即完成,并在执行其他操作之前预加载类实例。

这只是未预编译的结果。当类被加载时,并不能保证所需要的复杂对象存在,因此PHP对其进行安全处理并限制这种能力。

我确实将变量更改为protected以保持它的封装,这当然是可选的。我还添加了类型转换,这将确保只使用Test的对象或后代对象作为输入。

可能不是最有利的解决方案,但会起作用。你还可以做最后一件事来确保如果你真的想让它不被改变,那就是像这样改变setter。

    public static setVar(){
        if( !self::$var ){
           self::$var = new Test();
        }
    }

这样你只需调用Test::setVar()的方法,一旦它有了一个值,它总是返回不假,所以它不会改变后。

最后一点,如果你真的想要一个类本身的副本,这是一个带有自己的静态实例的Test类(像单例),那么这样做而不是使用名称
   public static setVar(){
        if( !self::$var ){
           self::$var = new self;
        }
    }

现在把它包装成一个单例,你可以这样做:

final class Test {
    public $baseSymbol;
    public $counterSymbol;
    protected static $var;
    //no constuction
    private function __construct($baseSymbol,$counterSymbol) {
        $this->baseSymbol = $baseSymbol;
        $this->counterSymbol = $counterSymbol;
    }
    //no cloning
    private function __clone(){}
    public static getInstance(){
        if( !self::$var ){
          self::$var = new self('%', '#');
        }
        return self::$var
    }
}
$Test = Test::getInstance();

在这里我漫谈了一下,现在考虑将实例保存在一个带有键的数组中。然后你就可以有一个Multiton(这是一个东西吗?)

;
public static getInstance($type, $baseSymbol,$counterSymbol){
    if( !isset(self::$var[$type] )){
       self::$var[$type] = new self($baseSymbol, $counterSymbol);
    }
    return self::$var[$type];
}

它是一个很棒的数据库类,只是说。

您可以通过getter访问$var并在需要时初始化它:

private static $var;
public static function getVar() 
{
    if (null === self::$var) {
        self::$var = new Whatever();
    }
    return self::$var;
}