【问题标题】:What's the Right Way to access static properties of subclasses in static methods of superclasses in PHP?在 PHP 中访问超类的静态方法中子类的静态属性的正确方法是什么?
【发布时间】:2011-06-06 21:38:25
【问题描述】:

假设我有以下内容:

<?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。)

我应该做什么

【问题讨论】:

  • 为什么两个答案都以self::$table_name开头,而这不起作用?奇怪!至少他们最终说要使用后期静态绑定。

标签: php class inheritance


【解决方案1】:

您需要将self::table_name 更改为self::$table_name - 注意美元符号。但最好的方法是使用 PHP 5.3 的 static 关键字:

http://php.net/manual/en/language.oop5.late-static-bindings.php

self 关键字仅引用定义了静态 proparty 的类,因此在这种情况下是错误的,因为您需要从父类中获取静态属性“继承”。在这种情况下,关键字“static”将解析正确的调用者类并正常工作。

【讨论】:

  • 该死的,这不是 static 的意思!那是动态的类级绑定。 PHP 遵循 Java 的示例并使用愚蠢的关键字来表示类级变量这一事实不应影响其语言的所有其他部分。
  • 这就是 statis 在 PHP 中 also 的意思。这就是为什么我放了一个 PHP 手册的链接——只是为了确保人们不会像往常一样把它当作静态的。
  • 用词不当,因为它与static 函数或属性无关。即,static::foo() 可以是对静态函数或非静态函数的调用。手册说它是以“内部观点”命名的,但这实际上只是一个糟糕的借口。
  • 对不起 Tomasz,我没有批评你,我应该用“谢谢”而不是“该死”来开始评论。
  • 这真的没关系,只要我们讨论的是技术细节,而不是对其他人点名。 :) 如果您对我的回答感到满意,我们将不胜感激。 :)
【解决方案2】:

self::$table_name,虽然你可能想要static::$table_name

【讨论】:

  • static::$table_name 正是我想要的,self::$table_name 做错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 2011-07-11
相关资源
最近更新 更多