我正在构建一个wp插件,在名为database的父类中,我想创建一些设置等。其中一个设置是db表的命名,为了做正确的事我使用wpdb前缀(允许用户更改表前缀)。
因为我刚刚开始使用OOP,所以我没有这个工作; - )
示例(基本理念)
class database{
public static $dbTableName = 'mynewtable';
public static $dbTable;
public function __constructor(){
global $wpdb;
$this->dbTable = $wpdb->prefix . $dbTableName;
}
}
class install extends database{
public static function getTable(){
parent::$dbTable;// not working
// output should be wp_mynewtable
//do some stuff here with the variable
}
}
答案 0 :(得分:2)
问题是,您是以非静态方式为静态变量赋值(将错误报告调到E_ALL
)。您还依赖于构造函数来设置值,这意味着必须创建一个类。这排除了静态函数能够访问所述变量。
你也应该废除这种全球性的废话。像这样......
namespace something\that\does\not\clash\with\wordpress;
use \wpdb;
class database {
protected static $dbTableName = 'mynewtable';
}
class install extends database {
public static function getTable(wpdb $wpdb) {
return $wpdb->prefix . parent::$dbTableName;
}
}
答案 1 :(得分:0)
从类中可以创建一个实例,例如,Person类可以表示多个人,但是如果使用的静态变量与从该类生成的所有实例相同。静态变量tablePrefix可以是'wp_'。因此:
class DbTable
{
protected static $preFix = 'wp_';
}
每个你使用self :: $ preFix的地方都有相同的值,如果你有public $tablename;
,你可以为每个实例改变它。
class DbTable
{
protected static $preFix = 'wp_';
public $name;
// first function called when making a instance
public function __construct($name)
{
$this->name = $name;
}
}
// first instance for table person
$nameTable = new DbTable('person');
// second instance for table car
$carTable = new DbTable('car');
如果使用函数print_r
转储对象的值,则可以看到变量“name”具有不同的值。如果我们现在使用静态变量preFix,你会发现它将保持类DbTable的整个实例。我们将以下函数添加到类中。
public function GetFullTableName()
{
return self::$preFix . $this->name;
}
如果我们现在显示两个实例的表名,您将得到以下结果:
echo $nameTable->GetFullTableName(); // output: wp_person
echo $carTable->GetFullTableName(); // output: wp_car
您可以向类添加静态函数以更改静态变量,也可以将变量public设置为直接访问它。优点是变量在类的所有实例上都是相同的,因此更改将影响所有实例。我建议您阅读有关何时创建实例以及何时使用静态方法或变量的更多信息。