继承静态方法

时间:2011-08-29 11:57:30

标签: php oop

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

在我的应用程序中,我已经制作了2个类,每个类型一个。但是我只想创建一次查询,并使用静态成员来确定类型。基本上我想要达到的目标是这样的:

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不支持静态成员编写,这会导致此输出:

  

SELECT * FROM letters WHERE type = 0

     

SELECT * FROM letters WHERE type = 0

实现这样一个结果的最佳方法是什么,子类可以指定自己的类型?

3 个答案:

答案 0 :(得分:4)

首先,在继承方法getType()时应使用受保护的可见性:

protected static function getType();

要获取当前类型,请使用 static 关键字的PHP 5.3新功能: http://php.net/manual/en/language.oop5.late-static-bindings.php

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

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

答案 1 :(得分:4)

如果你使用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;
}

答案 2 :(得分:0)

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

这应该是php> 5.3的wotk。在PHP 5.2中,它的工作方式与您在评论中描述的一样