我所说的常量选项是指主题的属性,这些属性在生产中的日常使用中不会改变,但开发人员主要出于可重用性的目的可以更改。比如自定义帖子、边栏、表单、自定义功能等。
我认为有两种可行的方法,它们都用于WordPress的核心主题和基础主题。编辑:添加了第三种方式
函数中的参数这是我用于自定义帖子等的方式,也是WordPress用于为接受参数的函数定义默认值的方法,如wp_login_form()
或wp_nav_menu()
. 它要么是在挂接的函数中定义的变量,要么是在函数调用中定义的值。
add_action( \'init\', \'register_my_post_type\' );
function register_my_post_type() {
$labels = array(
\'name\' => __( \'my_post_type\' ),
\'singular_name\' => __( \'My Post Type\' ),
...
);
$args = array(
\'labels\' => $labels,
\'public\' => true,
...
);
register_post_type( \'my_post_type\', $args );
}
全局register_{anything}
通过将实例添加到全局范围来工作。比如说
function register_post_type( $post_type, $args = array() ) {
global $wp_post_types;
...
// validation
$post_type_object = new WP_Post_Type( $post_type, $args );
...
$wp_post_types[ $post_type ] = $post_type_object;
常数最明显的例子是wp-config.php
. WordPress将其用于大多数较小且非常基本的定义,例如数据库配置凭据和类似的内容define( \'ABSPATH\', __DIR__ . \'/\' );
或define( \'WPINC\', \'wp-includes\' );
.
PHP从5.6开始就支持将数组定义为常量,因此可以定义这些参数。我认为,如果为了简单起见,可以在单独的文件中设置这些选项,那就太好了。
其他方法,如静态变量或单例类,似乎效率很低,因此它们不在表中,但我不确定常量。
那么,使用常量
define( \'MY_OPTION1\', array(
\'key\' => \'value\'
...
));
然后像这样使用它们
add_action(\'init\', \'my_function\');
function my_function() {
some_function_that_takes_args( MY_OPTION1 );
...
}
是个坏主意吗?如果是,正确/更好的方法是什么?
我的印象是,使用常量可能是个坏主意,尽管我不知道为什么或者有多坏。那么,在性能、可用性、异常或其他编码原则方面需要考虑哪些因素呢?
SO网友:Ben
通常,您应该尽量将全局变量/常量的数量保持在最低限度。如果你没有太多的选项,第三个(常量)选项可能是个好主意,但随着时间的推移,它会变得一团糟,因为你添加了越来越多的选项。
我通常做的是,将常量范围化为相应的类,如下所示const
或返回设置值的方法。例如,如果我有一个名为Book的自定义post类型,我将创建一个处理所有相关功能的类,例如注册post类型。此外,所有主题类都可以使用名称空间来避免类名冲突,但为了简单起见,我将展示不使用名称空间的示例:
class BookPost{
const POST_TYPE = \'book\';
public static function register(){
register_post_type(self::POST_TYPE, array(\'labels\' => self::get_labels()));
}
public static function get_labels(){
return array(
\'name\' => __(\'Book\', \'MyTheme\'),
//...
);
}
}
然后,您可以从类的外部或内部调用register,而不用担心参数,例如:
add_action( \'init\', \'BookPost::register\' );
如果您需要从代码中的任何其他位置访问post类型(或其他参数),您可以使用:
BookPost::POST_TYPE;
BookPost::get_labels();
这里有几件事需要提及:
因为您不能使用表达式(例如调用__()
方法)在常量中,必须使用方法来检索更动态的值,如label这里我使用静态方法,因为这个特定的示例不需要存储状态,而且静态调用方法也更容易。当然,根据您的需求,您可能更喜欢实例化对象并使用标准的非静态方法我并不是说这是最好的方法,但这是我通常做的事情,对我来说一直很有效。另一个优点是,随着代码的增长,您可以向该类添加更多的助手方法,而无需担心传递post类型等问题。例如,您可以有如下内容:
BookPost::get_latest();
BookPost::get_all();
BookPost::get_by_genre();
同样在性能方面,在类中注册常量与在选项中使用数组常量应该不会有任何有意义的区别。