2011-02-18 6 views
7

私は管理領域にページを作成し、フロントエンドコードを実行するWordpressプラグインを作成中です。

以下のコードは、素敵なFatal error: Using $this when not in object contextエラーがスローされます。変数はクラスの中で呼び出されるので、これはむしろ不思議です。

たぶん私は、関数やクラスを対象としWordpressのプラグイン構造を以下ではないんだけど、下の概念のコードはWordpressのコーデックスにプラグイン開発に関連するエントリを使用して作成されました。エラーがトリガされた理由を、私はWordpressの外のクラスのインスタンスを作成するときには、すべてがうまくているコードベースため

誰かが、説明してもらえます。

if (!class_exists("MyClass")) { 
    class MyClass { 
    var $test = 'Test variable'; 

    public function index() { 
     //Index code 
    } 

    public function add() { 
     echo $this->test; 
    } 
    } 
} 

add_action('admin_menu', 'my_plugin_menu'); 

function my_plugin_menu() { 
    add_menu_page('My Plugin', 'My Plugin', 'manage_options', 'my-plugin', array('MyClass', 'index')); 
    add_submenu_page('my-plugin', 'Add New Thing', 'Add New', 'manage_options', 'my-plugin-add', array('MyClass', 'add')); 
} 

答えて

9

だから、私は基本に戻って行くとGoogleに謙虚な質問を尋ねることによって、それを固定しているように見えるしました:を「Wordpressのプラグインのクラスを使用します」。

Jay Fortnerの記事とdConstructing.comの記事の両方が役に立ちました。

基本的に、私は今、クラス内からadd_menu_pageとadd_submenu_pageを呼んでいます。これらの関数が何らかの形でオブジェクトを作成したという印象を受けましたが、明らかにそうではありません。

私のコードは今、このような何かを見て、私はエラーなしで宣言されたクラス変数を呼び出すことができるよ:あなたは何をすべき

if (!class_exists("MyClass")) { 
    class MyClass { 
    var $test = 'Test variable'; 

    function __construct() { 
     add_action('admin_menu', 'my_plugin_menu'); 
    } 

    function my_plugin_menu() { 
     add_menu_page('My Plugin', 'My Plugin', 'manage_options', 'my-plugin', array(&$this, 'index')); 
     add_submenu_page('my-plugin', 'Add New Thing', 'Add New', 'manage_options', 'my-plugin-add', array(&$this, 'add')); 
    } 

    public function index() { 
     //Index code 
    } 

    public function add() { 
     echo $this->test; 
    } 
    } 
    new MyClass; 
} 
+0

ねえ...、コードは私のために働いていません。だから、私はこの 'add_action( 'admin_menu'、 'my_plugin_menu')を変更し、この' add_action( 'admin_menu'、配列($この、 'my_plugin_menu'))に '関数、アクションインサイド' – KeepMove

1

クラスがどのように呼び出されているかによって、Class :: method()はエラーをスローします。もしそうなら、私はあなたがself :: $ testを使う必要があると思います。間違っている可能性があります。

+0

私はWordpressのクラスを呼び出すかどうかはわかりませんが、その代わります$ this-の自己::テストを使用して>テストはエラーを解決しない、私は恐れている。 – mensch

4

は以下の通りです:

function my_plugin_menu() 
{ 
add_menu_page('My Plugin', 'My Plugin', 'manage_options', 'my-plugin', array(new MyClass, 'index')); 
add_submenu_page('my-plugin', 'Add New Thing', 'Add New', 'manage_options', 'my-plugin-add', array('MyClass', 'add')); 
} 

array('MyClass', 'index')原因を使用してphpメソッドを静的メッシュとして実行しますが、実際のオブジェクトを最初の引数として渡すと、そのオブジェクトを介してメソッドが呼び出されます。

function my_plugin_menu() 
{ 
    $Class = new MyClass(); 
    add_menu_page(
     'My Plugin', 
     'My Plugin', 
     'manage_options', 
     'my-plugin', 
     array($Class, 'index') 
    ); 
} 

オブジェクトを再利用する場合にも機能します。

4

これはもはや真です。

Don't forget, if you pass in the class, you may want to pass it by reference, you can even pass a classes own functions using &$this inside of a class and continue to modify the same instance, this helps to not have to recreate a class everytime you call a different part of the plugin but the same class.

から:https://codex.wordpress.org/Function_Reference/do_action_ref_array

As of PHP 5.4, the array is no longer passed by reference despite the function's name. You cannot even use the reference sign '&' because call time pass by reference now throws an error. What you can do is pass the reference pointer as an array element. Doing so does require all callbacks added to the action to expect a reference pointer. This is not something you will see in WordPress actions. This technique is provided for informational purposes only.

$Class = new MyClass(); 
add_menu_page(
     'My Plugin', 
     'My Plugin', 
     'manage_options', 
     'my-plugin', 
     array(&$Class, 'index') 

それとも

$myClass= new MyClass ; 

add_action('admin_menu', array($myClass, 'admin_menu')); 

class MyClass 
{ 
    public function admin_menu() 
    { 
     add_menu_page('MyMenu', 'MyMenu', 'read', 'mymenu', array($this, 'action')); 
    } 
    public function action() 
    { 
     //Do something here 
    } 
} 
+0

私はformタグを追加しました。だから、私は何をしなければならないのですか?前もって感謝します。 –

+0

$ _POST配列でポスト値を確認してください。 – geilt

関連する問題