【问题标题】:PHP Class constructor not running when called from static function in another class从另一个类中的静态函数调用 PHP 类构造函数时未运行
【发布时间】:2015-03-11 17:45:20
【问题描述】:

我目前被盖章,我看不出我做错了什么。我在下面有一个静态函数 request()

private static function request(){

   if($_SERVER['REQUEST_METHOD']=='GET'){

       $data = RunData::get('cmd');

   }

调用静态函数get(),后者又调用私有函数clean(),该函数使用在类构造函数中设置的变量加载注入类消毒

class RunData {

    public static $sanitize;

    public function __construct( Sanitize $sanitize ){

        self::$sanitize = $sanitize;

    }

   private static function clean($variable_array){    

        if(is_array($variable_array)){

            $filters = array('string' => 'sanitize_string');

            return self::$sanitize->filter($variable_array, $filters);   

        }
    }

    public static function get($variable){

        if(self::clean($_GET)){

            return $_GET[$variable];

        }

    }


}

但是当我运行时,我得到了这个错误。

致命错误:在非对象上调用成员函数 filter()

此过滤器函数是从注入构造函数的 Sanitize 类加载的。

我可能错过了什么???构造函数似乎没有运行

谢谢

【问题讨论】:

  • 当你只是静态调用类方法时,构造函数永远不会被调用,所以self::$sanitize永远不会被设置

标签: php static-methods static-linking


【解决方案1】:

你是对的,__construct() 在静态调用类时不会被调用。在调用该方法之前,您需要通过某种设置方法注入 Sanitize 类来手动设置对象。

例如:

public static function setSanitizeClass(Sanitize $sanitise)
{
    self::$sanitize = $sanitize;
}

然后:

RunData::setSanitizeClass(new Sanitize());
$data = RunData::get('cmd');

【讨论】:

  • 我试图看看如何在不必初始化其他类或方法的情况下做到这一点。好吧,看来我必须重做一些代码,没有办法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 2014-03-12
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
相关资源
最近更新 更多