PHP:parent::somefunction或$this->;某些函数

PHP:parent::somefunction或$this->;某些函数,php,wordpress,Php,Wordpress,事实上,这个问题是在我看wordpress codex关于Widget的时候提出来的,但我认为它更像是一个PHP问题。这里有三个问题: 为什么codex和书使用了两种看似不同的方法来构建小部件。codex使用parent::WP_Widget(静态方法?)和book使用$this->WP_Widget(实例方法?)会有什么区别吗 我还注意到我使用了PHP4构造函数WP\u小部件,而不是\uu构造函数。这仅仅是出于兼容性的原因吗?我也可以使用$this->\u构造对吗 我试过 // in pp_w

事实上,这个问题是在我看wordpress codex关于Widget的时候提出来的,但我认为它更像是一个PHP问题。这里有三个问题:

  • 为什么codex和书使用了两种看似不同的方法来构建小部件。codex使用
    parent::WP_Widget
    (静态方法?)和book使用
    $this->WP_Widget
    (实例方法?)会有什么区别吗

  • 我还注意到我使用了PHP4构造函数
    WP\u小部件
    ,而不是
    \uu构造函数
    。这仅仅是出于兼容性的原因吗?我也可以使用
    $this->\u构造
    对吗

  • 我试过

    // in pp_widget class extends WP_Widget
    function __construct() {
        $this->WP_Widget(...); // or $this->__construct(...) 
    }
    
  • 它失败了

    致命错误:最大函数嵌套 已达到“100”级别,正在中止!在里面 D:\Projects\Websites\wordpress\wp content\plugins\post-product\post-product.php 在线137调用堆栈:0.0002 331328 1.{main}()D:\Projects\Websites\wordpress\wp admin\widgets.php:0 0.0008 331592 2. 需要\u一次('D:\Projects\Websites\wordpress\wp admin\admin.php') D:\Projects\Websites\wordpress\wp admin\widgets.php:10 0.0013 331848 3. 需要\u一次('D:\Projects\Websites\wordpress\wp load.php') D:\Projects\Websites\wordpress\wp admin\admin.php:20 0.0020 332224 4. 只需要一次('D:\Projects\Websites\wordpress\wp config.php') D:\项目

    在wordpress法典中:

    class FooWidget extends WP_Widget {
        /** constructor */
        function FooWidget() {
            parent::WP_Widget(false, $name = 'FooWidget');  
        }
    
    从专业的wordpress这本书中

    class pp_widget extends WP_Widget {
        function pp_widget() {
            $this->wp_widget(...);
        }
    
    构造函数的底层wordpress代码

    function WP_Widget( $id_base = false, $name, $widget_options = array(), $control_options = array() ) {
        $this->__construct( $id_base, $name, $widget_options, $control_options );
    }
    ...
    function __construct( $id_base = false, $name, $widget_options = array(), $control_options = array() ) {
        $this->id_base = empty($id_base) ? preg_replace( '/(wp_)?widget_/', '', strtolower(get_class($this)) ) : strtolower($id_base);
        $this->name = $name;
        $this->option_name = 'widget_' . $this->id_base;
        $this->widget_options = wp_parse_args( $widget_options, array('classname' => $this->option_name) );
        $this->control_options = wp_parse_args( $control_options, array('id_base' => $this->id_base) );
    
    }

    我还注意到我使用了PHP4构造函数
    WP\u小部件
    ,而不是
    \uu构造函数
    。这仅仅是出于兼容性的原因吗?我也可以用$this->\u构造,对吗

    你可以。我倾向于使用
    \u构造函数
    ,因为A)它没有歧义,B)如果重构类名,我不必更改名称

    i tried ...
    // in pp_widget class extends WP_Widget
    function __construct() {
        $this->WP_Widget(...); // or $this->__construct(...) 
    }
    
    在PHP中,保留函数名
    \uu construct
    是与类同名的方法的别名。它通常由
    $my_object=new MyClass()调用。毫无疑问,这是一个无限递归循环,因为对象继承了这些方法

    我还注意到我使用了PHP4构造函数
    WP\u小部件
    ,而不是
    \uu构造函数
    。这仅仅是出于兼容性的原因吗?我也可以用$this->\u构造,对吗

    你可以。我倾向于使用
    \u构造函数
    ,因为A)它没有歧义,B)如果重构类名,我不必更改名称

    i tried ...
    // in pp_widget class extends WP_Widget
    function __construct() {
        $this->WP_Widget(...); // or $this->__construct(...) 
    }
    

    在PHP中,保留函数名
    \uu construct
    是与类同名的方法的别名。它通常由
    $my_object=new MyClass()调用。毫不奇怪,这是一个无限递归循环,因为对象继承了这些方法。

    Wordpress以其不一致的编码风格和可怕的代码库而闻名。我不会试图去理解为什么这里的代码是这样的。Wordpress以其不一致的编码风格和糟糕的代码库而闻名。我不想试着去理解为什么代码是这样的。嗯,但是我仍然不明白为什么如果我用
    pp\u widget
    而不是
    \uu construct
    它会工作,因为
    \uu construct()=pp\u widget()
    hmm,但是我仍然不明白为什么我用
    pp\u widget
    而不是
    \uu-construct
    它会工作,因为
    \uu-construct()=pp\u-widget()