什么';在PHP的超类静态方法中,访问子类静态属性的正确方法是什么?
假设我有以下几点:什么';在PHP的超类静态方法中,访问子类静态属性的正确方法是什么?,php,class,inheritance,Php,Class,Inheritance,假设我有以下几点: <?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::t
<?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()抛出致命错误:在xx行的/path/to/foo.php的对象上下文中使用$this,因为$this
是一个实例变量
get_all2()抛出致命错误:第xx行的/path/to/foo.php中未定义的类常量“table_name”,因为self
是静态确定的
这类事情似乎是继承的全部意义,所以它至少应该是可能的,即使不是优雅的。(这毕竟是PHP。)
我应该怎么做?虽然您可能想要静态::$table\u name
,但您需要将self::table\u name更改为self:$table\u name
-注意美元符号。但最好的方法是使用PHP 5.3的静态关键字:
self
关键字只引用定义了静态属性的类,因此在这种情况下是错误的,因为您需要从父类获取静态属性“继承”。在本例中,关键字“static”将解析正确的调用方类并正确工作。static::$table\u name正是我想要的,self:$table\u name做了错误的事情。该死,这不是static的意思!这是动态类级绑定。PHP遵循Java的例子,使用愚蠢的关键字表示类级变量,这一事实不应该影响其语言的所有其他部分。这也是statis在PHP中的含义。这就是为什么我在PHP手册上放了一个链接——只是为了确保人们不会把它当作通常的静态。它用词不当,因为它与静态
函数或属性无关。i、 例如,static::foo()
可以是对静态函数或非静态函数的调用。手册上说它是以“内部视角”命名的,但这真的只是一个蹩脚的借口。对不起,托马斯,我没有批评你,我应该以“谢谢”而不是“该死”开始评论。这真的没关系,只要我们讨论技术细节,而不是对其他人指名道姓。:)如果您对我的回答感到满意,我们将不胜感激。:)为什么这两个答案都是从说self::$table\u name
开始的,而这不起作用?奇怪的至少他们最终说要使用后期静态绑定。