类中的动态方法名称?

时间:2017-03-29 08:20:15

标签: php wordpress oop methods

我想在实例化一个类时能够传递一个名称,该名称将用于为该类中的方法名称添加前缀,到目前为止我有这个

<?php
if ( ! class_exists( 'My_Class' ) ) {
    /**
     * Creates filter method
     *
     * @since  1.0.0
     */
    class My_Class {

        /**
         * Prefix for method names
         *
         * @var string $name Name of the filter prefix.
         */
        private $name;

        /**
         * Version.
         *
         * @var string
         */
        private $version = '1.0.0';

        /**
         * Initialize the class and set its properties.
         *
         * @since 1.0.0
         * @param string $name    The name for the method prefix.
         * @param string $version The version of this plugin.
         */
        public function __construct( $name, $version ) {
            $this->name = $name;
            $this->version = $version;
            add_filter( 'my_filter_name', $name . '_my_folder' );
        }

        /**
         * Function for filtering folder array
         *
         * Each plugin has to set its own array of paths and url.
         *
         * @param  array $import_array Array with folder values.
         * @return array               Modified array with folder values.
         */
        public function $name . _my_folder() {
            $import_array[$this->name]['folder']     = plugin_dir_path( __FILE__ ) . 'includes/layout';
            $import_array[$this->name]['folder_url'] = plugin_dir_url( __FILE__ ) . 'includes/layout';
            return $import_array;
        }

    }
}

我的想法就是把它称为

$first_object = new My_Class( 'first' );
$second_object = new My_Class( 'second' );

这样我就可以在多个相同的插件中使用它,具有不同的名称,具体取决于插件的类型。

明显的问题是function $name . _my_folder()

我读了一些关于__call()魔术方法的内容,但我不确定在这种情况下是否可以使用它,或者如何应用它。

可以这样做吗?

2 个答案:

答案 0 :(得分:1)

为什么不制作方法的名称参数?

像这样:

add_filter('my_filter_name', [$this, 'methodName'], 10, 1);

第三个参数是过滤器的优先级,第四个参数是接受的参数号。

public function methodName($name) {}

并将其称为:

apply_filters('my_filter_name', $value, $arg);

答案 1 :(得分:-1)

我不是专家,但我认为您必须在构造函数中指定默认版本...我不确定,但您可以尝试。

    public function __construct( $name, $version="1.0.0" ) {
        $this->name = $name;
        $this->version = $version;
        add_filter( 'my_filter_name', $name . '_my_folder' );
    }