2013-07-25 78 views
1

我正在使用overflow __set和__get方法,我希望能夠模擬私有/公共類變量。從PHP對象內部或外部運行

我確信這個問題的答案已經存在,但我一直在挖,找不到東西。讓我試着展示一個我想要做的事情的例子。

<?php 
class Person 
{ 
    public function test() 
    { 
     return $this->whereami(); 
    } 

    public function whereami() 
    { 
     if (method_called_inside_class()) { 
      return 'private'; 
     } else { 
      return 'public'; 
     } 
    } 
} 

$person = new Person(); 
$person->test(); // 'private' 
$person->whereami(); // 'public' 

我想什麼是方法當物體內對從外部被稱爲稱爲不同的功能。我知道我可以添加另一個參數來表示行爲的變化,或者創建另一個功能。但如果我在這裏試圖做的是以某種方式而不是其他兩種選擇,那就太棒了!

+1

debug_backtrace應該爲您提供所需的信息,但即使想要這樣做也是主要設計問題的標誌。它可能只是兩種不同的方法。 – Corbin

+0

您可以創建一個私有函數並使用'__call'方法。但我很好奇在什麼場景這是需要的... – Passerby

+1

你爲什麼關心呼叫者是誰? – Orangepill

回答

0

如果我理解它是正確的,您希望使用在代碼中未明確定義但可以使用的對象變量。對於他們中的一些人來說,魔術獲得者和二傳手應該返回變量,對於其他人則不應該。

假設這樣,您可以通過執行以下操作部分地解決問題。在課堂內部,您必須直接使用$this->data['name'];訪問變量。我知道這不是你想要的100%,但我認爲你不能區分班內和班外的電話。您使用的功能甚至不存在。

<?php 

class MagicGetterSetter { 
    // contains the variables 
    private $data = array(); 

    private $publicVariables = array('test', 'foo', 'hierarchy'); 

    public function __get($name) { 
     if (isset($this->data[$name])) { 
      if (in_array($name, $this->publicVariables)) { 
       return $this->data[$name]; 
      } 
     } 

     return null; 
    } 

    public function __set($name, $value) { 
     if (in_array($name, $this->publicVariables)) { 
      $this->data[$name] = $value; 
     } 
    } 

    public function __isset($name) { 
     if (in_array($name, $this->publicVariables)) { 
      return isset($this->data[$name]); 
     } 

     return false; 
    } 
}