PHP Class属性调用构造函数

时间:2015-07-29 03:28:36

标签: php class constructor attributes

我写了以下示例类:

100 200 t+60
100 300 t+40
100 200 t+20

您可能已经注意到,我希望类Test的属性$ var成为Test类型的Object。我在Java中轻松地做了同样的事情,作为一个公共静态变量,但是在PHP中它不起作用......对于我正在尝试做的事情有没有其他选择?

2 个答案:

答案 0 :(得分:0)

因为你无法在类变量的定义中设置复杂类型,所以我在PHP中认识到的唯一方法就是使用程序代码(Joke)的魔力。现在重要的是要注意,在文件中存在类,你当然可以这样做。

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的对象或后代对象作为输入。

可能不是最有利的解决方案,但可行的解决方案。你可以做的最后一件事就是确保你真的想让它不被改变就是改变这样的设置器。

    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];
}

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

答案 1 :(得分:0)

您可以通过getter访问WHERE name = @name AND Servicedate>=ISNULL((case when @_from='' then NULL else @_from),Servicedate) 并按需将其初始化:

$var