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)
Ответы
Ответ 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.
Здесь вы должны указать точный код ошибки.