Aufruf einer Member-Funktion für ein Nicht-Objekt [duplicate]
Lesezeit: 4 Minuten
Scott Gotttreu
Also überarbeite ich meinen Code, um mehr OOP zu implementieren. Ich habe eine Klasse eingerichtet, um Seitenattribute zu speichern.
class PageAtrributes
{
private $db_connection;
private $page_title;
public function __construct($db_connection)
{
$this->db_connection = $db_connection;
$this->page_title="";
}
public function get_page_title()
{
return $this->page_title;
}
public function set_page_title($page_title)
{
$this->page_title = $page_title;
}
}
Später rufe ich die Funktion set_page_title() so auf
function page_properties($objPortal) {
$objPage->set_page_title($myrow['title']);
}
Dabei erhalte ich die Fehlermeldung:
Aufruf einer Member-Funktion set_page_title() für ein Nicht-Objekt
Was fehlt mir also?
Dieses objPage verweist nicht auf eine Instanz des PageAtrributes-Objekts (oder überhaupt eines Objekts). Probieren Sie einen var_dump in der vorherigen Zeile aus, um zu sehen, was es tatsächlich ist.
– Adam Wright
10. September 2008 um 16:20 Uhr
Erstellen Sie erstens eine Instanz der Klasse, zweitens definieren Sie sie wie folgt: $new_instance = new Class(); dann leiten Sie es zu Ihrer Methode wie: $new_instance->set_page_title(‘MyNewTitle’);
– Jurijs Nesterovs
3. Juni 2013 um 14:00 Uhr
Allain Lalonde
Das bedeutet es $objPage ist keine Instanz eines Objekts. Können wir den Code sehen, mit dem Sie die Variable initialisiert haben?
Da Sie einen bestimmten Objekttyp erwarten, können Sie auch darauf zurückgreifen PHPs Type-Hinting-FunktionDokumente um den Fehler zu erhalten, wenn Ihre Logik verletzt wird:
function page_properties(PageAtrributes $objPortal) {
...
$objPage->set_page_title($myrow['title']);
}
Diese Funktion akzeptiert nur PageAtrributes für den ersten Parameter.
David Urry
Es gibt eine einfache Möglichkeit, diesen Fehler zu erzeugen:
$joe = null;
$joe->anything();
Wird den Fehler rendern:
Schwerwiegender Fehler: Aufruf einer Member-Funktion anything() auf einem Nicht-Objekt in /Applications/XAMPP/xamppfiles/htdocs/casMail/dao/server.php in Zeile 23
Es wäre viel besser, wenn PHP würde nur sagen,
Schwerwiegender Fehler: Anruf von Joe ist nicht definiert, weil (a) Joe null ist oder (b) Joe nicht definiert anything() in Zeile <##>.
Normalerweise haben Sie Ihre Klasse so aufgebaut $joe ist nicht im Konstruktor definiert oder
Na und, ich habe heute danach gesucht. Was David über die Reproduktion dieses Fehlers geschrieben hat, bestätigte meine Vermutung, die ich sonst testen müsste. 🙂
– oli.G
18. Juli 2013 um 12:16 Uhr
Danke David für die Erklärung. Dies ist für mich hilfreicher als die obige Antwort, da es die Dinge in einfacherer Sprache erklärt, sodass ich die Dinge selbst weiter untersuchen kann, anstatt einen neuen Thread mit demselben Problem erstellen zu müssen, da die obige Antwort mir immer noch keine Hilfe ist .
– Andrew-ThinkUp
18. Januar 2017 um 21:29 Uhr
Dipolmoment
Entweder $objPage ist keine Instanzvariable ODER Sie überschreiben $objPage mit etwas, das keine Instanz der Klasse ist PageAttributes.
function page_properties($objPortal) {
$objPage->set_page_title($myrow['title']);
}
sieht aus wie unterschiedliche Namen der Variablen $objPortal vs $objPage
Steve Breese
Ich empfehle die akzeptierte Antwort oben. Wenn Sie jedoch in Not sind, können Sie das Objekt innerhalb von als global deklarieren Seiteneigenschaften Funktion.
$objPage = new PageAtrributes;
function page_properties() {
global $objPage;
$objPage->set_page_title($myrow['title']);
}
Ich wusste es erst heute… OMG. Ganz anders bei Java.
– Gumuruh
19. März 2012 um 10:13 Uhr
ja … das hatte ich auch vergessen
– Mirko
7. November 2012 um 11:59 Uhr
-1: das ist das Schlechteste mögliche Lösung
– teresko
25. November 2012 um 19:58 Uhr
@tereško, könnten Sie erläutern, warum dies eine schlechte Praxis ist?
– Matt Clark
28. Mai 2014 um 1:36 Uhr
@MattClark, weil es sich auf die Verwendung des globalen Zustands bezieht.
– teresko
28. Mai 2014 um 4:17 Uhr
Scott Gotttreu
Mir wurde klar, dass ich nicht bestand $objSeite hinein page_properties(). Es funktioniert jetzt gut.
Ich wusste es erst heute… OMG. Ganz anders bei Java.
– Gumuruh
19. März 2012 um 10:13 Uhr
ja … das hatte ich auch vergessen
– Mirko
7. November 2012 um 11:59 Uhr
-1: das ist das Schlechteste mögliche Lösung
– teresko
25. November 2012 um 19:58 Uhr
@tereško, könnten Sie erläutern, warum dies eine schlechte Praxis ist?
– Matt Clark
28. Mai 2014 um 1:36 Uhr
@MattClark, weil es sich auf die Verwendung des globalen Zustands bezieht.
– teresko
28. Mai 2014 um 4:17 Uhr
Ahmad
Sie können ‘use’ in der Funktion wie im folgenden Beispiel verwenden
function page_properties($objPortal) use($objPage){
$objPage->set_page_title($myrow['title']);
}
9929000cookie-checkAufruf einer Member-Funktion für ein Nicht-Objekt [duplicate]yes
Dieses objPage verweist nicht auf eine Instanz des PageAtrributes-Objekts (oder überhaupt eines Objekts). Probieren Sie einen var_dump in der vorherigen Zeile aus, um zu sehen, was es tatsächlich ist.
– Adam Wright
10. September 2008 um 16:20 Uhr
Erstellen Sie erstens eine Instanz der Klasse, zweitens definieren Sie sie wie folgt: $new_instance = new Class(); dann leiten Sie es zu Ihrer Methode wie: $new_instance->set_page_title(‘MyNewTitle’);
– Jurijs Nesterovs
3. Juni 2013 um 14:00 Uhr