12 Stimmen

PHP-Namensraum 5.3 und WordPress-Widget

Ich verwende Namespaces.

Ich versuche, ein WordPress-Widget zu erstellen (http://codex.wordpress.org/Widgets\_API)

Mit Namespaces gibt es einen Fehler, weil die Argumente nicht übergeben werden können (und ohne Namespaces funktioniert es natürlich wie gewohnt)

 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");'));

ähm... was ist die korrekte Syntax für "parent::WP_Widget" unter Verwendung von Namespaces?

(die KOMPLETTE Fehlermeldung lautet:

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

)

Und der Debugger zeigt an, dass nichts übergeben wurde:

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

(nur der $Name ist erforderlich)

1 Stimmen

Stellen Sie die genaue Fehlermeldung hier ein. Wenn man sich den Code anschaut, sieht es nicht so aus, als ob etwas falsch wäre. Warum verwenden Sie außerdem parent und nicht einfach $this->WP_Widget? Und schließlich, ist WP_Widget ein Konstruktor der WP_Widget-Klasse? Warum hat die Funktion den gleichen Namen wie die Klasse? Wenn es ein Konstruktor ist, dann besser __construct() verwenden.

0 Stimmen

Nein: es gibt sie, die Widget-Fabrik ist Teil von WordPress seit 2.8: wenn Sie in Eclipse auf WP_Widget klicken, erhalten Sie die Definition, in der sie sich befindet ... core.svn.wordpress.org/trunk/wp-includes/widgets es SOLLTE überschrieben werden und nicht durch _construct, siehe Quellcode (kann nicht helfen, habe es nicht geschrieben)

0 Stimmen

@dmitri: sowohl parent::WP_Widget als auch $this->WP_Widget liefern den gleichen Fehler, beide Varianten werden im Web verwendet. WP_Widget ist die Funktion, die nach dem CODEX überschrieben werden sollte.

22voto

RobertPitt Punkte 55763

Ein Blick in die Dokumentation hier zu finden es scheint, dass nur der Name erforderlich ist, aber die Art und Weise PHP arbeitet Ihre haben die Pre-Variablen als auch definiert.

Sie haben zwei Möglichkeiten, die Klasse zu erstellen:

  • 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()])

Vorzugsweise sollten Sie immer die __construct Methode, um Ihr Objekt zu initialisieren, würde ich Ihren Code wie folgt umschreiben:

namespace a\b\c;

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

    /*
         * Other methods!
    */
}

El WP_Widget::WP_Widget(..) Methode ist nur für PHP4 und sollte nicht in PHP 5 oder höher verwendet werden.

Nun scheint es, dass Sie PHP 5.3 verwenden, da Sie Namensräume verwenden, so dass Sie Folgendes tun können:

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

0 Stimmen

Die Funktion __construct hat es geschafft, danke, die Antwort war nur eine Minute später als berry, also habe ich berry als die Antwort markiert.

0 Stimmen

Der Zusatz regiser_widget funktioniert nicht mit dem \a\b\c\ enthalten, da es sich im Namespace-Bereich befindet. Wenn ich den Namespace-Teil entferne, wird "Warning: Unzulässiger Offset-Typ in C:\xampp\htdocs\wp2\wp -einschließlich \widgets.php auf Zeile 324" so... ich verwende den Code in der Frage für jetzt und werde später überprüfen, wie dies zu tun. danke.

1 Stimmen

Kapseln Sie einfach die a\b\c\whatever innerhalb einer Zeichenkette und entfernen Sie das neue Schlüsselwort, kann es an der Art liegen, wie Wordpress den Wert verwendet.

3voto

ThiefMaster Punkte 297146

Sie möchten eine übergeordnete Methode aufrufen? Verwenden Sie einfach parent::MethodName();

Wenn Sie den übergeordneten Konstruktor aufrufen wollen, verwenden Sie parent::__construct() - wenn Ihr Konstruktor wie die Klasse benannt ist, benennen Sie ihn um in __construct was seit Jahren der bevorzugte Name für einen Konstruktor ist...

0 Stimmen

Danke, ich muss etwas im bereits mit Elternteil::WP_Widget() bereits aber im wahrscheinlich etwas übersehen werden?

3voto

Berry Langerak Punkte 17907

Es scheint mir, dass Ihr Problem nicht in den Namespaces liegt, der folgende Code funktioniert wie ein Charme:

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

Wenn Sie eine Fehlermeldung erhalten, könnte es hilfreich sein, den Inhalt der Meldung anzugeben.

0 Stimmen

@berry-langerak: Gut zu wissen, dass es nicht an meiner Syntax liegt GRIN. Dann... was ist es? Die übergeordnete Klasse ist Standard: core.svn.wordpress.org/trunk/wp-includes/widgets

1 Stimmen

Es scheint, dass Wordpress eine Proxy-Methode für die alten PHP 4-Typ-Konstruktoren hat (igitt). Sie sollten vielleicht erwägen, stattdessen parent::__construct( ) zu verwenden. Wenn Sie __construct( ) aufrufen, müssen Sie außerdem sicherstellen, dass Sie es mit mindestens zwei Parameter.

5 Stimmen

Warum markieren Sie eine Antwort als richtig, wenn sie nicht einmal eine direkte Antwort auf Ihre Frage ist? Wenn die Kommentare zur Lösung des Fehlers führen, aktualisieren Sie bitte Ihren Beitrag.

2voto

Pablo S G Pacheco Punkte 2360

Das hat bei mir gut funktioniert:

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

0 Stimmen

Register_widget akzeptiert sowohl Klassenname als auch Instanz. Wenn Sie einen Klassennamen verwenden müssen, verwenden Sie \a\b\c\whatever::class stattdessen.

0voto

cj5 Punkte 765

Sie können auch die PHP-eigene get_class Methode, die den Namen jeder Klasseninstanziierung als String zurückgibt.

https://www.php.net/manual/en/function.get-class.php

register_widget(get_class(new \UCI\Wordpress\Widget\Footer()));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X