说我有以下内容:
<?php
abstract class MyParent
{
public static $table_name;
public static get_all(){
return query("SELECT * FROM {$this->table_name}");
}
public static get_all2(){
return query("SELECT * FROM ".self::table_name);
}
}
class Child extends MyParent
{ public static $table_name = 'child'; }
?>
假设query
被正确定义,这些方法都不能满足我的要求:get_all()抛出Fatal error: Using $this when not in object context in /path/to/foo.php on line xx
因为$this
是一个实例变量。
和get_all2()抛出Fatal error: Undefined class constant 'table_name' in /path/to/foo.php on line xx
因为self
是静态确定的。
似乎这种事情是继承的全部要点,所以如果不是优雅的话,它至少应该是可能的。 (毕竟这是PHP。)
应该我在做什么?
答案 0 :(得分:5)
您需要将self::table_name
更改为self::$table_name
- 请注意美元符号。但最好的方法是使用PHP 5.3的静态关键字:
http://php.net/manual/en/language.oop5.late-static-bindings.php
self
关键字仅引用静态proparty定义的类,因此在这种情况下它是错误的,因为您需要从父类获取静态属性“inherited”。在这种情况下,关键字“静态”将解析正确的调用者类并正常工作。
答案 1 :(得分:4)
self::$table_name
,虽然您可能需要static::$table_name
。