Подтвердить что ты не робот

PHP Namespace 5.3 и WordPress Widget

Я использую пространства имен.

Я пытаюсь создать виджет WordPress (http://codex.wordpress.org/Widgets_API)

В пространствах имен следующее сообщение дает ошибку, потому что аргументы не могут быть переданы (и без пространств имен явно работает как обычно)

 namespace a\b\c;
 class whatever extends \WP_Widget {
   function whatever() {
     parent::WP_Widget('name1', 'name2');
   }
 // .. other functions left out
 }
 add_action('widgets_init',
 create_function('', 'return register_widget("a\b\c\whatever");'));

uhm... что такое правильный синтаксис для 'parent:: WP_Widget' с использованием пространств имен?

(сообщение COMPLETE:

Warning: Missing argument 2 for WP_Widget::__construct(), called in 
C:\xampp\htdocs\wp2\wp-includes\widgets.php on line 324 and defined in 
C:\xampp\htdocs\wp2\wp-includes\widgets.php on line 93

)

И отладчик показывает, что ничего не передано:

Variables in local scope (#14)
$control_options = Undefined
$id_base = boolean false 
$name = Undefined
$widget_options =  Undefined

(требуется только $name)

4b9b3361

Ответ 1

Мне кажется, что ваша проблема не в пространствах имен, следующий код работает как прелесть:

<?php
namespace Foo;

class Bar {
    function __construct( $foo ) {
        echo "$foo\n";
    }
}

namespace Foo\Bar;

class Foo extends \Foo\Bar {
    function __construct( ) {
        parent::__construct( "This should work." );
    }
}

$foo = new \Foo\Bar\Foo( );

Если вы получите сообщение об ошибке, может быть полезно указать, что он говорит.

Ответ 2

Глядя на документацию расположенную здесь, кажется, что требуется только имя, но способ, которым PHP работает, должен иметь предварительно определенные переменные также.

У вас есть два способа создания класса:

  • A:
    • WP_Widget __construct ([string $id_base = false], string $name, [array $widget_options = array()], [array $control_options = array()])
  • B:
    • WP_Widget WP_Widget ([ $id_base = false], $name, [ $widget_options = array()], [ $control_options = array()])

По желанию вы всегда должны использовать метод __construct для инициализации своего объекта, я бы переписал вам код следующим образом:

namespace a\b\c;

class whatever extends \WP_Widget
{
    function __construct()
    {
        parent::__construct('name1', 'name2');
    }

    /*
         * Other methods!
    */
}

Метод WP_Widget::WP_Widget(..) предназначен только для PHP4 и не должен использоваться в PHP 5 или выше.

Теперь кажется, что вы используете PHP 5.3 в качестве своих имен, чтобы вы могли сделать следующее:

add_action('widgets_init', function() {
    return register_widget(new a\b\c\whatever);
});

Ответ 3

Вы хотите вызвать родительский метод? Просто используйте parent::MethodName();

Если вы хотите вызвать родительский конструктор, используйте parent::__construct() - если ваш конструктор назван как класс, переименуйте его в __construct, который является предпочтительным именем для конструктора в течение многих лет...

Ответ 4

Это работало отлично для меня:

add_action('widgets_init', function() {                 
    register_widget('\a\b\c\whatever');
});

Ответ 5

Я не использую Wordpress, но, глядя на это, он выглядит из-за очень плохого дизайна Wordpress. Кажется, что они используют статическую функцию WP_Widget, которая служит factory, но имеет то же имя, что и имя класса. Они должны были назвать его factory, если это действительно просто factory.

Кроме того, из того, что вы разместили в своем комментарии, возможно, вам нужно создать статическую функцию WP_Widget() в вашем подклассе, а затем даже не вызвать родителя. Если script действительно хочет, чтобы вы переопределили WP_Widget, тогда это то, что вы должны сделать.

Но опять же, я никогда не использовал Wordpress, это трудно сказать, не глядя на script.

Здесь вы должны указать точный код ошибки.