2011-08-29 133 views
0

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

在我的应用程序中,我做了2个类,每个类型一个。但是,我只想创建一次查询,并使用静态成员来确定类型。 Basicly什么我想要实现应该是这样的:

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,这会导致这样的输出:

SELECT * FROM字母WHERE类型= 0

SELECT * FROM WHERE type = 0

什么是最好的方式来实现这样的结果,其中子类可以指定自己的类型?

+0

不是一个真正的答案,但你应该避免使用这样的静态类。 PHP的静态调用基本上是将相关函数分组的一种方式,而不是使用继承和其他相关技术。 – Quamis

+0

该类不是静态的,A具有模型的所有属性。但是,获取数据库中所有A的方法是静态的。 – TJHeuvel

回答

4

首先的描述,你应该使用保护知名度,当你继承方法GetType():

protected static function getType(); 

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

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

静态保证了后期绑定将使用所以我将使用实际类型的方法。

+0

啊,所以这是新的'后期静态绑定'功能。非常感谢,它就像一个魅力! – TJHeuvel

0

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

这应该适用于PHP> 5.3。在PHP 5.2它的工作原理,你在评论

+0

我试过这个,它没有工作。当您调用基类上的方法时,将使用类(A)的当前实例的值。 – TJHeuvel

4

如果使用PHP> = 5.3可以使用静态关键字:

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; 
}