Php 如何更正此函数中的缺陷

Php 如何更正此函数中的缺陷,php,Php,如何更正此函数中的缺陷 class MyClass { private $_callingscript; public function __construct(){ $this->_callingscript= basename($_SERVER['SCRIPT_NAME']); } public static function Setvalue($k,$v){ if (!empty($k)) {

如何更正此函数中的缺陷

 class MyClass {
  private $_callingscript; 
             public   function __construct(){
    $this->_callingscript= basename($_SERVER['SCRIPT_NAME']);
        }
        public static function Setvalue($k,$v){
   if (!empty($k)) {
   $_SESSION[$this->_callingscript.'_'.$k]= $v;//This doesnot work 
   $_SESSION[$_SERVER['SCRIPT_NAME'].'_'.$k]=$v //This works 

  }
        }
 }

 MyClass::setValue('Somename',"Somevalue");
当我调用此函数时,如果不在中的对象上下文中使用$this,则会出现错误。
如何更正callingscript变量。这是由于该变量的私有声明造成的吗?

否,这是因为$this不会为静态方法填充。删除静态限定符。

否,这是因为$this不会为静态方法填充。删除静态限定符。

您需要重构代码,以便:

将Setvalue设置为非静态函数并实例化该类:

$mc = new MyClass();
$mc->setValue('Somename', 'Somevalue'");

更改_callingscript,使其不通过实例化填充,因此可以通过self::_callingscript静态访问
您需要重构代码,以便:

将Setvalue设置为非静态函数并实例化该类:

$mc = new MyClass();
$mc->setValue('Somename', 'Somevalue'");

更改_callingscript,使其不通过实例化填充,因此可以通过self::_callingscript静态访问 $this无法从静态方法中访问。我建议更换适用于以下目的的线路:

编辑:想想看,这是行不通的

尝试2:我给了你坏消息。我确实忘记了调用静态方法不会调用_构造方法。我所做的只是使用非静态方法

class MyClass {

  private $_callingscript; 

  public function __construct()
  {
    $this->_callingscript = basename($_SERVER['SCRIPT_NAME']);
  }


  public function setValue($k, $v)
  {
    if (!empty($k)) {
      $_SESSION[$this->_callingscript. "_" .$k] = $v;
    }
  }

}


$MyClass = new MyClass();

$MyClass->setValue('Somename', "Somevalue");
抱歉造成混淆。

$无法从静态方法中访问此项。我建议更换适用于以下目的的线路:

编辑:想想看,这是行不通的

尝试2:我给了你坏消息。我确实忘记了调用静态方法不会调用_构造方法。我所做的只是使用非静态方法

class MyClass {

  private $_callingscript; 

  public function __construct()
  {
    $this->_callingscript = basename($_SERVER['SCRIPT_NAME']);
  }


  public function setValue($k, $v)
  {
    if (!empty($k)) {
      $_SESSION[$this->_callingscript. "_" .$k] = $v;
    }
  }

}


$MyClass = new MyClass();

$MyClass->setValue('Somename', "Somevalue");
很抱歉造成混淆。

您可以使用:

class MyClass { 
    public static function Setvalue($k, $v) { 
        static $callingScript = null;

        if($callingScript == null) {
            $callingScript = basename($_SERVER['SCRIPT_NAME']);
        }

        if (!empty($k)) {
            $_SESSION[$callingScript . '_'.$k]= $v;
        }
    }
}
或者,如果callingScript变量需要在其他方法之间共享:

class MyClass {
    private static $callingScript = null;

    private static function getCallingScript() {
        if(self::$callingScript == null) {
            self::$callingScript = basename($_SERVER['SCRIPT_NAME']);
        }

        return self::$callingScript;
    }

    public static function Setvalue($k, $v) { 
        if (!empty($k)) {
            $_SESSION[self::getCallingScript() . '_'.$k]= $v;
        }
    }
}
正如其他人指出的,$这在静态方法中是不可访问的,如果调用静态方法,则不会触发_构造函数。

您可以使用:

class MyClass { 
    public static function Setvalue($k, $v) { 
        static $callingScript = null;

        if($callingScript == null) {
            $callingScript = basename($_SERVER['SCRIPT_NAME']);
        }

        if (!empty($k)) {
            $_SESSION[$callingScript . '_'.$k]= $v;
        }
    }
}
或者,如果callingScript变量需要在其他方法之间共享:

class MyClass {
    private static $callingScript = null;

    private static function getCallingScript() {
        if(self::$callingScript == null) {
            self::$callingScript = basename($_SERVER['SCRIPT_NAME']);
        }

        return self::$callingScript;
    }

    public static function Setvalue($k, $v) { 
        if (!empty($k)) {
            $_SESSION[self::getCallingScript() . '_'.$k]= $v;
        }
    }
}

正如其他人指出的,$这在静态方法中是不可访问的,如果调用静态方法,则不会触发_构造函数。

我认为这也行不通。您直接调用静态setValue,因此不调用任何构造,因此$\u callingscript变量未在该点设置。若它并没有崩溃,那个么在最好的情况下你们会有一个空值@有人我推荐webbidaves解决方案,重构类,这是一条路。我认为这也行不通。您直接调用静态setValue,因此不调用任何构造,因此$\u callingscript变量未在该点设置。若它并没有崩溃,那个么在最好的情况下你们会有一个空值@有人我推荐webbidaves解决方案,重构类,这就是方法。