2010-10-28 57 views
1

如何糾正缺陷在這個函數如何糾正缺陷在這個函數

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變量。這是由於該變量的私人聲​​明造成的

回答

1

您需要重構你的代碼,以便您可以:

  • 使Setvalue非靜態函數實例化類:

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

  • 更改_callingscript以便它是n通過實例化填充,因此可以通過self::_callingscript
6

不,這是因爲$this沒有被填充爲靜態方法。刪除static限定符。

0

$this無法通過靜態方法訪問。 我會建議更換該dosent工作到行:

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

對不起混淆。

+0

它沒有鍛鍊給了我錯誤「未定義的類常量」 – Someone 2010-10-28 18:22:42

+0

我不認爲這也可以。你直接調用靜態setValue,所以沒有構造被調用,所以$ _callingscript變量沒有被設置。如果它不崩潰,最好的情況下會有一個「空」值。 @Someone我推薦webbidaves解決方案,重構類,這就是要走的路。 – enricog 2010-10-28 18:28:31

+0

@TheCandyMan666:你是絕對正確的先生。 – David 2010-10-28 18:38:19

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函數沒有被觸發。