PHP-Konstruktor wird ausgeführt, bevor die Argumente für verschachtelte Variablen versorgt werden können

StackOverflow https://stackoverflow.com/questions/805404

  •  03-07-2019
  •  | 
  •  

Frage

Die ersten Dinge zuerst, hier ist ein kleines snippet-code zu helfen, zu erklären, mein problem:

<?php
class foo {

    public $title;

    __construct{

        echo "<html>\n";
        echo "<head>\n";
        echo "<title>".$this->title."</title>\n";
        echo "</head>\n";
        echo "<body>\n";

    }

    /**
    *
    * I get $title from index.php
    *
    */
    public function setTitle( $title )
    {

        $this->title = $title;

    }


    __destruct{

        echo "</body>\n";
        echo "</html>\n";

    }

}
?>

Sie haben wahrscheinlich schon bemerkt, dass dieser code erzeugt einen Titel gut .Ja, es gibt einen leeren Raum gibt. :- )

Für mich ist dieses eigentlich macht Sinn (auch wenn ich nicht erwartet hatte), weil die Klasse Konstruktor ausgeführt wird, auf die Schaffung der foo-Objekt, was bedeutet, dass es nicht warten, um für index.php liefern die Argumentation für setTitle() das wiederum gibt den string zurück, der füllt $this->title.

Also, wenn ich wirklich zu verstehen, was ist denn hier Los, was kann ich tun, um dieses Problem umgehen?Sollte ich die Pufferung der Ausgabe über den eingebauten Puffer-Funktionen, und dann ändern die gespeicherte Ausgabe mit dem mitgelieferten Titel string?Irgendwelche Ideen?

Ich würde wirklich, wirklich, wirklich, wie zu halten diese Struktur, wo die Konstruktor-und Destruktor enthalten, diese sich wiederholenden code.Seine schöne, die diese Funktionen nicht haben, um überall aufgerufen werden.Ich verstehe, dass einige Entwickler betrachten Sie diese schlechte Praxis ist, aber ich werde es so machen, eh, weil ich will, weil ich denke, dass seine kühle.Also ich bin nicht wirklich auf der Suche nach Beratung in diesem Aspekt, es sei denn, fühlen Sie sich sehr motiviert, mich zu informieren über meine Dummheit.

So, wenn Sie irgendwelche Ratschläge/Ideen/Erfahrung mit mir zu teilen, das wäre toll.

Vielen Dank, und fühlen Sie sich frei, Ihre Zeit zu nehmen, weil ich denke, ich werde gezwungen sein, zu bleiben im inneren verstecken sich vor dem bösen Schweine-Grippe, der gekommen ist, um meine Stadt, also keine Eile!

War es hilfreich?

Lösung

teh_noob.Hör mir zu.Diese Worte, die ich Schreibe hier richtig.Vorgeben, dass ich bin, sagte Sie, und höre die Worte aus meinem Mund kommt.Nein. NEIN NEIN NEIN NEIN KEINE! Und Nein, ich don ' T geben eine Ratte Hintern, wie "cool" Sie denken, es ist.

Dies ist einer jener unglücklichen Szenarien, in denen es kürzer wäre, die Liste der "richtigen" Dinge an diesem Ansatz, dass die "falschen" Dinge., Dass ist zu sagen, Ihre Probleme sind zahlreiche. That being said, ich bin zu gehen über nur einige die Dinge, die schlecht sind über diese Idee.

Erste, lassen Sie uns einfach besprechen, OOP im Allgemeinen.Was Sie hier tun, ist mein am wenigsten Favorit, was zu sehen, je:was ich als "Programmierung mit Klassen"., Dass ist zu sagen, strukturierte Programmierung in der Gestalt von OOP, da ein Klasse-Schlüsselwort verwendet wurde.Wenn Sie gonna dies zu tun, nicht die Mühe.Verwenden Sie einfach Funktionen.Das ist Klasse Missbrauch schlicht und einfach.

Klassen-Objekt Blaupausen.Objekte eignen sich für die Kapselung und Instanziierung.Es sei denn, du bist wirklich ein fan von der Singleton-Muster, warum erstellen Sie eine Klasse, die eindeutig entworfen, um nur einmal instanziiert?Und bevor Sie sagen "Aber Peter, das Singleton-Muster hilft uns!!!1one" versuchen Sie zu verstehen, dass es tatsächlich nicht so toll.Neben dem, was Sie hier tun, ist nicht einmal ein Grund wenden sich die Menschen auf das Singleton-Muster in den ersten Platz.

Zweite, ist das Thema von Unterklassen.Vielleicht irgendwann in der Zukunft möchten Sie ein popup-Seiten für Ihre Website.Oder Sie drucken möchten-nur Versionen, die sind mehr als nur die CSS-driven.Vielleicht wirst du sogar etwas wollen, das ist nicht das HTML überhaupt, wie ein RSS-feed.Was nun?Wie viel andere die Arbeit geht in diesem Konstruktor sind Sie gehen zu müssen, zu duplizieren diese neue Seite-Typen zu arbeiten?Aber was ist, wenn Sie habe bereits begonnen, sich auf die Unterklassen zu erstellen, einzelne Seiten?Jetzt bist du gefickt.Sicher, Sie können gehen Sie zurück und Haken Sie die Dekorator-Muster, aber warum gehen Sie durch alle, die arbeiten, wenn dieses problem kann vermieden werden, indem nicht-blöd-class-design in den ersten Platz?

Drittens, ist die Idee der echo HTML in den ersten Platz.Ich bin in Ordnung mit dem echo für ein Wort oder zwei hier, einen tag oder drei.Aber bei großen HTML-Blöcken, es ist einfach nur Schwachsinn.Haben Sie den Anstand, zu entkommen, um Ausgang Modus, und verwenden Sie HTML -, dass ist nicht gesperrt in einer Zeichenfolge.Nicht nur ist es einfacher zu Bearbeiten und Lesen, Sie können eigentlich arbeiten Sie in einem WYSIWYG-sollten Sie dies wünschen.

Vierte, so schlecht, schlecht bricht die SRP.

Fünfte - diese Art des lächerlichen design führt zu der sehr Art von Problemen, die Sie lösen möchten hier.Nur Sie nicht wollen, zu wissen, dass die Lösung ist, entfernen Sie die echo-Anweisungen von Ihrem Konstruktor.Gibt es einen Weg um es herum?Sicher.In der Tat, es gibt sogar mehr als eine.Ich empfehle jedem von Ihnen?Nein, nicht wirklich.

Schließlich, lasst uns diskutieren Header.Vielleicht haben Sie noch nicht gelernt haben, über das Sie noch nicht.Haben Sie vielleicht und ist es auch egal.Aber was passiert, wenn 6 Monate ab jetzt arbeiten Sie an einem problem, und Sie arbeiten im inneren eine Methode, die 10 Anrufe, die tief in den Stapel, und Sie erkennen, eine einfache header() Funktion wird Ihr problem lösen.Vielleicht müssen Sie die cache-control-oder Sie müssen manuell set die-Antwort-code - was auch immer.Aber erraten, was, Sie kann nicht.Warum?Weil Sie Ihre dummen Konstruktor Ausgänge zu den browser Millisekunden erzeugt werden.

Also, um zu rekapitulieren: NEIN! Es sei denn, Ihre eigentliche, ultimative Ziel ist zu finden Sie unter einige sehr auf Handarbeit auf The Daily WTF.

Was kann ich bieten neben der Verwarnung?Vielleicht Teil einer neuen Richtung?Gut, die debugging-Ausgabe ist hart genug, gut gebaut, Systeme, also nicht starten, indem Sie Schießen sich in den Fuß, das tut es implizit.Alle Ausgaben von Ihrem system sein sollte explicit.Wenn Sie wollen, um eine "Seite" geben Sie der Klasse, das ist in Ordnung.Nur tun Sie es nicht, wie das.

class foo
{
    protected $title;
    protected $headers;

    public function setTitle( $title )
    {
        $this->title = $title;
    }

    public function addHeader( $header )
    {
        $this->headers[] = $header;
    }

    public function sendHeaders()
    {
        foreach ( $this->headers as $header )
        {
            header( $header );
        }
    }

    public function printPageHeader()
    {
        $this->sendHeaders();
        ?>
            <html>
                <head>
                    <title><?php echo $this->title; ?></title>
                </head>
                <body>
        <?php
    }

    public function printPageFooter()
    {
        ?>
                </body>
            </html>
        <?php
    }

    public function printPage()
    {
        $this->printPageHeader();
        $this->printPageFooter();
    }
}

$p = new foo;
$p->setTitle( 'Just Testing' );
$p->addHeader( 'Cache-control: no-cache' );
$p->printPage();

Andere Tipps

Sie konnte den Druck in den Destruktor.Es werden alle Variablen bekannt sind.Allerdings (wie du selbst gesagt) ich denke, das ist wirklich, wirklich schlechte Praxis.Ich würde vorschlagen, mit Art of view / template-Dateien (die du sowieso genug Zeit haben :) ).

Du kannst über den Titel als argument im Konstruktor?

schnalle: dies ist eine schlechte Praxis.das ist Wahnsinn.
the_noob: Wahnsinn ...?
the_noob: (schreit) DIESE ...IST ...LITTLEFRAMEWORKIMBUILDING!
the_noob: (Tritte Trennung von code und Präsentation bis gut)

ich weiß nicht wirklich, was Sie tun möchten, aber geben Sie nur die Titel, die als parameter an den Konstruktor ...

<?php

class Title {
    public function __construct($title) {

        echo '<html><head><title>' . htmlspecialchars($title) . '</title></head><body>';
    }

    public function __destruct() {
        echo '</body></html>';
    }
}

?>

wenn Sie wirklich möchten, dass Ihre Objekte, etwas zu drucken, würde ich vorschlagen, die Magie __tostring () - Methode, so können Sie einfach echo Ihr Objekt.aber für html-tags ...noch nicht sinnvoll.

ich Wünsche Ihnen viel Glück mit Ihrem Rahmen, aber du bist entweder ein Genie (wahrscheinlich nicht) oder einem Mann, die gleichen Fehler, die (fast) jeder Anfänger hat (bevor MVC angekommen).

edit: ich kann Ihnen nicht helfen.Sie möchten direkt ausgegeben wird, wenn das Objekt erstellt wird, aber brauchen, um Daten in das Objekt, bevor es erstellt wird.so können Sie versuchen zu umgehen sowas von hässlich, so dass es sogar noch hässlicher.es funktioniert einfach nicht so!
Sie sind versuchen zu bauen eine neue, bessere Art von Auto durch das anbringen von Rädern an einem lebenden Esel, dann beschweren weil es irgendwie nicht so, wie Sie es erwarten (Esel auf Rädern!wheooo!), und jetzt Fragen Sie die community, wie Sie zu befestigen-Rückleuchten in einer Weise, dass die Esel/Auto schneller gehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top