我正在编写一个插件,它使用一个类来生成自定义的帖子类型。我正在使用PHPStorm,它报告说一些变量未定义。
例如
class Custom_Post_Type {
public $post_type_name;
public $post_type_args;
public $post_type_labels;
/** Constructor */
public function __construct( $name, $args = array(), $labels = array() ) {
// Set Variables
$this->$post_type_name = strtolower( str_replace( \' \',\'_\', $name) );
$this->$post_type_args = $args;
$this->$post_type_lables = $labels;
PHPStorm报告说
$post_type_name
,
$post_type_args
, 和
$post_type_labels
是未定义的,因此是错误。
我在这段代码中也遇到了同样的错误:
public function add_taxonomy( $name, $args = array(), $labels = array() ) {
if( ! empty( $name ) ) {
// Get Post Name
$post_type_name = $this->post_type_name;
// Taxonomy Properties
$taxonomy_name = strtolower( str_replace( \' \', \'_\', $name ) );
$taxonomy_labels = $labels;
$taxonomy_args = $args;
if( ! taxonomy_exists( $taxonomy_name ) ) {
// Capitalize words and make them plural
$name = ucwords( str_replace( \'_\', \' \', $this->post_type_name ) );
$plural = self::pluralize( $name );
// Set labels with some defaults and merge in overrides
$labels = array_merge(
// Defaults
array(
\'name\' => _x( $plural, \'Post Type General Name\' ),
\'singular_name\' => _x( $name, \'Post Type Singular Name\' ),
\'search_items\' => __( \'Search\', $plural ),
\'parent_item\' => __( \'Parent \' . $name ),
\'parent_item_colon\' => __( \'Parent \' . $name . \':\' ),
\'edit_item\' => __( \'Edit\' . $name ),
\'update_item\' => __( \'Update\' . $name ),
\'add_new_item\' => __( \'Add New\' . $name ),
\'new_item_name\' => __( \'New\' . $name . \' Name\' ),
\'menu_name\' => __( $name ),
),
// Overrides
$taxonomy_labels
);
// Set default arguments and merge in overrides
$args = array_merge(
// Default Values
array(
\'label\' => $plural,
\'labels\' => $labels,
\'public\' => true,
\'show_ui\' => true,
\'show_in_nav_menus\' => true,
\'_builtin\' => false,
),
// Overrides
$taxonomy_args
);
// Create Taxonomy and Add it to the Post Type
add_action( \'init\',
function() use( $taxonomy_name, $post_type_name ) {
register_taxonomy( $taxonomy_name, $post_type_name, $args );
}
);
} else {
// Add Already-Existing Taxonomy to Post Type
add_action( \'init\',
function() use( $taxonomy_name, $post_type_name ) {
register_taxonomy_for_object_type( $taxonomy_name, $post_type_name );
}
);
}
}
}
PHPStorm告诉我
$args
在
register_taxonomy()
语句也未定义。
我的问题是,这些变量实际上是未定义的,当我启用它进行测试时,这个插件会在我面前爆炸,还是仅仅是一个PHPStorm bug/怪癖?显然,这不是我可以马上测试的东西,但我想在继续之前清除这些错误。
最合适的回答,由SO网友:jaswrks 整理而成
看起来这里有一些小混乱和语法问题。
Bad: 你包括$
设置属性值时签名。
// Set Variables
$this->$post_type_name = strtolower( str_replace( \' \',\'_\', $name) );
$this->$post_type_args = $args;
$this->$post_type_lables = $labels;
Good: 省略
$
一旦你申报了。
// Set Variables
$this->post_type_name = strtolower( str_replace( \' \',\'_\', $name) );
$this->post_type_args = $args;
$this->post_type_lables = $labels;
Good: 这也很好,你有这个权利。
public $post_type_name;
public $post_type_args;
public $post_type_labels;
关于
$args
. 很难判断第二个代码片段的确切位置,但假设它在构造函数中,我看不到
$args
闭包上下文中的变量。你需要
use($args)
如果该变量来自外部范围。
add_action( \'init\',
function() use( $taxonomy_name, $post_type_name, $args ) {
register_taxonomy( $taxonomy_name, $post_type_name, $args );
}
);
参见:
PHP closures, inheriting variables from parent scope