开发者

How to correct the Flaw in this function

How to correct the Flaw in this function

 class MyClass {
  private $_callingscript; 
             public   function __construct(){
    $this->_callingscript= base开发者_高级运维name($_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");

When i call this it is giving me error "Using $this when not in object context in". How to correct the callingscript variable .Is this due to private declaration of that variable


No, it's because $this doesn't get populated for static methods. Remove the static qualifier.


You need to refactor your code so that you either:

  • make Setvalue a non-static function and instantiate the class:

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

or

  • change _callingscript so that it is not populated through instantiation and can therefore be accessed statically via self::_callingscript


You could use:

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

or if the callingScript variable needs to be shared among other methods:

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

As others have pointed out, $this is not accessible within static methods and if you call a static method the __construct function is not being triggered.


$this can't be accessed from within static methods. I would recommend replacing the line that dosent work to:

$_SESSION[self::_callingscript. "_" .$k] = $v;

EDIT: come to think about it, this will not work.


Attempt #2: I gave you bad information. I did forget that calling the static method would not call the __construct() method. What I do is just use non static methods...

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

Sorry for confusion.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜