2011-03-09 3 views
12

Я использую пространства имен.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");')); 

ммм ... что такое правильный синтаксис для 'родительского :: 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 

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

+1

Сообщения точного сообщения об ошибке здесь. От взгляда на код не похоже, что что-то не так. Также почему вы используете родительский, а не только $ this-> WP_Widget? И, наконец, WP_Widget является конструктором класса WP_Widget? Почему функция имеет то же имя, что и класс? Если это конструктор, то лучше использовать __construct() – Dmitri

+0

no: есть, фабрика виджета является частью WordPress с 2.8: если вы нажмете Eclipse на WP_Widget, вы получите определение, которое находится в ... http: // core. svn.wordpress.org/trunk/wp-includes/widgets ДОЛЖЕН быть перезаписан, а не _construct, см. исходный код (не могу помочь, он его не написал) – edelwater

+0

@dmitri: оба родителя :: WP_Widget и $ this-> WP_Widget доставлять одна и та же ошибка, оба варианта используются в Интернете. WP_Widget - это функция, которая должна быть перезаписана в соответствии с CODEX. – edelwater

ответ

4

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

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

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

+0

@ berry-langerak: Приятно знать, что это не мой синтаксис GRIN. Тогда что это? Родительский класс по умолчанию: core.svn.wordpress.org/trunk/wp-includes/widgets – edelwater

+1

Кажется, что Wordpress имеет прокси-метод для старых конструкторов типа PHP 4 (yugh). Возможно, вы захотите рассмотреть возможность использования parent :: __ construct(). Кроме того, при вызове __construct() обязательно вызывайте его с * как минимум * двумя параметрами. –

+0

Функция __construct сделала трюк спасибо! – edelwater

3

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

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

+0

спасибо, я должен упустить что-то im уже с помощью parent :: WP_Widget() уже, но я, вероятно, что-то пропускаю? – edelwater

20

Если посмотреть на документацию located here, кажется, что требуется только имя, но, как работает 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); 
}); 
+0

Функция __construct сделала трюк, спасибо, ответ был всего лишь минутой позже, чем ягода, поэтому я назвал ягоду ответом. – edelwater

+0

дополнение regiser_widget не работает с \ a \ b \ c \ в нем, поскольку оно находится в области пространства имен. Если я удалю часть пространства имен, это даст «Warning: Illegal offset type in C: \ xampp \ htdocs \ wp2 \ wp-includes \ widgets.php в строке 324", поэтому ... я использую код в вопросе на данный момент и буду проверьте позже, как это сделать. Благодарю. – edelwater

+1

Просто инкапсулируйте 'a \ b \ c \ whatever' в строку и удалите новое ключевое слово, возможно, это зависит от того, как Wordpress использует это значение. – RobertPitt

0

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

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

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

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

+0

Я отправил полный точный код ошибки, я могу добавить трассировку стека? – edelwater

2

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

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