自动加载器和命名空间的问题

时间:2018-10-23 作者:Amirition

我正在用oop编写一个简单的插件,并使用名称空间和自动加载。这是我的主要文件:

add_action(\'plugins_loaded\', array(My_Test_Plugin::get_instance(), \'plugin_setup\'));

class My_Test_Plugin
{
    /**
     * Plugin instance.
     *
     * @see get_instance()
     * @type object
     */
    protected static $instance = NULL;
    /**
     * URL to this plugin\'s directory.
     *
     * @type string
     */
    public $plugin_url = \'\';
    /**
     * Path to this plugin\'s directory.
     *
     * @type string
     */
    public $plugin_path = \'\';

    /**
     * Access this plugin’s working instance
     *
     * @wp-hook plugins_loaded
     * @since   2012.09.13
     * @return  object of this class
     */
    public static function get_instance()
    {
        NULL === self::$instance and self::$instance = new self;
        return self::$instance;
    }

    /**
     * Used for regular plugin work.
     *
     * @wp-hook plugins_loaded
     * @return  void
     */
    public function plugin_setup()
    {
        $this->plugin_url = plugins_url(\'/\', __FILE__);
        $this->plugin_path = plugin_dir_path(__FILE__);
        $this->load_language(\'vt-plugin\');

        spl_autoload_register(array($this, \'autoload\'));

    }
    /**
     * @param $class
     *
     */
    public function autoload($class)
    {
        $class = str_replace(\'\\\\\', DIRECTORY_SEPARATOR, $class);

        if (!class_exists($class)) {
            $class_full_path = $this->plugin_path . \'includes/\' . $class . \'.php\';
            if (file_exists($class_full_path)) {
                require $class_full_path;
            }
        }
    }
}
在中includes/PostTypes 目录中有一个名为Book.php 它包含以下内容:

namespace Book;

class Book {
    public function vt_create_book_post_type() {
        $labels = array(
            \'name\'                  => _x( \'Books\', \'vt-plugin\' ),
            \'singular_name\'         => _x( \'Book\', \'vt-plugin\' ),
            \'menu_name\'             => _x( \'Books\', \'vt-plugin\' ),
            ),
        );

        register_post_type( \'book\', $args );
    }
}
它只注册一个简单的post类型。现在我的问题是我应该在哪里使用init 注册帖子类型的操作?

我在plugin_setup 我的主文件中的函数:

add_action( \'init\', array(\'Book\', \'vt_register_book_post_type\') );
但它给了我一个错误:

Warning: call_user_func_array() expects parameter 1 to be a valid callback 
Update如果我将自动加载器功能更改为:

public function autoload($class)
    {
        $class = str_replace(\'\\\\\', DIRECTORY_SEPARATOR, $class);

        if (!class_exists($class)) {
            $class_full_path = $this->plugin_path . \'includes/\' . $class . \'.php\';
            if (file_exists($class_full_path)) {
                require $class_full_path;
                echo $class_full_path; 
            }
        }
    }
并在if语句中回显完整路径,它不会回显任何内容,我认为这意味着不包括文件。

1 个回复
SO网友:Nathan Johnson

回调[ \'Book\', \'vt_register_book_post_type\' ] 正在向静态方法添加挂钩vt_register_book_post_typeBook 全局命名空间的类。

如果要向Book命名空间的静态类添加回调,则需要使用[ \'\\Book\\Book\\\', \'vt_register_book_post_type\' ] 作为回调,但这也会导致警告或错误,因为您的方法不是静态的。您可以声明您的方法static, 但我认为你想做的是这样的:

namespace Book;
class book {
  public function vt_create_book_post_type() {
    $labels = [
      \'name\'                  => _x( \'Books\', \'vt-plugin\' ),
      \'singular_name\'         => _x( \'Book\', \'vt-plugin\' ),
      \'menu_name\'             => _x( \'Books\', \'vt-plugin\' ),
    ];
    register_post_type( \'book\', $args );
  }
}
$book = new book();
\\add_action( \'init\', [ $book, \'vt_create_book_post_type\' ] );
你的自动装弹机没有问题。或者至少这不是导致错误的原因。

结束

相关推荐

Plugin options autoloading

在《专业WordPress开发》一书中,我发现了以下技巧:根据经验,如果博客的公共部分需要您的选项,请使用自动加载保存它们。如果只在管理区域需要它们,请保存它们而不自动加载如果所有插件开发人员都遵循这个建议,那么这不会导致后端出现许多额外的SQL查询,从而降低管理方面的速度吗?使用插件选项自动加载的好例子是什么?