2016-09-05 6 views
0

ページビルダーをOOPスタイルで書き直しています。これは実用的です。なぜなら、すべての設定ページにコードを記述する必要はなく、パラメータを指定してそれを構築できるからです。サブフォームOOPスタイルを動的に作成する

私はクラスを作成し、コンストラクタを定義してビルドを開始しましたが、私は障害にぶつかりました。クラスは次のとおりです。

class SettingsSubageBuilder { 

    private $subpage_name; 

    private $html_array; 

    public function __construct($subpage_name, $html_array) { 
     $this->subpage_name = $subpage_name; 
     $this->html_array = $html_array; 
    } 

    public function create_submenu_pages() { 
     $page_hook = 'mytheme_theme' . strtolower(str_replace(' ', '_', $this->subpage_name)); 

     add_submenu_page('theme_settings', $this->subpage_name, $this->subpage_name, 'edit_theme_options', $page_hook, 'mytheme_'.strtolower(str_replace(' ', '_', $this->subpage_name)).'_render_page'); 
    } 

    public function mytheme_'.strtolower(str_replace(' ', '_', $this->subpage_name)).'_render_page() { 

    } 
} 

submenu pagesが追加されました。しかし、呼び出し可能な関数の問題があります。

私のサブメニューページの[ヘッダー設定]に名前を付けます。

$page_hookmytheme_theme_header_settingsになり、呼び出し可能な関数はmytheme_header_settings_render_pageになります。

呼び出し可能関数を作成しようとすると、明らかに問題があります。

public function mytheme_'.strtolower(str_replace(' ', '_', $this->subpage_name)).'_render_page() { 

    } 

は動作しません - 私は、どのように私はPHPでコンストラクタに依存メソッドを作成することができます

Parse error: syntax error, unexpected ''.strtolower(str_replace('' (T_CONSTANT_ENCAPSED_STRING), expecting '(' in /theme-settings/theme-settings.php on line 138

を取得しますか?

+0

あなたは動的にここに関数名を作成する必要はありません。オブジェクトの中にすべてを保持すると( '$ this 'で変数と関数を参照すると)、すべてのインスタンスは他のインスタンスから分離されます。 –

+0

私が正しく理解していれば、 'render_page'という関数を作成することができます。このオブジェクトのインスタンスを別々に作成しても、互いに独立してレンダリングされますか? 'add_submenu_page()'関数に衝突することはありませんか? –

+1

それは正しいです。インスタンスで変数の値を共有する場合は、静的として明示的に宣言する必要があります。 –

答えて

0

マジックメソッド__callを使用すると、明示的に定義していないメソッドへのメソッド呼び出しをキャッチすることができます。この方法で、変数の内容に基づいて対応する関数を聴くことができます。

class SettingsSubageBuilder { 
    /* Other code */  


    public function __call($name, $arguments) { 
      if ($name == 'mytheme_'.strtolower(str_replace(' ', '_', $this->subpage_name)).'_render_page') { 
       //Do stuff 
      } else { 
        throw new Exception("Call to undefined method $name"); 
      } 
    } 
} 

マニュアルページ:http://php.net/manual/en/language.oop5.overloading.php#object.call

関連する問題