Ich erstelle eine Benutzerklasse für meine neue Website, aber diesmal habe ich darüber nachgedacht, sie etwas anders zu erstellen ...
C ++ , Java und sogar Ruby (und wahrscheinlich andere Programmiersprachen) ermöglichen die Verwendung verschachtelter / innerer Klassen innerhalb der Hauptklasse, wodurch wir den Code objektorientierter und organisierter gestalten können.
In PHP möchte ich so etwas machen:
<?php
public class User {
public $userid;
public $username;
private $password;
public class UserProfile {
// some code here
}
private class UserHistory {
// some code here
}
}
?>
Ist das in PHP möglich? Wie kann ich das erreichen?
AKTUALISIEREN
Wenn dies nicht möglich ist, werden zukünftige PHP-Versionen möglicherweise verschachtelte Klassen unterstützen?
User
, Beispiel:public class UserProfile extends User
undpublic class UserHestory extends User
.Antworten:
Intro:
Verschachtelte Klassen beziehen sich etwas anders auf andere Klassen als äußere Klassen. Am Beispiel von Java:
Nicht statisch verschachtelte Klassen haben Zugriff auf andere Mitglieder der einschließenden Klasse, auch wenn sie als privat deklariert sind. Für nicht statisch verschachtelte Klassen muss außerdem eine Instanz der übergeordneten Klasse instanziiert werden.
Es gibt mehrere zwingende Gründe für ihre Verwendung:
In PHP
Sie können ein ähnliches Verhalten in PHP ohne verschachtelte Klassen haben.
Wenn Sie nur Struktur / Organisation wie Package.OuterClass.InnerClass erreichen möchten, sind PHP-Namespaces möglicherweise ausreichend. Sie können sogar mehr als einen Namespace in derselben Datei deklarieren (obwohl dies aufgrund der Standardfunktionen für das automatische Laden möglicherweise nicht ratsam ist).
Wenn Sie andere Merkmale emulieren möchten, z. B. die Sichtbarkeit von Mitgliedern, ist der Aufwand etwas höher.
Definieren der "Paket" -Klasse
Anwendungsfall
Testen
Ausgabe:
HINWEIS:
Ich denke wirklich nicht, dass der Versuch, innerClasses in PHP zu emulieren, eine so gute Idee ist. Ich denke, der Code ist weniger sauber und lesbar. Es gibt wahrscheinlich auch andere Möglichkeiten, ähnliche Ergebnisse mit einem gut etablierten Muster zu erzielen, wie z. B. dem Observer, Decorator oder COmposition Pattern. Manchmal reicht schon eine einfache Vererbung aus.
quelle
Echte verschachtelte Klassen mit
public
/protected
/private
Barrierefreiheit wurden 2013 für PHP 5.6 als RFC vorgeschlagen, haben es aber nicht geschafft (Noch keine Abstimmung, keine Aktualisierung seit 2013 - Stand 29.12.2016 ):https://wiki.php.net/rfc/nested_classes
Zumindest haben es anonyme Klassen in PHP 7 geschafft
https://wiki.php.net/rfc/anonymous_classes
Von dieser RFC-Seite:
Es kann also sein, dass wir in einer zukünftigen Version verschachtelte Klassen erhalten, aber es ist noch nicht entschieden.
quelle
Sie können dies nicht in PHP tun. Es gibt jedoch funktionale Möglichkeiten, dies zu erreichen.
Weitere Informationen finden Sie in diesem Beitrag: Wie erstelle ich eine verschachtelte PHP-Klasse oder verschachtelte Methoden?
Diese Art der Implementierung wird als fließende Schnittstelle bezeichnet: http://en.wikipedia.org/wiki/Fluent_interface
quelle
Seit PHP Version 5.4 können Sie das Erstellen von Objekten mit privatem Konstruktor durch Reflektion erzwingen. Es kann verwendet werden, um verschachtelte Java-Klassen zu simulieren. Beispielcode:
quelle
Gemäß Xenons Kommentar zu Anıl Özselgins Antwort wurden anonyme Klassen in PHP 7.0 implementiert, das so nahe an verschachtelten Klassen liegt, wie Sie es derzeit erhalten. Hier sind die relevanten RFCs:
Verschachtelte Klassen (Status: zurückgezogen)
Anonyme Klassen (Status: implementiert in PHP 7.0)
Ein Beispiel für den ursprünglichen Beitrag: So würde Ihr Code aussehen:
Dies ist jedoch mit einer sehr bösen Einschränkung verbunden. Wenn Sie eine IDE wie PHPStorm oder NetBeans verwenden und dann der
User
Klasse eine Methode wie diese hinzufügen :... bye bye automatische Vervollständigung. Dies ist auch dann der Fall, wenn Sie für Schnittstellen (das I in SOLID) mit einem Muster wie dem folgenden codieren:
Wenn Ihre einzigen Aufrufe
$this->profile
nicht von der__construct()
Methode stammen (oder von welcher Methode auch immer$this->profile
), erhalten Sie keine Typangaben. Ihr Eigentum ist für Ihre IDE im Wesentlichen "verborgen", was das Leben sehr erschwert, wenn Sie sich bei der automatischen Vervollständigung, dem Schnüffeln von Codegerüchen und dem Refactoring auf Ihre IDE verlassen.quelle
Sie können es nicht in PHP tun. PHP unterstützt "include", aber Sie können dies nicht einmal innerhalb einer Klassendefinition tun. Nicht viele gute Möglichkeiten hier.
Dies beantwortet Ihre Frage nicht direkt, aber Sie könnten an "Namespaces" interessiert sein, einer schrecklich hässlichen \ Syntax \ Hacked \ On \ Top \ von PHP OOP: http://www.php.net/manual/en/language .namespaces.rationale.php
quelle
Es wartet auf die Abstimmung als RFC https://wiki.php.net/rfc/anonymous_classes
quelle
Ich glaube, ich habe eine elegante Lösung für dieses Problem geschrieben, indem ich Namespaces verwendet habe. In meinem Fall muss die innere Klasse ihre übergeordnete Klasse nicht kennen (wie die statische innere Klasse in Java). Als Beispiel habe ich eine Klasse namens 'User' und eine Unterklasse namens 'Type' erstellt, die in meinem Beispiel als Referenz für die Benutzertypen (ADMIN, OTHERS) verwendet werden. Grüße.
User.php (Benutzerklassendatei)
Using.php (Ein Beispiel für den Aufruf der 'Unterklasse')
quelle
Sie können wie folgt in PHP 7:
quelle
Legen Sie jede Klasse in separate Dateien und "benötigen" Sie sie.
User.php
UserProfile.php
UserHistory.php
quelle