Warum löst die Verwendung von $this innerhalb einer Klasse in einem WordPress-Plugin einen schwerwiegenden Fehler aus?

Lesezeit: 4 Minuten

Ich bin dabei, ein WordPress-Plugin zu schreiben, das eine Seite im Admin-Bereich erstellt, sowie Frontend-Code auszuführen.

Der folgende Code wirft ein nettes Fatal error: Using $this when not in object context Error. Was ziemlich rätselhaft ist, da die Variable innerhalb der Klasse aufgerufen wird.

Vielleicht folge ich nicht der beabsichtigten WordPress-Plugin-Struktur für Funktionen und Klassen, aber der konzeptionelle Code unten wurde unter Verwendung der relevanten Einträge zur Plugin-Entwicklung im WordPress-Codex erstellt.

Könnte jemand erklären, warum der Fehler ausgelöst wird, denn wenn ich eine Instanz der Klasse außerhalb der WordPress-Codebasis erstelle, ist alles in Ordnung.

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

Benutzeravatar von mensch
Mensch

Also habe ich es anscheinend behoben, indem ich zu den Grundlagen zurückgekehrt bin und Google die bescheidene Frage gestellt habe: “Klassen in WordPress-Plugins verwenden”.

Sowohl der Artikel von Jay Fortner und eins an dConstructing.com waren hilfreich.

Grundsätzlich rufe ich jetzt add_menu_page und add_submenu_page innerhalb der Klasse auf. Ich hatte den Eindruck, dass diese Funktionen irgendwie ein Objekt erstellt haben, aber das tun sie offensichtlich nicht.

Mein Code sieht jetzt ungefähr so ​​​​aus und ich kann die deklarierte Klassenvariable ohne Fehler aufrufen:

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;
}

  • Hey…, der Code funktioniert bei mir nicht. Also ändere ich das add_action('admin_menu', 'my_plugin_menu'); Funktion dazu add_action('admin_menu', array($this, 'my_plugin_menu'));

    – Ari

    12. Juni 2014 um 15:32 Uhr

geilts Benutzeravatar
geil

Dies ist nicht mehr wahr.

Vergessen Sie nicht, wenn Sie die Klasse übergeben, möchten Sie sie vielleicht als Referenz übergeben, Sie können sogar die eigenen Funktionen einer Klasse mit &$this innerhalb einer Klasse übergeben und weiterhin dieselbe Instanz ändern, dies hilft, dies nicht zu haben um eine Klasse jedes Mal neu zu erstellen, wenn Sie einen anderen Teil des Plugins, aber dieselbe Klasse aufrufen.

Aus: https://codex.wordpress.org/Function_Reference/do_action_ref_array

Ab PHP 5.4 wird das Array trotz des Funktionsnamens nicht mehr als Referenz übergeben. Sie können nicht einmal das Referenzzeichen ‘&’ verwenden, da die Aufrufzeit als Referenz jetzt einen Fehler auslöst. Was Sie tun können, ist, den Referenzzeiger als Array-Element zu übergeben. Dazu müssen alle Callbacks, die der Aktion hinzugefügt werden, einen Referenzzeiger erwarten. Dies ist etwas, das Sie in WordPress-Aktionen nicht sehen werden. Diese Technik wird nur zu Informationszwecken bereitgestellt.

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

Oder

$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
    }
}

  • Innerhalb der Aktion habe ich das Formular-Tag hinzugefügt. Was soll ich also in Aktion weitergeben und wo kann ich den Beitragswert erhalten? Danke im Voraus.

    – Vishal Tanna

    9. Dezember 2016 um 12:39 Uhr

  • Überprüfen Sie das $_POST-Array auf Post-Werte.

    – Geil

    12. Dezember 2016 um 17:34 Uhr

Was Sie tun sollten, ist Folgendes:

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

Verwenden array('MyClass', 'index') Veranlassen Sie, dass PHP die Methode als statische Methode ausführt, aber wenn Sie ein tatsächliches Objekt als erstes Argument übergeben, wird die Methode über das Objekt aufgerufen.

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

Würde auch funktionieren, wenn Sie das Objekt wiederverwenden möchten.

abhängig davon, wie die Klasse aufgerufen wird, wirft Class::method() statisch Fehler. Wenn das der Fall ist, müssen Sie meiner Meinung nach self::$test; kann aber falsch sein.

1388730cookie-checkWarum löst die Verwendung von $this innerhalb einer Klasse in einem WordPress-Plugin einen schwerwiegenden Fehler aus?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy