【问题标题】:Setting a static variable to a function php class将静态变量设置为函数 php 类
【发布时间】:2020-10-12 15:52:10
【问题描述】:

我想将我的静态变量的值设置为一个函数。但是 __construct 永远不会与静态调用一起运行。那么我可以做些什么来设置这个变量,以便我可以在课堂上多次重复使用它呢?

function sayhey(){
    return 'hey';   
};

// my class i do control
class Class1 {

    private static $myvar;
    
    public function __construct(){
        self::$myvar = sayhey();
    }
    
    public static function func1(){
        echo '<pre>'; print_r(self::$myvar); echo '</pre>';
    }

}// end class

// how can i make this work if the __construct never runs for static calls?
Class1::func1();

// obviously this works
//$class1 = new Class1();
//$class1->func1();

【问题讨论】:

  • 如果你有一个静态类但需要一个构造函数,你不认为你有一些糟糕的设计吗?也许类不应该是静态的?
  • @u_mulder 没有静态类,它是静态属性。
  • 他遇到的问题是静态属性的初始值必须是常数,不能动态计算。
  • 我的错,应该是 - 方法不应该是静态的。

标签: php oop


【解决方案1】:

试试这个

<?php
function sayhey(){
    return 'hey';   
};

// my class i do control
class Class1 {

    private static $myvar;
    
    public function __construct(){
        self::$myvar = sayhey();
        //echo '<pre>11 '; print_r(self::$get_cart_contents); echo '</pre>';
    }
    
    public static function func1(){
        echo '<pre>'; 
        self::$myvar = self::$myvar ?? sayhey(); 
        print_r ( self::$myvar );
        echo '</pre>';
    }

}// end class

Class1::func1();

【讨论】:

  • 谢谢我喜欢这个,因为它很简单。 self::$myvar 真的被设置了吗?我添加了一个 func2() 并试图查看它是否曾经被 func1 填充,但它没有,所以也许没有必要检查一下 self::$myvar 是否曾经被设置?相反,也许我应该只做 $myvar = sayhey();并为我的多个班级部分重复使用
  • 不,它不设置值。我想到了在初始化类时提供值并使用该函数作为设置器。这就是我使用空合并运算符的原因。 :)
【解决方案2】:

您有时需要初始化静态属性。由于构造函数对静态方法没有用,这“替换”了通过创建 init() 方法(也是静态的)完成的工作,当 self::$myvar 为空时调用该方法(使用 self::$myvar ?? self::init()...

function sayhey(){
    return 'hey';
};

// my class i do control
class Class1 {
    
    private static $myvar;
    
    public static function init(){
        self::$myvar = sayhey();
        return self::$myvar;
    }
    
    public static function func1(){
        echo '<pre>'; print_r(self::$myvar ?? self::init()); echo '</pre>';
    }
    
}// end class

// how can i make this work if the __construct never runs for static calls?
Class1::func1();

【讨论】:

    【解决方案3】:

    您也可以将函数名保存在变量中,而不是调用的结果。

    function sayhey(){
        return 'hey';   
    };
    
    class Class1 {
    
        private static $myvar;
        
        public static function set($fct){
            self::$myvar = $fct;
        }
        
        public static function func(){
          $result = (self::$myvar)();
          return $result;
        }
    
    }
    
    Class1::set('sayhey');
    echo Class1::func();  //hey
    

    我怀疑traits 更好。

    trait myfunctions{
      public static function sayhey(){
        return 'hey';   
      }
    }
    
    class Class1 {
      use myfunctions;
    }
    
    class Class2 {
      use myfunctions;
    
      public static function fct1(){
        return self::sayhey();
      }
    }
    
    echo Class1::sayhey();  //hey
    echo Class2::sayhey();  //hey
    echo Class2::fct1();  //hey
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      相关资源
      最近更新 更多