Php 继承静态方法

Php 继承静态方法,php,oop,Php,Oop,我有以下问题;我的应用程序中有两个模型,但它们存储在数据库中的同一个表中。它们可以通过类型列进行区分,第一列为0,第二列为1 在我的应用程序中,我创建了两个类,每种类型一个。但是,我只想创建一次查询,并使用静态成员来确定类型。基本上,我想要实现的目标如下: class A { public $Description; //From the database public static function GetAll() { $query = "SELEC

我有以下问题;我的应用程序中有两个模型,但它们存储在数据库中的同一个表中。它们可以通过
类型
列进行区分,第一列为0,第二列为1

在我的应用程序中,我创建了两个类,每种类型一个。但是,我只想创建一次查询,并使用静态成员来确定类型。基本上,我想要实现的目标如下:

class A
{
    public $Description; //From the database

    public static function GetAll()
    {
        $query = "SELECT * FROM letters WHERE type = " . self::getType();

        echo $query;
    }

    private static function getType()
    {
        return 0;
    }
}

class B
    extends A
{
    public $SomeOtherProperty; //B also has another property, which A doesnt have. Its stored an another table.

    private static function getType()
    {
        return 1;
    }
}

A::GetAll(10);
B::GetAll(10);
但是,PHP不支持静态memberwriting,这会导致以下输出:

从type=0的字母中选择*

从type=0的字母中选择*


如果子类可以指定自己的类型,那么实现这种结果的最佳方法是什么

您可以尝试在类中使用静态变量,表示
$type
。据我所知,您可以覆盖静态变量


这应该是wotk for php>5.3。在PHP5.2中,它的工作原理与您在注释中所描述的一样。首先,在继承方法getType()时,应该使用受保护的可见性:

要获取当前类型,请使用PHP 5.3的新特性static关键字:


Static确保使用后期绑定,因此将使用实际类型的方法。

如果使用php>=5.3,则可以使用Static关键字:

public static function GetAll()
{
    $query = "SELECT * FROM letters WHERE type = " . static::getType();

    echo $query;
}
如果没有,可以将另一个参数传递给GetAll()方法以提供类型:

public static function GetAll($type)
{
    $query = "SELECT * FROM letters WHERE type = " . $type;

    echo $query;
}

这不是真正的答案,但应该避免使用这样的静态类。PHP的静态调用基本上是一种对相关函数进行分组的方法,而不是使用继承和其他oop相关技术。类本身不是静态的,具有模型的所有属性。然而,获取数据库中所有A的方法是静态的。我尝试过这个方法,但它不起作用。类(A)的当前实例的值在调用基类上的方法时使用。啊,这就是新的
后期静态绑定
特性。非常感谢,它就像一个符咒!
public static function GetAll()
{
    $query = "SELECT * FROM letters WHERE type = " . static::getType();

    echo $query;
}
public static function GetAll($type)
{
    $query = "SELECT * FROM letters WHERE type = " . $type;

    echo $query;
}