查看父类中子类中是否存在静态属性(后期静态绑定)?

时间:2013-03-18 17:32:19

标签: php late-static-binding

父类中的代码:

foreach(static::$_aReadOnlyDatabaseTables AS $TableName => $aColumns){
  // Do something
}

这在子类中定义$ _aReadOnlyDatabaseTables时有效,但在$ _aReadOnlyDatabaseTables不存在时抛出错误。我需要先检查这个属性是否存在。

我认为它应该是这样的:

if(property_exists(static,$_aReadOnlyDatabaseTables)){
   foreach(static::$_aReadOnlyDatabaseTables AS $TableName => $aColumns){
      // Do something
   }
}

但这会引发语法错误unexpected ',', expecting T_PAAMAYIM_NEKUDOTAYIM。使用$this代替static也不起作用,它总是评估为假。

这个的正确语法是什么?

3 个答案:

答案 0 :(得分:9)

你应该试试这个:

if(property_exists(get_called_class(), '_aReadOnlyDatabaseTables')) {
   foreach(static::$_aReadOnlyDatabaseTables AS $TableName => $aColumns){
      // Do something
   }
}

答案 1 :(得分:3)

正确的方法是在父类中使用合理的默认值(空数组)初始化值。这样你可以确定该属性将存在。

您在一个班级中访问的所有内容都应该在您自己使用该类时正确定义它。

答案 2 :(得分:0)

您应该可以使用get_class()代替static关键字快速而肮脏地执行此操作:

if (property_exists(get_class($this), '_aReadOnlyDatabaseTables')) { ... }