静态类DbTable的最佳OOP设计模式

时间:2015-02-07 10:14:18

标签: php oop design-patterns

我有类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);

很舒服

2 个答案:

答案 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 AnswerPHP 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']);