面向WordPress对象的插件开发

时间:2016-11-24 作者:MMTDesigner

您好,我正在使用WordPress创建一个插件,因为这个插件的规模相当大,我正在尝试使用OOP来实现我需要的东西

我使用它的方式是在主插件文件中包含所有类,然后plugins_loaded 操作已启动我创建该函数的一个实例以启动__construct.

我所有的类都在扩展一个helper类,所以我要添加parent::__construct 在我所有的课上__construct 作用

在helper类中,我定义了init 行动。

代码示例:


// main plugin function code
require_once(\'include/helper.php\');
require_once(\'includes/database.php\');

add_action(\'plugins_loaded\', array(\'helper\', \'get_instance\'));
add_action(\'plugins_loaded\', array(\'database\', \'get_instance\'));

// end of main plugin function

// helper class code
class helper {
    function __construct() {
        add_action(\'init\', \'function_name_1\');
        add_action(\'init\', \'function_name_2\');
        add_action(\'init\', \'function_name_3\');
        add_action(\'init\', \'function_name_4\');
        add_action(\'init\', \'function_name_5\');
    )

    private $instance;
    static public function get_instance() {
        if (NULL === self::$instance) {
            self::$instance = new helper();
        }
        return $instance;
    }
}

// one sample class code
// I probably have like 8 or 10 of these classes

class database extends helper {
    function __construct() {
        parent::__construct();
        add_action(\'init\', \'inner_function_name_1\');
    }
    private $instance;
    static public function get_instance() {
        if (NULL === self::$instance) {
            self::$instance = new helper();
        }
        return $instance;
    }
}
我的问题是:

这种编码方式有效吗?如果没有,请建议最好的方式__construct 函数多次加载,因此init 每次都会有行动,这是一个问题吗?如果是,我该如何避免

1 个回复
最合适的回答,由SO网友:jgraup 整理而成

有几件事很突出。

不要预先加载所有的类和文件加载管理类时admin_init 当前端挂钩着火时,挂钩着火,前端类着火。尽可能多地考虑延迟加载。

如果database 是的扩展helper 那么为什么要初始化基类呢database.

为什么要挂钩\'init\' 多次创建\'init\' 功能并添加一个挂钩:

add_action(\'init\', array($this,\'my_init\');
课程应为CamelCaselowercase, 曾经

也许比__construct()?__invoke() 作为替代方案。除非你认为以后会有人使用初始值设定项。。。

self::$instance = new helper(); // __construct
self::$instance(); // __invoke
<小时>http://wppb.me/ 将管理加载与前端加载分离开来,这是一项有趣的工作。

而@toscho与https://github.com/object-calisthenics/phpcs-calisthenics-rules

注意:这是我所想的大致轮廓,但我还没有测试过。

<?php

if ( ! class_exists( \'HelperClasses\' ) ) {

    class HelperClasses {

        public static function initialize() {

            add_action( \'init\', array ( \'HelperClasses\', \'init\' ) );
        }

        public static function init() {
            require_once( __DIR__ . \'/inc/helper.php\' );
            require_once( __DIR__ . \'/inc/database.php\' );
        }
    }

    add_action( \'plugins_loaded\', array ( \'HelperClasses\', \'initialize\' ) );
}
<?php

if ( ! class_exists( \'HelperClasses\' ) ) {

    class HelperClasses {

        public static function initialize() {

            add_action( \'init\', array ( \'HelperClasses\', \'init\' ) );
        }

        public static function init() {
            require_once( __DIR__ . \'/inc/helper.php\' );
            require_once( __DIR__ . \'/inc/database.php\' );
        }
    }

    add_action( \'plugins_loaded\', array ( \'HelperClasses\', \'initialize\' ) );
}

/inc/database.php

if ( ! class_exists( \'Database\' ) ) {

    if ( ! class_exists( \'Helper\' ) ) {
        wp_die(\'Helper class required\');
    }

    /**
     * Class Database
     *
     * Loaded via HelperClasses on `init`
     */
    class Database extends Helper {

        private static $_instance;

        public static function instance() {

            if ( ! isset( static::$_instance ) ) {
                $singleton = new Database();
                static::$_instance = $singleton;
                $singleton();
            }

            return static::$_instance;
        }

        public function __invoke() {
            // TODO: Implement __invoke() method.
        }
    }
}

相关推荐

当回调作为数组的一部分传递时,不会在addsetingsfield()中调用,但会识别出它就在那里。它使用OOP将类传递到类

我正在构建一个插件,我创建了一个新的管理页面和子页面,在这个子页面中,我想添加一些设置。这就是我使用设置API构建它们的原因我正在使用Composer和面向对象编程。我有一个名为SettingsAPI的文件夹,名称空间如下namespace Blocks\\Pages\\SettingsAPI;在该文件夹中,我有三个文件:AddSettings.php, Settings.php 和SettingsLayout.php. 它们三个都正确连接。这些文件具有区分大小写的类名称。Settings.php 有一个