因为您不能在类变量的定义中设置复杂类型,所以我认为在 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];
}
它是一个很棒的数据库类,只是说。