Пространство имен PHP 5.3 и виджет WordPress - PullRequest
12 голосов
/ 09 марта 2011

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

Я пытаюсь создать виджет 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");'));

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

(сообщение об ошибке ЗАВЕРШЕНО:

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

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

Ответы [ 5 ]

21 голосов
/ 09 марта 2011

Глядя на документацию , расположенную здесь , кажется, что требуется только имя, но для работы 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);
});
4 голосов
/ 09 марта 2011

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

<?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( );

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

3 голосов
/ 09 марта 2011

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

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

2 голосов
/ 20 мая 2015

У меня сработало нормально:

add_action('widgets_init', function() {                 
    register_widget('\a\b\c\whatever');
});
0 голосов
/ 09 марта 2011

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

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

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

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

...