Bei der späten statischen Bindung in PHP werden Variablen zwischen untergeordneten Klassen gemeinsam genutzt

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

  •  12-12-2019
  •  | 
  •  

Frage

Vielleicht wurde meine Frage schon mehrmals gestellt, aber...

Ich habe den folgenden Code

abstract class ParentClass
{
    protected static $count=0;
    public static function inc()
    {
        static::$count++;
    }
    public static function getCount()
    {
        return static::$count;
    }
}

class FirstChild extends ParentClass
{

}
class SecondChild extends ParentClass
{

}

Und ich benutze es einfach so

FirstChild::inc();
echo SecondChild::getCount();

Es zeigt mir „1“.Und wie Sie wahrscheinlich erraten haben, brauche ich „0“ :)

Ich sehe zwei Möglichkeiten:

  1. Hinzufügen protected static $count=0; zu jeder abgeleiteten Klasse
  2. Machen $count keine Ganzzahl, sondern ein Array.Und solche Dinge in der Art tun inc Und getCount Methoden:

    static::$count[get_claimed_class()]++;

Und

return static::$count[get_called_class()];

Aber ich denke, diese Wege sind etwas hässlich.Erstens: Zwingt mich zum Kopieren/Einfügen, was ich vermeiden möchte.Zweitens – nun ja, ich weiß es nicht :) Ich mag es einfach nicht.

Gibt es einen besseren Weg, das zu erreichen, was ich will?

Dank im Voraus.

War es hilfreich?

Lösung

Nein, Sie haben genau die beiden praktischsten Optionen dargelegt, um dieses Problem anzugehen.PHP kann nicht zaubern;wenn Sie a erklären static protected Eigenschaft erhalten Sie genau das: eins Eigentum.Wenn die von Ihnen angegebene Syntax funktionieren würde, wäre das vielleicht eine gute Nachricht für alle, die das tun müssen, aber es wäre eine absolut schreckliche Nachricht für alle anderen, die erwarten, dass sich PHP OOP einigermaßen vernünftig verhält.

Und fürs Protokoll: Wenn Sie nicht ausnahmslos für alle abgeleiteten Klassen einen separaten Zähler benötigen, ziehe ich den expliziten in Betracht protected static $count = 0 in abgeleiteten Klassen, die eine benötigen, um eine schöne Lösung zu sein:Sie wollen Ihren eigenen Zähler, Sie fragen danach, und diese Tatsache bleibt im Code festgehalten, damit jeder sie sehen kann.

Andere Tipps

Ich denke, für das, was Sie tun versuchen, nur eine Schnittstellenmethode (z. B. GetCount ()) in der abstrakten Klasse und dem Zähler in der Derivatenklasse, Ihre erste Wahl, ist die am wenigsten schlechteste Option.Es ist nicht sinnvoll, abstrakte statische Zählung in der übergeordneten Klasse zu haben, wenn Sie nicht alle Instanzen für diese Zählung zählen.

Im Allgemeinen denke ich, dass die ganze Idee etwas hässlich ist, also wären die Implementierungen auch hässlich :)

Sie können geschützte statische $ count= 0 deklarieren;Für jede Kinderklasse ist es für jede Kinderklasse einzigartig, aber für alle Instanzen der Klassen.Das ist die eleganteste Lösung für sein Problem. generasacodicetagpre.

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