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解决方案,重构类,这就是方法。