如何纠正此功能中的缺陷

时间:2010-10-28 18:03:31

标签: php

如何更正此功能中的缺陷

 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变量。这是由于该变量的私有声明

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

您需要重构代码,以便:

  • 使Setvalue成为一个非静态函数并实例化该类:

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

  • 更改_callingscript以便不通过实例化填充它,因此可以通过self::_callingscript
  • 进行静态访问

答案 2 :(得分:0)

无法从静态方法中访问

$this我建议将剂量工作的行替换为:

$_SESSION[self::_callingscript. "_" .$k] = $v;
编辑:来考虑一下,这是行不通的。


尝试#2:我给了你不好的信息。我忘了调用静态方法不会调用__construct()方法。我所做的只是使用非静态方法......

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");

抱歉混淆。

答案 3 :(得分:0)

您可以使用:

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;
        }
    }
}

正如其他人所指出的,$this在静态方法中无法访问,如果您调用static方法,则__construct函数不会被触发。