静态 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']);