2015-02-07 71 views
1

我有DbTable类,它实现了所有的数据库查询,如insertRecord,updateRecord,...但变量不是重写。静态类的最佳OOP设计模式DbTable

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

,在这种情况下,你'对两个类的范围而不是单个类的范围,这是有区别的,因为self正在对并发类进行范围调整,并且当您想要为两个类范围时,必须使用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

非常感谢您! – 2015-02-07 10:55:45

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