如何更正此功能中的缺陷
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变量。这是由于该变量的私有声明
答案 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
函数不会被触发。