自定义发布类型对象-未定义的变量

时间:2017-11-16 作者:Cedon

我正在编写一个插件,它使用一个类来生成自定义的帖子类型。我正在使用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告诉我$argsregister_taxonomy() 语句也未定义。

我的问题是,这些变量实际上是未定义的,当我启用它进行测试时,这个插件会在我面前爆炸,还是仅仅是一个PHPStorm bug/怪癖?显然,这不是我可以马上测试的东西,但我想在继续之前清除这些错误。

1 个回复
最合适的回答,由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

结束

相关推荐

Functions are causing errors

我在插件的PHP上声明一个函数。插件在每个帖子的顶部加载代码(帖子布局是插件的名称)。无法在/home/content/08/10290908/html/wp-content/plugins/post-layout/plugin.php(181):eval()\'d code:4)中重新声明vote\\u-up()(之前在/home/content/08/102908/html/wp-content/plugins/post-layout/plugin.php中声明)。php(181):第36行的eval