Inhaltsverzeichnis
1. Problemanalyse: Warum erscheint der Nullwert?
2. korrekte Verwendung des PHP -Konstruktors __construction
3.. Klassenbeziehungen verstehen: Vererbung und Aggregation
3.1 Vererbung: "IS-A" -Beziehung
3.2 Aggregation/Zusammensetzung: "Has-a" -Beziehung
4. Komplette Beispielcode und führen Sie die Ergebnisse aus
5. Vorsichtsmaßnahmen und Best Practices
Heim Backend-Entwicklung PHP-Tutorial PHP-objektorientierte Programmierung: Lösen Sie die Nullwertprobleme in der Vererbung und das richtige Design von Klassenbeziehungen

PHP-objektorientierte Programmierung: Lösen Sie die Nullwertprobleme in der Vererbung und das richtige Design von Klassenbeziehungen

Sep 29, 2025 pm 02:36 PM

PHP-objektorientierte Programmierung: Lösen Sie die Nullwertprobleme in der Vererbung und das richtige Design von Klassenbeziehungen

In diesem Artikel werden die gemeinsamen Nullwertprobleme in der programmorientierten PHP-programmierten Programmierung eingehend untersucht und konzentriert sich darauf, wie das __construct-Methode als Klassenkonstruktor korrekt verwendet werden kann, um Objekteigenschaften zu initialisieren und wie die Vererbung (IS-A) und die Aggregation (HAS-A) -Beziehung zwischen den Klassen unterschieden und ordnungsgemäß angewendet werden. In bestimmten Code -Beispielen führen wir Entwicklern an, um Laufzeitfehler zu vermeiden, die durch den Missbrauch von Konstruktoren oder eine unsachgemäße Vererbungsdesign verursacht werden und die Codestruktur und -wartbarkeit optimieren.

1. Problemanalyse: Warum erscheint der Nullwert?

In der programmorientierten PHP-programmierten PHP-Programmen kann der Eigenschaftswert zu Null führen, wenn er versucht, ein Objekt zu erstellen und seinen Eigenschaften Werte zuzuweisen, wenn es nicht ordnungsgemäß ausgeführt wird. Im ursprünglichen Code stieß die Klinikklasse auf dieses Problem, als er versuchte, ein Patientenobjekt über die Astromenten -Daten -Methode hinzuzufügen.

 // Original Patient Class Fragment Class Patient {
    privat $ name;
    privates Alter;
    privates $ Gender;

    öffentliche Funktionsaufzeichnung ($ name, $ ay, $ Gender) {
        $ this-> name = $ name;
        $ this-> Alter = $ Alter;
        $ this-> Gender = $ Gender;
    }
    // ...
}

// Original Clinic Class Clinic erweitert den Patienten {
    private $ Patienten = [];

    öffentliche Funktion ordnungsgemäß ($ name, $ ay, $ Gender) {
        // Das Problem liegt: neuer Patient () wird hier aufgerufen
        // Der Konstruktor ist jedoch in der Patientenklasse nicht definiert, und record () wird nicht als $ this-> Patienten [] = neuer Patient ($ name, $ ay, $ Gender) bezeichnet.
    }
    // ...
}

Es gibt zwei Hauptgründe für die Ausgabe von Nullwert:

  1. Fehlender oder missbräuchlicher Konstruktor: Eine Methode mit dem Namen "Record" wird in der Patientenklasse definiert, um Eigenschaften festzulegen, ist jedoch keine spezielle Methode für PHP __construct. Wenn ein Objekt über einen neuen Patienten (...) erstellt wird, sucht und führt PHP die __construct -Methode aus, um das Objekt standardmäßig zu initialisieren. Wenn __construct nicht existiert und es keinen anderen Weg gibt, die Datensatzmethode explizit aufzurufen, wenn das Objekt erstellt wird, behält der $ -Name, $ ay, $ Geschlechtereigenschaften des Patientenobjekts den Standardwert des Nullwerts bei.
  2. Unangemessene Klassenerbschaftsbeziehung: Die Klinik erweitert der Patient die "is-a" -Be Beziehung von "Die Klinik ist ein Patient", was logisch unangemessen ist. Eine Klinik wird normalerweise im Patienten, nicht im Patienten selbst, verwaltet oder enthalten. Obwohl diese unangemessene Erbschaftsbeziehung nicht die direkte Ursache des Nullwerts ist, verwirrt es die Verantwortung der Klasse und erhöht die Komplexität des Codes und die Schwierigkeit des Verständnisses.

2. korrekte Verwendung des PHP -Konstruktors __construction

__construct in PHP ist eine spezielle Methode, die als Konstruktor bezeichnet wird. Diese Methode wird beim Erstellen einer Instanz einer Klasse mit dem neuen Schlüsselwort automatisch aufgerufen. Seine Hauptfunktion besteht darin, neu erstellte Objekte zu initialisieren, z. B. das Festlegen des Anfangswerts von Attributen, die Ausführung der erforderlichen Einstellungslogik usw.

Um das Problem zu lösen, dass das Patientenobjektattribut null ist, müssen wir die Datensatzmethode in __constructal umbenennen und sicherstellen, dass es die erforderlichen Parameter empfängt und festlegt, wenn das Objekt erstellt wird.

  Php
Klassenpatient {
    privat $ name;
    privates Alter;
    privates $ Gender;

    /**
     * Konstruktor: beim Erstellen eines Patientenobjekts automatisch aufgerufen und zur Initialisierung von Patienteninformationen verwendet.
     *
     * @param String $ Name Patientenname* @param int $ Alter Patienten Alter* @param String $ Gender Patient Geschlecht*/
    Öffentliche Funktion __construct ($ name, $ ay, $ Gender) {
        $ this-> name = $ name;
        $ this-> Alter = $ Alter;
        $ this-> Gender = $ Gender;
    }

    // den Patientnamen öffentliche Funktion erhalten GetName () {
        $ this-> name zurück;
    }

    // Erhalten Sie die öffentliche Funktion des Patienten des Patienten Getage () {
        $ this-> Alter zurückgeben;
    }

    // Erhalten Sie die öffentliche Funktion des Patienten des Patienten GetGender () {
        Rückgabe $ this-> Geschlecht;
    }
}
?>

Wenn wir einen neuen Patienten ("Patrick Star", 18, "männlich") ausführen, wird die __ -Construct -Methode automatisch ausgeführt und der übergebene Name, Alter und Geschlecht wird dem $ -Namen, $ AGE, $ -Gender -Attribute zugewiesen, um sicherzustellen, dass das Objekt korrekt initialisiert wird.

3.. Klassenbeziehungen verstehen: Vererbung und Aggregation

Bei objektorientiertem Design ist es entscheidend, die Beziehungen zwischen Klassen ordnungsgemäß aufzubauen. Die beiden gemeinsamen Beziehungen sind Vererbung und Aggregation (Aggregation/Zusammensetzung).

3.1 Vererbung: "IS-A" -Beziehung

Vererbung bedeutet, dass eine Klasse eine besondere Art einer anderen Klasse ist. Zum Beispiel "Hund ist ein Tier", dann kann die Hundeklasse die Tierklasse erben. Die Vererbung wird über das Keyword erweitert.

  • Merkmale: Unterklassen erben die öffentlichen und geschützten Eigenschaften und Methoden der übergeordneten Klasse. Unterklassen können die Methoden der übergeordneten Klasse überschreiben oder ihre eigenen neuen Eigenschaften und Methoden hinzufügen.
  • Anwendbares Szenario: Wenn eine Unterklasse tatsächlich eine spezifischere Implementierung der übergeordneten Klasse ist.

Im ursprünglichen Code erweitert die Klinik Patienten mit "Die Klinik ist eine Art Patient". Dies entspricht offensichtlich nicht der Reality -Logik. Eine Klinik ist kein Patient, sondern eine Einheit, die Patienten verwaltet. Daher ist diese Erbschaftsbeziehung unangemessen.

3.2 Aggregation/Zusammensetzung: "Has-a" -Beziehung

Aggregation bedeutet, dass eine Klasse eine Instanz einer anderen Klasse als Mitglied enthält. Zum Beispiel "Die Klinik besitzt den Patienten", enthält die Klinikklasse eine Sammlung eines oder mehrerer Patientenobjekte. Die Aggregation wird implementiert, indem eine Instanz einer anderen Klasse als Eigenschaft in einer Klasse deklariert wird.

  • Merkmale: Eine Klasse dient als integraler Bestandteil einer anderen. Die eingeschlossenen Klassen existieren unabhängig und können auch von anderen Klassen verwendet werden.
  • Anwendbares Szenario: Wenn eine Klasse die Funktionen oder Daten einer anderen Klasse verwenden muss und es eine eigene "eigene" Beziehung zwischen ihnen gibt.

Für die Beziehung zwischen Klinik und Patient ist ein vernünftigeres Modell die Aggregation: Ein Klinikobjekt "besitzt" eine Sammlung von einem oder mehreren Patientenobjekten. Daher sollte die Klinikklasse den Patienten nicht erben, sondern eine Reihe von Patientenobjekten darin aufrechterhalten.

Basierend darauf können wir die Klinikklasse neu gestalten, unnötige Vererbung entfernen und es ermöglichen, das Patientenobjekt über eine Aggregationsbeziehung zu verwalten:

  Php
Klinik {
    private $ Patienten = []; // Die Klinik hat eine Gruppe von Patienten/**
     * Erhalten Sie eine Liste aller Patienten in der Klinik.
     *
     * @return Array mit Patientenobjekten*/
    öffentliche Funktion getPatients () {
        kehren $ this-> Patienten zurück;
    }

    /**
     * Fügen Sie der Klinik einen neuen Patienten hinzu.
     *
     * @param String $ Name Patientenname* @param int $ Alter Patienten Alter* @param String $ Gender Patient Geschlecht*/
    öffentliche Funktion ordnungsgemäß ($ name, $ ay, $ Gender) {
        // Die Patientenliste mit dem korrekt initialisierten Patientenobjekt $ this-> Patienten [] = neuer Patient ($ Name, $ ay, $ Gender) hinzufügen;
    }

    /**
     * Entfernen Sie einen Patienten aus der Klinik basierend auf dem Index.
     *
     * @param int $ index, um den Index des Patienten zu löschen*/
    öffentliche Funktion DeletePatient ($ index) {
        if (isset ($ this-> Patienten [$ index])) {
            nicht fest ($ this-> Patienten [$ index]);
            // Setzen Sie den Array-Index zurück, um Hohlräume zu vermeiden, optionale Operation $ this-> Patienten = array_values ​​($ this-> Patienten);
        }
    }
}
?>

4. Komplette Beispielcode und führen Sie die Ergebnisse aus

Kombinieren Sie die oben genannten Korrekturen mit dem Konstruktor der Patientenklasse und Anpassungen an der Aggregationsbeziehung der Klinikklasse. Folgendes ist ein vollständiges Beispiel für den Optimierungscode:

  Php
// Patientenklasse Definitionsklasse Patient {
    privat $ name;
    privates Alter;
    privates $ Gender;

    Öffentliche Funktion __construct ($ name, $ ay, $ Gender) {
        $ this-> name = $ name;
        $ this-> Alter = $ Alter;
        $ this-> Gender = $ Gender;
    }

    öffentliche Funktion getName () {
        $ this-> name zurück;
    }

    öffentliche Funktion getage () {
        $ this-> Alter zurückgeben;
    }

    öffentliche Funktion getGender () {
        Rückgabe $ this-> Geschlecht;
    }
}

// Klinikklinik für Klinikklassen {
    private $ Patienten = [];

    öffentliche Funktion getPatients () {
        kehren $ this-> Patienten zurück;
    }

    öffentliche Funktion ordnungsgemäß ($ name, $ ay, $ Gender) {
        $ this-> Patienten [] = neuer Patient ($ name, $ ay, $ Gender);
    }

    öffentliche Funktion DeletePatient ($ index) {
        if (isset ($ this-> Patienten [$ index])) {
            nicht fest ($ this-> Patienten [$ index]);
            // Optional: REINDEX Das Array, um die Schlüssel aufeinanderfolgend $ this-> patienten = array_values ​​($ this-> Patienten) zu machen;
        }
    }
}

// instanziieren und betreiben $ Clinic = New Clinic ();

$ klinik-> ordnungsgemäß ("Patrick Star", 18, "männlich");
$ klinik-> ordnungsgemäß ("SpongeBob Squarepants", 17, "männlich");
$ klinik-> ordnungsgemäß ("Eugene Krab", 28, "männlich");

echo "Erste Patientenliste: \ n";
print_r ($ klinik-> getPatients ());

$ Clinic-> DeletePatient (1); // den Patienten mit Index 1 löschen (SpongeBob -Quadratiker)

echo "\ npatient liste nach lösch: \ n";
print_r ($ klinik-> getPatients ());

?>

Erwartete Ausgabe:

 Erste Patientenliste:
Array
(
    [0] => Patientenobjekt
        (
            [Name: Patient: privat] => Patrick Star
            [Alter: Patient: Privat] => 18
            [Geschlecht: Patient: Privat] => Männlich
        )

    [1] => Patientenobjekt
        (
            [Name: Patient: privat] => SpongeBob Quadrepants
            [Alter: Patient: Privat] => 17
            [Geschlecht: Patient: Privat] => Männlich
        )

    [2] => Patientenobjekt
        (
            [Name: Patient: Privat] => Eugene Krab
            [Alter: Patient: Privat] => 28
            [Geschlecht: Patient: Privat] => Männlich
        )

)

Patientenliste nach dem Löschen:
Array
(
    [0] => Patientenobjekt
        (
            [Name: Patient: privat] => Patrick Star
            [Alter: Patient: Privat] => 18
            [Geschlecht: Patient: Privat] => Männlich
        )

    [1] => Patientenobjekt
        (
            [Name: Patient: Privat] => Eugene Krab
            [Alter: Patient: Privat] => 28
            [Geschlecht: Patient: Privat] => Männlich
        )

)

Wie aus der Ausgabe ersichtlich ist, wird das Patientenobjekt jetzt korrekt initialisiert, und die Klinikklasse kann die Patientenliste effektiv verwalten, ohne dass Nullwerte angezeigt werden.

5. Vorsichtsmaßnahmen und Best Practices

  • Verwenden Sie immer __Construct, um Objekte zu initialisieren: Entwickeln Sie die Gewohnheit, die __construct -Methode in Klassen zu definieren, die Eigenschaften initialisieren müssen, und stellen Sie sicher, dass sich das Objekt bei der Erstellung in einem gültigen Zustand befindet.
  • Bewerten Sie die Beziehung zwischen den Klassen sorgfältig: Denken Sie beim Entwerfen von Kursen unbedingt über die tatsächliche Beziehung zwischen ihnen nach. Ist es "is-a" (Erbschaft) oder "Has-a" (Aggregation/Kombination)? Falsche Klassenbeziehungen können zu Designfehler führen und den Code schwer zu pflegen und zu verstehen.
  • Missbrauch der Erbschaft: Die Vererbung ist eine starke Kopplungsbeziehung und sollte mit Vorsicht verwendet werden. Die Vererbung wird nur berücksichtigt, wenn die Unterklasse tatsächlich eine spezielle Version der übergeordneten Klasse ist. Überbeanspruchung der Vererbung kann zu "fragilen Basisklassenproblemen" und komplexen Klassenhierarchien führen.
  • Flexibilität der Aggregation: Die Aggregation (oder eine stärkere Kombination) bietet eine größere Flexibilität und ermöglicht es, zur Laufzeit dynamisch hinzugefügt oder entfernt werden, ohne Eltern-Kind-Beziehungen zu erzwingen.
  • Einkapselungsprinzip: Attribute privat (privat oder geschützt) und auf sie durch öffentliche Getter/Setter -Methoden zugreifen und diese ändern, ist eine gute Kapselungspraxis.
  • Lesbarkeit und Wartung der Code: Klare und logisch vernünftige Klassengestaltung kann die Lesbarkeit des Codes und die zukünftige Wartbarkeit erheblich verbessern.

Das obige ist der detaillierte Inhalt vonPHP-objektorientierte Programmierung: Lösen Sie die Nullwertprobleme in der Vererbung und das richtige Design von Klassenbeziehungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Stock Market GPT

Stock Market GPT

KI-gestützte Anlageforschung für intelligentere Entscheidungen

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie überprüfen Sie, ob eine E -Mail -Adresse in PHP gültig ist? Wie überprüfen Sie, ob eine E -Mail -Adresse in PHP gültig ist? Sep 21, 2025 am 04:07 AM

UseFilter_var () tovalateMailSyntaxandCheckdnsrr () tuverifyDomainMxRecords.Example: $ EMAMME = "User@example.com"; if (f ilter_var ($ mail, filter_validate_email) && checkDnsrr (explode ('@', $ mail) [1], 'mx') {echo "validandDeliverableMail & qu

Wie fusioniere ich zwei Arrays in PHP? Wie fusioniere ich zwei Arrays in PHP? Sep 21, 2025 am 12:26 AM

Usearray_merge () tocombinearrays, überschreibende DuplicatestringKeysandReindexingnumericKeys;

Wie erstelle ich eine tiefe Kopie oder Klon eines Objekts in PHP? Wie erstelle ich eine tiefe Kopie oder Klon eines Objekts in PHP? Sep 21, 2025 am 12:30 AM

UseUnSerialize (Serialize ($ OBJ)) FODEPCOPYPYWIEDALLDATAISSERIALIZIABLE; Andernfalls implementieren Sie __Clone () TomanuelleduplicatenestoBjectSandavoidSharedReferences.

Wie verwende ich Namespaces in einem PHP -Projekt? Wie verwende ich Namespaces in einem PHP -Projekt? Sep 21, 2025 am 01:28 AM

NamespacesinphporganizeCodeAndPreventnamingConflictsByGroupingclasses, Schnittstellen, Funktionen und Constantsunderaspecificname.2.DefineAnaceStHenameSpaceKeyWorthetopoFafile, gefolgt von BythenameSpacename, solcheasapp \ controllers.3.

Was sind magische Methoden in PHP und liefern ein Beispiel für __call () `und __get ()`. Was sind magische Methoden in PHP und liefern ein Beispiel für __call () `und __get ()`. Sep 20, 2025 am 12:50 AM

The__call () methodistiggeredWenaninAccessibleorundEfinedMethodiscalledonanObject, erlaubt CustomHandlingByaccepthodnameandargumente, ashownwhencallingundEfinedMethodselikesayhello (). 2.The__get () methodisinvokedInacescessininginingininginingininginingininginingininginingincessibleceschessibleChessibleChessibleornonon-EX

Wie aktualisiere ich einen Datensatz in einer Datenbank mit PHP? Wie aktualisiere ich einen Datensatz in einer Datenbank mit PHP? Sep 21, 2025 am 04:47 AM

ToupDateadatabaserecordinphp, FirstConnectusepdoOrmysqli, ThenuSePreparedStatementStoExexexeSecuresQLUPDateQuery.example: $ pdo = newpdo ("MySQL: Host = LocalHost; dbname = your_database", $ username, $ username, $ username);

Wie bekomme ich die Dateierweiterung in PHP? Wie bekomme ich die Dateierweiterung in PHP? Sep 20, 2025 am 05:11 AM

Usepathinfo ($ filename, pathinfo_extension) togetTheFilextesion; itrelablyHandlesMultiPleDOTSandgeCases, ReturningTheExtesion (z.

MySQL Bedingte Aggregation: Anwendungsfallerklärung zur Implementierung des Zustands und der Zählung von Feldern MySQL Bedingte Aggregation: Anwendungsfallerklärung zur Implementierung des Zustands und der Zählung von Feldern Sep 16, 2025 pm 02:39 PM

In diesem Artikel wird eingehalten, wie man Fallanweisungen verwendet, um eine bedingte Aggregation in MySQL durchzuführen, um eine bedingte Summierung und Zählung bestimmter Felder zu erreichen. In einem praktischen Abonnement -System -Fall zeigt es, wie die Gesamtdauer und Anzahl der Ereignisse dynamisch auf der Grundlage des Datensatzstatus (z. B. "Ende" und "Abbrechen") berechnet werden kann, wodurch die Einschränkungen herkömmlicher Summenfunktionen überwunden werden, die den Anforderungen der komplexen bedingten Aggregation nicht erfüllen können. Das Tutorial analysiert die Anwendung von Fallanweisungen in Summenfunktionen im Detail und betont die Bedeutung von Koaleszen, wenn es sich um die möglichen Nullwerte des linken Join befasst.

See all articles