Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问受PHP保护的属性_Php - Fatal编程技术网

访问受PHP保护的属性

访问受PHP保护的属性,php,Php,您好,我有一个类:AbstractEntityType,具有受保护的属性: abstract class AbstractEntityType extends AbstractType { protected static $lists = null; public function __construct($lists = array()) { AbstractEntityType::$lists = $lists; } public function config

您好,我有一个类:AbstractEntityType,具有受保护的属性:

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;
      }
  }
我用PHP5.4和windows在本地进行了测试,没有问题,但在服务器(linux和PHP5.3)上出现了以下错误:

Error: Cannot access protected property MyType::$lists
发生了什么事?一个php错误


谢谢

该财产受到保护,因此您永远不能这样做:

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;
}

该属性受保护,因此您永远无法执行以下操作:

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;
}

有一件事你是对的:我应该使用self而不是类的名称(尽管,就像我说的,它在测试环境中工作得很好)。@mlwacosmos它也不应该在你的测试环境中工作。但我从未在windows上使用过php或服务器,所以我不知道是什么原因导致了这种情况。可能是在错误处理中,但我猜当它不能正常工作时,您会注意到:-)对不起,我犯了一个错误,问题不在构造上。就像我写的那样,它很有效。我的问题在别的地方。你之前写的关于“不允许拥有受保护的财产”的内容在我看来并不正确,但我可能错了。可以在抽象类中调用静态属性。子类中未定义构造函数,因此它们采用父类的构造函数。(在Java中是这样的)。关于我的问题,我将问另一个问题。@mlwacosmos不,这是正确的,您不能使用类名获取受保护或私有(静态…)属性。您只能使用
self::
从类本身中获取,或者使用
parent::
从扩展类中获取。这里的密钥是受保护的或私有的,如果它是公共属性,您可以按照在构造函数中执行的方式来执行。关于使用父类构造函数的子类,您是对的,但这与您遇到的问题无关。有一点您是对的:我应该使用self而不是类的名称(尽管,正如我所说,它在测试环境中工作良好)。@mlwacosmos它也不应该在您的测试环境中工作。但我从未在windows上使用过php或服务器,所以我不知道是什么原因导致了这种情况。可能是在错误处理中,但我猜当它不能正常工作时,您会注意到:-)对不起,我犯了一个错误,问题不在构造上。就像我写的那样,它很有效。我的问题在别的地方。你之前写的关于“不允许拥有受保护的财产”的内容在我看来并不正确,但我可能错了。可以在抽象类中调用静态属性。子类中未定义构造函数,因此它们采用父类的构造函数。(在Java中是这样的)。关于我的问题,我将问另一个问题。@mlwacosmos不,这是正确的,您不能使用类名获取受保护或私有(静态…)属性。您只能使用
self::
从类本身中获取,或者使用
parent::
从扩展类中获取。这里的密钥是受保护的或私有的,如果它是公共属性,您可以按照在构造函数中执行的方式来执行。关于使用父类构造函数的子类,您是正确的,但这与您遇到的问题无关。