2014-03-28 56 views
-3

如何從公共,私人或受保護的範圍內檢測方法?PHP如何檢測是否從公共或私人範圍調用方法?

例如...

class Foo { 

    public function getPassword(){ 
     $scope = [??????]; 
     switch($scope){ 
      case 'public': 
       return "*****"; 
       break; 
      case 'protected': case 'private': 
       return "IamPassword"; 
       break; 
     } 
    } 
} 

在類,我可能需要可能不是由類的模板引擎可見,但訪問的性能。

+1

我不知道PHP,但在Java和C#等語言中,您無法知道函數的調用方。唯一的可能性是檢查呼叫跟蹤並從那裏得到它,但一旦你不得不採取這些措施,你通常會在設計中出現缺陷。 –

+0

這不是一個好的觀點,變量作用域是控制你對類的屬性和方法的訪問的構造性鍵,你不應該檢查範圍是什麼,你應該只尊重它。如果你從課堂外調用一個私人方法,它會拋出致命錯誤,所以無法證實。你所能做的就是設置一個公共功能,一旦公共職能打開課程的大門,就可以調用私人功能。 –

+6

如果這對你的代碼有影響,那麼你的設計中有一種令人討厭的氣味 –

回答

1

首先,我強烈建議您儘快重新設計您的代碼。不過你的問題對我來說似乎很有意思,所以你可以試試這個:

$scopeIsInner = false; 
    $exception = new Exception(); 
    $trace = $exception->getTrace(); 
    $class = $trace[1]['class']; 
    if ($class == __CLASS__) { 
     $method = $trace[1]['function']; 
     $reflect = new ReflectionObject($this); 
     $methodList = $reflect->getMethods(ReflectionMethod::IS_PROTECTED | ReflectionMethod::IS_PRIVATE); 
     foreach ($methodList as $reflectionMethod) { 
      if ($method == $reflectionMethod->name) { 
       $scopeIsInner = true; 
       break; 
      } 
     } 
    } 
    var_dump($scopeIsInner); 

P.S.我永遠不會在我自己的應用程序中使用此代碼

+0

謝謝,不要擔心我的設計,我知道我在做什麼。有超過8年的PHP經驗。以前從不需要檢查調用範圍,也不是核心問題而是核心問題。以爲我會問,因爲沒有任何文件可以在任何地方找到。 –

相關問題