簡體   English   中英

父類的靜態var無效

[英]Static var from parent class not working

我正在構建一個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
      }
  }

問題是,您是以非靜態方式為靜態變量賦值(將錯誤報告發送到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;
    }
}

從類中可以創建一個實例,例如,Person類可以表示多個人,但是如果使用的靜態變量與從該類生成的所有實例相同。 靜態變量tablePrefix可以是'wp_'。 從而:

class DbTable
{
    protected static $preFix = 'wp_';
}

如果你有一個public $tablename; ,那么每個你使用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設置為直接訪問它。 優點是變量在類的所有實例上都是相同的,因此更改將影響所有實例。 我建議您閱讀有關何時創建實例以及何時使用靜態方法或變量的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM