Trying to get property of non-object

Shorty1968

Erfahrenes Mitglied
Hallo ich habe für das Kundenbereich Plugin mir eine Infobox Plugin erstellt,es Funktionierte bis heute ohne Probleme aber seit dem Backup einspielen bekomme ich.
Code:
Fatal error: PHP notice in file /var/www/vhosts/domain.xy/httpdocs/wcf/lib/system/event/listener/CustomerInfoboxListener.class.php (11): Trying to get property of non-object
Information:
error message: PHP notice in file /var/www/vhosts/domain.xy/httpdocs/wcf/lib/system/event/listener/CustomerInfoboxListener.class.php (11): Trying to get property of non-object
error code: 0
file: /var/www/vhosts/domain.xy/httpdocs/wcf/lib/system/WCF.class.php (281)
php version: 5.3.3-7+squeeze17
wcf version: 1.1.10 pl 1 (Tempest)
date: Sun, 15 Sep 2013 18:44:51 +0000
request: /index.php
referer: http://domain.xy/index.php?action=UserLogout&t=db352fde5ba08d0976547a9821210d1a13327094
Stacktrace:
#0 /var/www/vhosts/domain.xy/httpdocs/wcf/lib/system/event/listener/CustomerInfoboxListener.class.php(11): WCF::handleError(8, 'Trying to get p...', '/var/www/vhosts...', 11, Array)
#1 /var/www/vhosts/domain.xy/httpdocs/wcf/lib/system/event/EventHandler.class.php(207): CustomerInfoboxListener->execute(Object(StructuredTemplate), 'StructuredTempl...', 'shouldDisplay')
#2 /var/www/vhosts/domain.xy/httpdocs/wcf/lib/system/template/Template.class.php(255): EventHandler::fireAction(Object(StructuredTemplate), 'shouldDisplay')
#3 /var/www/vhosts/domain.xy/httpdocs/lib/system/WBBCore.class.php(59): Template->display('offline')
#4 /var/www/vhosts/domain.xy/httpdocs/wcf/lib/system/WCF.class.php(100): WBBCore->initTPL()
#5 /var/www/vhosts/domain.xy/httpdocs/global.php(20): WCF->__construct()
#6 /var/www/vhosts/domain.xy/httpdocs/index.php(7): require_once('/var/www/vhosts...')
#7 {main}
Was bedeutet das und was muss gemacht werden um es zu beheben?

ich habe schon über Google Recherchiert und den Ordner wcf/templates/complide geleert,aber ohne erfolg.

Der inhalt der .php Datei die den Fehler verursacht sieht so aus.
Code:
<?php
// wcf imports
require_once(WCF_DIR.'lib/system/event/EventListener.class.php');

class CustomerInfoboxListener implements EventListener {
    /**
    * @see    EventListener::execute()
    */
    public function execute($eventObj, $className, $eventName) {
    
        if (WCF::getRequest()->page != 'ProductPage' && WCF::getRequest()->page != 'CustomerPage') {
            return;
            }
        
        // display
        WCF::getTPL()->append('customerInfobox', WCF::getTPL()->fetch('customerInfobox'));
    }
}
?>
 
Schreib mal in Zeile 10: var_dump(WCF::getRequest());

Das liefert vermutlich etwas, was kein Objekt ist.

Wenn ich raten sollte: An der Stelle ist das Request-Objekt noch nicht initialisiert. Das kann aber Quatsch sein. Das wäre eine Frage, bei der dir sicher tendenziell der Support des Herstellers besser helfen kann.

Oder versuch mal so:

PHP:
$request = WCF::getRequest();

if ($request->page != 'ProductPage' && $request->page != 'CustomerPage') {

Ich weiß gerade nicht, ob die PHP-Entwickler an der Stelle jüngst was geändert haben, was das direkte Dereferenzieren angeht. Ich glaube aber nicht.
 
Zuletzt bearbeitet:
Das ist eine eigene Erweiterung von mir,daher müsste ich mich mit dem Support an mich wenden.:rolleyes:

Aber ich bin was das Programmieren angeht noch anfänger,ich habe mal den var_dump gemacht und das ist das ergebniss.
Code:
object(RequestHandler)#27 (5) { ["type"]=> string(4) "page" ["page"]=> string(11) "ProductPage" ["action"]=> string(0) "" ["form"]=> string(0) "" ["controllerObj":protected]=> NULL }
object(RequestHandler)#27 (5) { ["type"]=> string(4) "page" ["page"]=> string(12) "StatusPMPage" ["action"]=> string(0) "" ["form"]=> string(0) "" ["controllerObj":protected]=> NULL }
object(RequestHandler)#27 (5) { ["type"]=> string(4) "page" ["page"]=> string(16) "PMLiveUpdatePage" ["action"]=> string(0) "" ["form"]=> string(0) "" ["controllerObj":protected]=> NULL }

Ich habe noch andere Erweiterung mit dem Fast den selben inhalt im Eventlistener,aber keines macht solche Probleme wie dieser hier.

Vielen dank aber das scheint zu Funktionieren,die Fehlermeldung ist weg.
Code:
$request = WCF::getRequest();

if ($request->page != 'ProductPage' && $request->page != 'CustomerPage') {
 
Das ist allerdings etwas eigenartig. Ich habe gerade mit so einem Online-Tool entsprechenden Code auch auf PHP 5.3.3 getestet. Foo::getBar()->baz sollte auch dort funktionieren.

Wenn das, was du beschreibst, so passt, ist die beste Erklärung, dass getRequest() nur einmal den Request zurückliefert und danach nichts mehr. Die Erklärung ist nur leider ziemlich unsinnig.

Na ja.
 
Mit diesem: http://sandbox.onlinephpfunctions.com/

Da kannst du die PHP-Version einstellen. Ich habe hier derzeit selbst keine 5.3-Installation mehr zur Verfügung.

Was könnte dir ursache dafür sein das getRequest() nur einmal in meinem Code geliefert wurde?

Das wird nicht das sein, was passiert. Das ist nur die einzige Erklärung, die mir zu den Symptomen einfällt. Wenn du das explizit ausschließen willst, führ mal über der if-Bedingung das hier aus: var_dump(WCF::getRequest()->page, WCF::getRequest()->page); Wenn das nicht zu einem Fehler führt, liegt es nicht daran.
 
Wenn ich den var_dump in der Datei mache die es betrifft,kommt es auf allen Seiten zu einer Fehlermeldung,ich habe mal Drei zum anschauen genommen.
Code:
string(9) "IndexPage" string(9) "IndexPage"
string(10) "PortalPage" string(10) "PortalPage"
string(11) "ProductPage" string(11) "ProductPage"
Sie haben alle den Selben fehler , es ändern sich nur die Page Namen.
 
Das heißt, das hier…

PHP:
var_dump(WCF::getRequest()->page, WCF::getRequest()->page);

if (WCF::getRequest()->page != 'ProductPage' && WCF::getRequest()->page != 'CustomerPage') {
    return;
}

…gibt erst zweimal den korrekten Wert aus und verabschiedet sich dann in der nächsten Codezeile mit einer Fehlermeldung, während das hier…

PHP:
$request = WCF::getRequest();
 
if ($request->page != 'ProductPage' && $request->page != 'CustomerPage') {
    return;
}

…korrekt funktioniert?

Da fällt mir nichts mehr zu ein außer: Das kann eigentlich nicht sein.
 
Das hier läuft unter 5.3.3 laut dem Online-Tool einwandfrei:

- http://sandbox.onlinephpfunctions.com/code/c66183aa6df07a50f9056e978f477180ae3fa99a

Du interpretierst höchstwahrscheinlich bei deinen Tests/beim Debugging irgendwas verkehrt oder übersiehst etwas, denn die Syntax ist offenbar korrekt.

PS: Ich drücke mich übrigens so vorsichtig aus, weil ich nicht vor deinem Rechner sitze und letztlich nicht beurteilen kann, was du tust. Ich kann es deshalb für dich auch nicht debuggen, sondern weiß nur das, was du mitteilst. Ich behaupte zudem nicht, alle Eigenheiten einer über drei Jahre alten PHP-Version noch im Kopf zu haben. Das ist aber im Grunde reine Höflichkeit (benefit of the doubt) und hat nichts mit meiner Erfahrung zu tun. Fragesteller kommen einfach oftmals nicht mit durchdachten und abgewogenen Antworten klar, weil sie sie inhaltlich nicht beurteilen können. Das ist so ein allgemeines Problem. Wenn du es absolut willst: You’re doing it wrong. :) PHP lügt bei derlei Sachen nicht.
 
Zurück