问题描述
|
说我有以下几点:
<?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\'; }
?>
假设正确定义了“ 1”,那么这些方法都不符合我的要求:get_all()抛出“ 2”,因为“ 3”是一个实例变量。
get_all2()抛出Fatal error: Undefined class constant \'table_name\' in /path/to/foo.PHP on line xx
,因为self
是静态确定的。
似乎这种事情是继承的全部要点,因此,即使不是很优雅,也应该至少容易做到。 (毕竟这是PHP。)
我该怎么办?
解决方法
您需要将
self::table_name
更改为self::$table_name
-注意美元符号。但是最好的方法是使用PHP 5.3的static关键字:
http://php.net/manual/zh/language.oop5.late-static-bindings.php
关键字“ 5”仅引用定义了静态proparty的类,因此在这种情况下是错误的,因为您需要从父类中获取静态属性“继承”。在这种情况下,关键字“静态”将解析正确的呼叫者类别并正常工作。
, self::$table_name
,尽管您可能想要static::$table_name
。