【问题标题】:PHP Class attribute call constructorPHP Class 属性调用构造函数
【发布时间】:2015-07-29 03:28:36
【问题描述】:

我编写了以下示例类:

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 中它不起作用......我想要做的事情有什么替代方法吗?

【问题讨论】:

  • 它是否特别需要是一个对象
  • 是的@ArtisiticPhoenix,这在 PHP 中可行吗?
  • 绕道。
  • 你显然不能创建定义类变量的类。运行时编译的后果。

标签: php class constructor attributes


【解决方案1】:

因为您不能在类变量的定义中设置复杂类型,所以我认为在 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];
}

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

【讨论】:

    【解决方案2】:

    您可以通过 getter 访问 $var 并按需对其进行初始化:

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

    【讨论】:

      猜你喜欢
      • 2021-12-15
      • 2022-01-21
      • 1970-01-01
      • 2021-03-07
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 2016-08-29
      • 2022-12-16
      相关资源
      最近更新 更多