繁体   English   中英

PHP:parent :: somefunction或$ this-> somefunction

[英]PHP: parent::somefunction or $this->somefunction

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

  1. 为什么手抄本和这本书使用2种看似不同的方法来构造窗口小部件。 抄本使用parent::WP_Widget (静态方法?),而书使用$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',正在中止! 在第137行的D:\\ Projects \\ Websites \\ wordpress \\ wp-content \\ plugins \\ post-product \\ post-product.php中调用堆栈: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:\\ Projects \\ Websites \\ wordpress \\ wp-admin \\ admin.php:20 0.0020 332224 4. require_once('D :\\ Projects \\ Websites \\ wordpress \\ wp-config.php')D:\\ Projects

在Wordpress Codex中:

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_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();调用$my_object = new MyClass(); 这是一个无限递归循环,这并不奇怪,因为该对象继承了这些方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM