PHP $diese Variable

Lesezeit: 5 Minuten

Benutzer-Avatar
WordPress-Frage

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

Benutzer-Avatar
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; 
  }

}

Benutzer-Avatar
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

Benutzer-Avatar
Emco

  1. Mit dem Code, den Sie gepostet haben, können Sie nicht wissen, was die Werte sind $this->dbh ist.
  2. $dbh ist eine Eigenschaft des aktuellen Objekts. $this wird verwendet, um auf die Mitglieder des aktuellen Objekts zuzugreifen.
  3. 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.
  4. 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. 🙂

Benutzer-Avatar
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.

Benutzer-Avatar
bstpierre

class foo {
  function select($p1, $dbh=null) {
    if ( is_null($dbh) )
        $this->dbh = $dbh ; 
    return; 
  }

  function get() {
    return $this->dbh; 
  }
}

1059470cookie-checkPHP $diese Variable

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy