2016-09-22 130 views
0

您好我有一個類:與受保護財產AbstractEntityType:訪問PHP保護性

abstract class AbstractEntityType extends AbstractType { 
    protected static $lists = null; 

    public function __construct($lists = array()) { 
    AbstractEntityType::$lists = $lists; 
    } 

    public function configureOptions(OptionsResolver $resolver) { 
    $resolver->setRequired(array(
     'temp', 'statut' 
    )); 
    } 
} 

這裏是另一個類擴展上一個:

class MyType extends AbstractEntityType { 
    .... 
} 

我使用一個工廠來創建的MyType等級:

class SimpleFormTypeFactory { 
    public function createType($entity_type, $entity_stub, $lists = null) { 
     $type = null; 

     switch($entity_type) { 
      .... 
      case SOMENUMTYP: 
      $type = new MyType($lists); 
      break; 
     } 
    } 

我在本地測試它與php 5.4和windows沒有問題,但在服務器(Linux和PHP 5.3)我有這個錯誤:

Error: Cannot access protected property MyType::$lists 

這是怎麼回事?一個PHP錯誤?

謝謝

回答

5

的財產受到保護,所以你永遠無法做到這一點:

public function __construct($lists = array()) { 
    AbstractEntityType::$lists = $lists; 
    ^^^^^^^^^^^^^^^^^^^^^^^^^^ Not allowed for a protected property, regardless where you are 
} 

然而,當你是你的類中,你可以直接訪問它:

public function __construct($lists = array()) { 
    self::$lists = $lists; 
} 
+0

你是對的一件事情:我應該用自己而不是班級的名字(雖然,就像我說的那樣,它在測試環境中運行良好)。 – mlwacosmos

+0

@mlwacosmos它也不適用於您的測試環境。但我從來沒有在Windows上使用過PHP或服務器,所以我不知道可能會導致什麼結果。可能在錯誤處理,但我猜你會注意到,當它不能正常工作:-) – jeroen

+0

對不起,我犯了一個錯誤,問題不在建設。就像我寫的那樣,它起作用。我的問題在別的地方。你之前寫的關於「不允許受保護的財產」的看法對我來說似乎並不合適,但我可能是錯的。可以調用抽象類中的靜態屬性。在子類中沒有定義構造函數,所以它們都是父類的。 (在Java中就是這樣)。我會問我關於我的問題的另一個問題。 – mlwacosmos