2 Stimmen

Ist es eine gute Idee, den Konstruktor intern in einer statischen Methode aufzurufen?

Nehmen wir an, ich hätte eine lokalisierte Datumsklasse, bei der die normale Verwendung darin besteht, ein Objekt zu erstellen.

$d = new Date(mktime(), 'MM-DD-YYYY', array('locale' => 'es'));

Was wäre nun, wenn ich nicht immer explizit ein neues Objekt erstellen wollte, sondern stattdessen etwas in der Art von...

<p>The date is <?php echo 
Date::formatDate( mktime(), 'MM-DD-YYYY', array('locale'=>'es') );?>
</p>

In meinem formatDate Methode, wäre es eine gute Idee, den Konstruktor aufzurufen, um intern ein Datumsobjekt zu erstellen, oder sollte ich alle internen Methodenaufrufe vollständig statisch machen?

class Date {
    function getLocalisedDate( $time, $format, $options ) {
        $obj = Date::Date(
            $time, $format, $options
        ); // invoke the constructor
        return $obj->get();
    }
};

Ich habe noch nicht viele Klassen entwickelt, aber ich frage mich, ob dies ein gängiges Muster in OO-Sprachen ist.

2voto

prodigitalson Punkte 59250

Das Problem ist, dass in < php 5.3 die statische Methode immer eine Instanz der fest kodierten Klasse erzeugen wird. Wenn Sie also tatsächlich die MyAdvancedDate die die Date erhalten Sie immer eine Instanz des Elternteils, weil self y __CLASS__ werden sich immer auf die Klasse beziehen, in der die Methode tatsächlich enthalten ist. Es sei denn, Sie überschreiben die Methode explizit in den Nachfolgeklassen. Dies wird als Late Static Binding bezeichnet.

Wenn ich LSB in 5.2 implementieren muss, mache ich in der Regel eine statische Eigenschaft und entsprechende statische Accessoren, die es mir erlauben, die durch statische Aufrufe instanziierte Klasse zu ändern. Die einzige Sache hier ist dies immer noch davon ausgeht, dass Sie immer nur eine einzige descedent als Änderung der statischen Eigenschaft wird es auf der ganzen Linie zu ändern. Es kann in einem Schlag aber je nach dem, was die tatsächliche Architektur des Projekts / App / Modul / Paket zu arbeiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X