静态 class DbTable 的最佳 OOP 设计模式
Best OOP design pattern for static class DbTable
我有 class 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);
很舒服
当您使用静态 classes 时,您需要指定您的变量源,在这种情况下,您将同时限定 classes 而不是单个 class ,这会有所不同,因为 self
的作用域是并发的 class 并且当你想同时作用于两个 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 and PHP Documentation
在这种情况下不需要使用静态变量。您只需要动态创建 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']);
但您也可以从已声明的对象中插入行:
$user = new User();
$user->insert(['col1' => 'val1']);
我有 class 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);
当您使用静态 classes 时,您需要指定您的变量源,在这种情况下,您将同时限定 classes 而不是单个 class ,这会有所不同,因为 self
的作用域是并发的 class 并且当你想同时作用于两个 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 and PHP Documentation
在这种情况下不需要使用静态变量。您只需要动态创建 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']);
但您也可以从已声明的对象中插入行:
$user = new User();
$user->insert(['col1' => 'val1']);