我有以下问题;我的应用程序中有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
实现这样一个结果的最佳方法是什么,子类可以指定自己的类型?
答案 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中,它的工作方式与您在评论中描述的一样