【问题标题】:PHP: parent::somefunction or $this->somefunctionPHP: parent::somefunction 或 $this->somefunction
【发布时间】:2010-09-13 03:43:13
【问题描述】:

实际上,当我查看有关小部件的 thw wordpress codex 时,这个问题突然出现了,但我认为它更像是一个 PHP 问题。实际上这里有 3 个问题:

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

  2. 我还注意到我使用了 PHP4 构造函数 WP_Widget 而不是 __construct。仅仅是出于兼容性原因吗?我也可以使用$this->__construct 对吗?

  3. 我试过了……

    // 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\pos​​t-product.php 在第 137 行调用堆栈:0.0002 331328 1. {main}() D:\Projects\Websites\wordpress\wp-admin\widgets.php:0 0.0008 331592 2.require_once('D:\Projects\Websites\wordpress\wp-admin\admin.php') D:\Projects\Websites\wordpress\wp-admin\widgets.php:10 0.0013 331848 3.require_once('D:\Projects\Websites\wordpress\wp-load.php') D:\项目\网站\wordpress\wp-admin\admin.php:20 0.0020 332224 4.require_once('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) );

}

【问题讨论】:

  • Wordpress 以其不一致的编码风格和糟糕的代码库而闻名。我不会试图理解为什么其中的代码是这样的。

标签: php wordpress


【解决方案1】:

我还注意到我使用了 PHP4 构造函数 WP_Widget 而不是 __construct。仅仅是出于兼容性原因吗?我也可以使用 $this->__construct 对吗?

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

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

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

【讨论】:

  • 嗯,但我仍然不明白为什么如果我使用 pp_widget 而不是 __construct 它会工作,因为 __construct() = pp_widget()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
相关资源
最近更新 更多