为什么在Wordpress插件的类中使用$ this会导致致命错误?

men*_*sch 8 php wordpress class wordpress-plugin

我正在编写一个Wordpress插件,它在管理区域中创建一个页面,以及执行一些前端代码.

下面的代码抛出了一个很好的Fatal error: Using $this when not in object context错误.这是相当神秘的,因为变量在类中被调用.

也许我没有遵循功能和类的预期Wordpress插件结构,但下面的概念代码是使用Wordpress Codex中插件开发的相关条目创建的.

有人可以解释为什么会触发错误,因为当我在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'));
}
Run Code Online (Sandbox Code Playgroud)

men*_*sch 10

所以,我似乎已经修复了它,回到基础并向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;
}
Run Code Online (Sandbox Code Playgroud)


gei*_*ilt 5

这不再是真的.

不要忘记,如果你传入类,你可能想通过引用传递它,你甚至可以使用&$ this在类中传递一个类自己的函数并继续修改同一个实例,这有助于没有每次调用插件的不同部分但同一个类时重新创建一个类.

来自:https://codex.wordpress.org/Function_Reference/do_action_ref_array

从PHP 5.4开始,尽管函数名称不再通过引用传递数组.您甚至无法使用参考符号'&',因为现在通过引用传递的调用时间会引发错误.你可以做的是将引用指针作为数组元素传递.这样做需要添加到操作的所有回调以期望引用指针.这不是您将在WordPress操作中看到的内容.提供此技术仅供参考.

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

要么

$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
    }
}
Run Code Online (Sandbox Code Playgroud)