我写了下面的例子类:
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()
的方法,一旦它有了一个值,它总是返回不假,所以它不会改变后。
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;
}