Gibt es eine Möglichkeit, eine Klasse in PHP sicher zu deklarieren?

7

Wir alle kennen den berüchtigten Fehler "Klasse nicht umdefinieren". Gibt es eine Methode, um dies zu überwinden und eine neue Klasse mit dem gleichen Namen zu deklarieren, oder ist das in PHP 5 nicht möglich?

    
Asif Khan 17.04.2010, 15:31
quelle

7 Antworten

12

Wie Pekka und Techpriester darauf hingewiesen haben: Nein, das geht nicht. Wenn Sie jedoch PHP & gt; = 5.3 verwenden, können Sie Namespaces verwenden und das Konstrukt "verwenden", um die Klasse effektiv "neu zu deklarieren". Hier ist ein Beispiel: %pr_e%

Damit haben Sie das gewünschte Ergebnis, da MyClass jetzt auf Ihre Namespace-Klasse verweist.

    
jpfuentes2 17.04.2010 16:24
quelle
6

Es mag einen Weg geben, eine obskure Erweiterung zu verwenden, aber im grundlegenden Standard PHP, soweit ich weiß, nein.

Sie können jedoch immer eine vorhandene Klasse erweitern und - je nach Szenario - eine Instanz dieser erweiterten Klasse in die Anwendung "schmuggeln", in der Sie arbeiten.

    
Pekka 웃 17.04.2010 15:34
quelle
2

Es ist unmöglich. Je nach Anwendungsfall können Namespaces, wie jpfuentes2 erwähnt, für Sie arbeiten.

Ein Hack ist es, einen benutzerdefinierten neuen "Operator" zu implementieren.

Beispiel:

%Vor%

Ein weiterer Hack ist, runkit zu verwenden, um eine Klasse erneut zu implementieren.

    
elias 17.04.2010 16:53
quelle
2

Vielleicht eine modernere Antwort für 2016, es sieht jetzt so aus, als gäbe es jetzt mindestens 3 Optionen:

Option 1. Verwenden von runkit

Hinweis: Ссылка

bool runkit_class_emancipate ( string $classname )

"Konvertiert eine geerbte Klasse in eine Basisklasse, entfernt alle Methoden, deren Bereich ein Vorfahren ist"

Obwohl ich das selbst nicht getestet habe, scheint es eine praktikable Option zu sein, wenn Sie die Kontrolle über die geladenen Erweiterungen haben. Der Nachteil hier wäre, dass Sie alle Vorfahren Methoden verlieren.

Option 2. Verwenden Sie runkit erneut

Ref: Ссылка

bool runkit_method_redefine ( string $classname , string $methodname , string $args , string $code [, int $flags = RUNKIT_ACC_PUBLIC ] )

"Ändert dynamisch den Code der angegebenen Methode"

Dies löst das Problem von Option 1, wenn Sie eine oder zwei Methoden für die Basisklasse optimieren wollen.

Option 3. Implementieren Sie einen Autoloader

Hinweis: Ссылка

bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )

"Registrieren Sie die angegebene Funktion als __autoload () Implementierung"

Das ist persönlich mein Favorit der 3, denn:

  • Es funktioniert nativ in modernen PHP-Versionen
  • Es kann mit anderen Autoloadern zusammenarbeiten
  • Es ermöglicht Ihnen, bedingte Logik um Ihre Überschreibungen
  • zu implementieren

Dies ist auch einer, für den ich etwas Erfahrung habe. Eine Beispielimplementierung ist wie folgt:

%Vor%     
Rick Buczynski 12.10.2016 16:07
quelle
1

AFAIK, das Redefinieren von ausstehenden Funktionen oder Klassen ist in PHP nicht möglich.

Wenn Sie sagen könnten, was Sie zu tun versuchen, gibt es vielleicht eine andere Lösung ...

    
selfawaresoup 17.04.2010 15:40
quelle
0

Grundsätzlich können Sie eine Klasse nicht neu deklarieren. Aber wenn Sie wirklich wollen, können Sie. :) Alles ist möglich. Brauchen Sie eine Klasse, die ihre Struktur dynamisch ändert? Sie können die magischen Methoden __call und pattern State verwenden.

%Vor%

Es gibt auch ein PHP-Toolkit, um dynamisch mit Klassen zu spielen: Ссылка

Ich weiß, dass das Umdefinieren der Klasse und ihrer Methoden in Ruby möglich ist (und ich würde es als einen Fehler in einem Sprachdesign betrachten).

    
topright gamedev 22.04.2010 21:54
quelle
0

Grundsätzlich können wir eine Klasse in PHP directly nicht deklarieren. Wenn Sie eine Klasse in PHP neu deklarieren müssen, schlage ich vor, dass Sie diese Klasse in eine separate Datei schreiben und require_one verwenden, um diese Datei auf der gewünschten Seite aufzurufen. Es ist wie folgt:

Seite1.php

%Vor%

Page2.php

%Vor%

Jetzt wird es wie gewünscht funktionieren . Es hat für mich funktioniert.

Die Ausgabe ist wie folgt:

%Vor%     
Manu Mathew Keerampanal 13.04.2014 09:59
quelle

Tags und Links