Ich lese einen PHP-Code, den ich nicht verstehen konnte:
class foo {
function select($p1, $dbh=null) {
if ( is_null($dbh) )
$dbh = $this->dbh ;
return;
}
function get() {
return $this->dbh;
}
}
Ich kann nicht finden $this->dbh ($dbh) Erklärung der Klasse. Meine Fragen sind:
Welchen Wert hat $this->dbh ?
Ist es eine lokale Variable für die Funktion select()?
Tut $this gehören class fooDatenmitglied von ? Warum gibt es keine Deklaration für $dbh in dieser Klasse?
Es sei denn, Sie haben keinen Code eingefügt, der definiert $dbh für die Klasse oder eine Klasse, die sie erweitert, tut dieser Code nichts. Was @Unsigned gesagt hat, ist wahr: Wenn auf eine Eigenschaft verwiesen wird, die nicht existiert, wird sie stillschweigend erstellt. In diesem Fall gibt dieser Code jedoch IMMER null zurück. STETS. $this->dbh wird nie gesetzt, sondern nur verwendet, um andere Variablen zu setzen, was bedeutet, egal was Sie tun, get() gibt IMMER null zurück. Ich denke, Sie haben vielleicht einen relevanten Code ausgelassen, oder die Person, die dies geschrieben hat, ist völlig verrückt.
– rockerest
31. März 2011 um 1:56 Uhr
Es ist nur eine Klasse, ich denke, um Ihre Fragen zu beantworten, müssen wir etwas mehr Code haben, in dem Sie das Objekt dieser Klasse tatsächlich deklarieren
– Chetan Sharma
31. März 2011 um 2:31 Uhr
WordPress-Frage
PHP ist bei der Deklaration nicht streng. $this->dbh ist ein Klassenmitglied. Ich habe den folgenden Code, um das Konzept zu verstehen:
class foo {
function foo(){
$this->dbh = "initial value";
}
function select($p1, $dbh=null) {
if ( is_null($dbh) )
$dbh = $this->dbh ;
return;
}
function get() {
return $this->dbh;
}
}
Es ist dasselbe wie:
class foo {
var $dbh = "initial value";
function select($p1, $dbh=null) {
if ( is_null($dbh) )
$dbh = $this->dbh ;
return;
}
function get() {
return $this->dbh;
}
}
Ohne Vorzeichen
PHP ist nicht streng, wenn es darum geht, Klasseneigenschaftsdeklarationen zu verlangen.
Auf Zuweisungwird die Eigenschaft im Hintergrund erstellt.
Abgelesen eine nicht vorhandene Eigenschaft generiert einen Hinweis, wenn E_STRICT aktiviert.
Der Standardwert für alle nicht definierten Eigenschaften ist NULL
… und das ist ein schreckliches Verhalten von Php (kann manchmal nützlich sein, aber …) Deshalb – werfen Sie einen Blick auf Nette\Object, das Php zu einer vernünftigeren Sprache macht doc.nette.org/en/2.2/php-language-enhancements
– Jasir
16. September 2014 um 7:32 Uhr
@jasir Klingt fast wie Eigenwerbung! :> Fast jeder Das da draußen verfügbare PHP-Framework macht PHP zu einer vernünftigeren Sprache. Das ist schließlich der eigentliche Hauptzweck beim Schreiben von Frameworks. Kannst du benennen mindestens ein PHP-Framework, das nicht dafür geschaffen wurde, das reine verrückte PHP-Chaos ein wenig zu beseitigen? Oder ist dieses Ziel nicht einer der Hauptgründe?
– trejder
2. Juli 2015 um 12:06 Uhr
@trejder 1.) Ich bin in keiner Weise mit Nette Framework verbunden (außer als sehr zufriedener Benutzer 2.). Bitte verweisen Sie mich auf eine andere Framework-Basisobjektimplementierung, die Ihnen strikten Zugriff, automatische Eigenschaften und Getter/Setter und Erweiterungsmethode bietet. Danke …ps, aktuelle Dokumentation, utils\object kann jetzt alleine verwendet werden.
– Jasir
8. Juli 2015 um 7:43 Uhr
@jasir Yii2? (Übrigens: Ich bin in keiner Weise mit Yii2 verbunden, außer dass ich auch ein sehr zufriedener Benutzer bin! :>)
– trejder
8. Juli 2015 um 10:23 Uhr
@trejder Danke, ja, dann ist das Yii2-Objekt auch eine Lösung für dieses schreckliche PHP-Verhalten. Danke für den Hinweis
– Jasir
8. Juli 2015 um 10:35 Uhr
Emco
Mit dem Code, den Sie gepostet haben, können Sie nicht wissen, was die Werte sind $this->dbh ist.
$dbh ist eine Eigenschaft des aktuellen Objekts. $this wird verwendet, um auf die Mitglieder des aktuellen Objekts zuzugreifen.
Da diese Variable außerhalb jeder Funktion definiert ist, ist sie eine Variable, die zur Klasse gehört und nicht zu einer bestimmten Funktion. Aus diesem Grund, $this->dbh kann in jeder Funktion innerhalb der Klasse verwendet werden.
PHP muss nicht jede Variable definieren, die Sie verwenden.
Seien Sie vorsichtig mit Ihrem $dbh gegen $this->dbh. Das sind völlig unterschiedliche Variablen. Was du gesagt hast: >”$dbh kann in jeder Funktion innerhalb der Klasse verwendet werden” ist eigentlich falsch. $this->dbh kann in jeder Funktion verwendet werden, wenn es irgendwo eingestellt wurde. $dbh ist eine lokale Variable wie jede andere.
– rockerest
31. März 2011 um 2:03 Uhr
PHP zwingt Sie nicht, Ihre Klasseneigenschaften zu deklarieren, sondern erstellt sie beim ersten Zugriff für Sie. Ob das gut oder schlecht ist, wie dem auch sei, willkommen bei PHP.
Eine andere Sache, die Sie überprüfen sollten, ist, dass Sie keine Erbschaft haben. War dein $dbh Eigenschaft in einer übergeordneten Klasse definiert? Es gibt nichts in dem einfachen Code, den Sie gepostet haben, aber ich kann mir vorstellen, dass Sie ihn für den öffentlichen Gebrauch etwas vereinfacht haben. 🙂
Chetan Sharma
Welchen Wert hat $this->dbh
Es hat den Standardwert, falls zugewiesen, sonst “null”.
Ist es eine lokale Variable für die Funktion select()? Wenn ja, warum kann die Funktion get() diese Variable dann verwenden?
Es ist die Eigenschaft der Klasse foo, nicht der lokalen Variablen, daher steht es allen Methoden der Klasse foo zur Verfügung
Gehört es zum Datenmember der Klasse foo? Wenn ja, warum gibt es in dieser Klasse keine Deklaration für $dbh?
Ja, es gehört zum Datenmember von foo, Sie sehen keine Deklaration, weil PHP nicht streng ist, wenn es darum geht, Klasseneigenschaftsdeklarationen zu verlangen.
bstpierre
class foo {
function select($p1, $dbh=null) {
if ( is_null($dbh) )
$this->dbh = $dbh ;
return;
}
function get() {
return $this->dbh;
}
}
Es sei denn, Sie haben keinen Code eingefügt, der definiert
$dbh
für die Klasse oder eine Klasse, die sie erweitert, tut dieser Code nichts. Was @Unsigned gesagt hat, ist wahr: Wenn auf eine Eigenschaft verwiesen wird, die nicht existiert, wird sie stillschweigend erstellt. In diesem Fall gibt dieser Code jedoch IMMER null zurück. STETS.$this->dbh
wird nie gesetzt, sondern nur verwendet, um andere Variablen zu setzen, was bedeutet, egal was Sie tun,get()
gibt IMMER null zurück. Ich denke, Sie haben vielleicht einen relevanten Code ausgelassen, oder die Person, die dies geschrieben hat, ist völlig verrückt.– rockerest
31. März 2011 um 1:56 Uhr
Es ist nur eine Klasse, ich denke, um Ihre Fragen zu beantworten, müssen wir etwas mehr Code haben, in dem Sie das Objekt dieser Klasse tatsächlich deklarieren
– Chetan Sharma
31. März 2011 um 2:31 Uhr