访问受PHP保护的属性
您好,我有一个类:AbstractEntityType,具有受保护的属性:访问受PHP保护的属性,php,Php,您好,我有一个类:AbstractEntityType,具有受保护的属性: abstract class AbstractEntityType extends AbstractType { protected static $lists = null; public function __construct($lists = array()) { AbstractEntityType::$lists = $lists; } public function config
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::
从扩展类中获取。这里的密钥是受保护的或私有的,如果它是公共属性,您可以按照在构造函数中执行的方式来执行。关于使用父类构造函数的子类,您是正确的,但这与您遇到的问题无关。