2017-07-11 41 views
1

我試圖訪問類的實例,其中包含一個匿名的,因爲我們在Java中做,比如:如何從PHP 7中的匿名訪問主類的實例?

JAVA

class MyClass 
{ 
    private String prop = "test"; 

    public void test() 
    { 
     new Runnable() { 

      public void run() 
      { 
       // I can access MyClass.this from here 
       System.out.println(MyClass.this.prop); 
      } 

     }.run(); 
    } 
} 

PHP 7

<?php 

class MyClass 
{ 
    private $prop = "test"; 

    public function test() 
    { 
     $class = new class{ 

      public function run() 
      { 
       // ???? MyClass::$prop ???? 
      } 

     }; 
    } 
} 

我怎麼能從匿名內部訪問MyClass實例?

+0

你的意思是像父::道具HTTP ://php.net/manual/pl/keyword.parent.php –

+0

您需要將它作爲StdClass引用,然後使用Reflection?您正在將Java邏輯與PHP邏輯混合 - 由於範圍無法達到,所以無法工作。除非你使屬性成爲靜態的:它可以使用'ClassName :: $ property'來調用,但必須是公共的。 – KDOT

+1

@BenYitzhaki parent :: $ prop不適用於php 7 anon類 – Mystic

回答

3

使用此:

class MyClass 
{ 
    public $prop = "test"; 

    public function test() 
    { 
     $class = new class($this){ 
      private $parentObj; 
      public function __construct($parentObj) 
      { 
       $this->parentObj = $parentObj; 
      } 
      public function run() 
      { 
       echo $this->parentObj->prop; 
      } 
     }; 
     $class->run(); 
    } 
} 

$x = new MyClass(); 
$x->test(); 

的關鍵是注入$this作爲匿名類的構造函數參數。

注:我已經改變了你的private $proppublic,所以我就不必爲它編寫一個getter;)

看看這裏:https://3v4l.org/IRhXd

+0

不幸的是,PHP一直在試圖複製Java和其他程序,但仍然只是第一步的寶貝,非常感謝! – Mystic

+0

樂意幫忙!別擔心,PHP會長大...有一天;) –

+0

@Mystic PHP是一種較弱的類型化語言,如果你想使用Java邏輯,但堅持PHP語法,那麼我建議你看看Facebook的語言Hack 。 – KDOT