我有类DbTable,它实现了对数据库的所有数据库查询,例如insertRecord,updateRecord,......但是变量不是重写。
abstract class DbTable {
public static $table;
public static function insertRecord($data) {
// here I add some values to data, but that's not important
my_db::insert(self::$table, $data);
}
}
class User extends DbTable {
public static $table = 'table_users';
}
// everywhere I can call
User::insertRecord($data);
我知道我可以致电
$c = get_called_class();
my_db::insert($c::$table, $data);
但我认为这根本不是最佳解决方案。
方法和变量可以是非静态的,我只是使用它们,因为编写User::insertRecord
代替$user = new User(); $user->insertRecord($data);
答案 0 :(得分:0)
当您使用静态类时,您需要指定您的变量源,在这种情况下,您要确定两个类而不是单个类,这会产生影响,因为self
正在确定并发class,当你想要为两个类设置范围时,你必须使用static
。
/**
* For testing
*/
class my_db {
public static function insert($table, $data){
echo $table;
}
}
abstract class DbTable {
public static $table = null;
public static function insertRecord($data) {
//self::$table is empty
//static::$table has 'table_users'
// here I add some values to data, but that's not important
my_db::insert(static::$table, $data);
}
}
class User extends DbTable {
public static $table = 'table_users';
}
// everywhere I can call
User::insertRecord(['Hi']);
self::$table
为空
static::$table
有'table_users'
您可以在此处详细了解此信息:SO Answer和PHP Documentation
答案 1 :(得分:0)
在这种情况下,不需要使用静态变量。您只需要动态创建User
对象,然后调用方法。
abstract class DbTable
{
protected $tableName;
public static function insertRecord($data)
{
$object = static::newInstance();
$object->insert($data);
}
public static function newInstance()
{
$className = get_called_class();
return new $className();
}
public function insert($data)
{
my_db::insert($this->tableName, $data);
}
}
class User extends DbTable
{
public function __construct()
{
$this->tableName = 'table_users';
}
}
您现在可以致电:
User::insertRecord(['col1' => 'val1']);
但您也可以从instated对象中插入行:
$user = new User();
$user->insert(['col1' => 'val1']);