2009-04-12 2 views
3

Nehmen Sie ein Beispiel login() Funktion innerhalb einer class Account.Halten Sie es in PHP für schlecht, in Klassenmethoden auf Super-Globals zuzugreifen?

Versuchen Sie in diesem Moment, Bedenken über ungesehene Methoden zur Datenbereinigung, Kennwort-Salzen und dergleichen zu ignorieren. Konzentriert sich streng auf login(), ist dieser globale Zugang schlecht juju? Ich vermeide es, PHP-Super-Globals innerhalb von Klassen zu verwenden, aber ich kann mir keinen guten Grund vorstellen, dies in dieser Situation nicht zu tun.

Ich kann verstehen, warum Sie magic-in-the-background nicht mit globals Interaktion über Klassen auftreten möchten, aber diese Globals sind in PHP integriert, werden nicht von der Klasse geändert und werden nur von dieser Klasse verwendet .

in dieser am Anfang der Seiten führen würden Sie ein Benutzer benötigt eingeloggt am:

$user = new Account($whatever, $objects, $we, $depend, $on); 
if($user->login()) { 
    //Do this stuff when logged in 
}

statt dessen auf jeder Seite, die Logik, die später geändert werden müssen:

$user = new Account($whatever, $objects, $we, $depend, $on); 
if(isset($_POST['username']) && isset($_POST['password'])) 
    $user->formLogin($_POST['username'], $_POST['password']); 
else if(isset($_SESSION['accountId'])) 
    $user->sessionLogin($_SESSION['accountId']); 
else if(isset($_COOKIE['username']) && isset($_COOKIE['password'])) 
    $user->cookieLogin($_COOKIE['username'], $_COOKIE['password']); 
if($user->isLoggedIn() { 
    //Do this stuff when logged in 
}

Und während mir bewusst ist, dass das Erstellen einer Funktion außerhalb der Klasse, um das zu behandeln, eine Option ist, wäre das nicht genauso schlimm wie Obfuscting Globals in einer Klasse?

Antwort

7

Ich würde nicht sagen, dass es eine direkte Ja oder Nein Antwort zu diesem gibt. Was die Idee (mit allen Superglobalen $_GET$_POST$_SESSION) ist, dass Sie nach Daten fragen, die in Ihrer gesamten Anwendung sitzen, und nicht lokal zu dem Bereich, nach dem Sie fragen.

Was mit diesen Superglobalen passieren kann ist, dass was passiert, wenn sie irgendwo aus irgendeinem Grund kurz vor oder (Gott bewahre) während der Ausführung Ihrer Funktion ändern. Das kann sich als sehr nerviger Fehler erweisen, der reproduziert werden muss.

So würde ich sagen, es ist schlechte Form.

+0

+1 Sehr guter Punkt. Ich ändere niemals Super-Globals, also habe ich nicht darüber nachgedacht, dass sie anderswo modifiziert werden, und etwas, das darauf beruht, dass die Daten später gleich sind. –

+0

Vielleicht gibt es eine Möglichkeit, Super-Globals zu sperren, damit sie nicht geändert werden können, nachdem das Skript gestartet wurde? Ich werde das untersuchen. –

0

Ich würde sagen, es hängt vom Design Ihrer Anwendung ab. Wenn die Klasse eine allgemeine, lose gekoppelte Klasse oder ein Modul ist und plötzlich solche globalen Variablen verwendet, wäre das in meinem Buch eine schlechte Übung. Aber wenn die Klasse klar auf eine bestimmte Aufgabe ausgerichtet ist, für die diese spezifischen globalen Variablen ohnehin benötigt werden (zB Ihr Login-Beispiel), sehe ich keine klaren Einwände.

7

Um meine eigene Frage zu beantworten, würde ich ja sagen, es ist in Ordnung, auf Super-Globals zuzugreifen, vorausgesetzt, Sie ändern sie nicht für den Zugriff auf mehrere Klassen. Im Hintergrund läuft keine Magie - Sie lesen nur den Status, und Super Globals bietet Ihnen PHP.

Sie sollten jedoch niemals ein global innerhalb einer Klasse ändern und anderswo darauf zugreifen. Dann machen Sie Unit-Tests unmöglich.

+0

Also diese Frage ist nur du redest mit dir selbst? – cletus

+1

@cletus Die FAQ fordert Sie auf, Ihre Antworten auf Ihre eigene Frage mit dem Antwortformular zu posten und nicht in Ihre Frage zu stellen. Wenn es abgelehnt wird, werde ich wissen, dass ich falsch liege, und da Globals mir ein ekliges Gefühl geben, brauche ich eine Art Bestätigung, was ich gerade mache. –

+0

+1 Downvote entfernt – karim79

2

Ein Ansatz besteht darin, alle Superglobals in eine eigene Klasse zu verpacken. Ich bin mir ziemlich sicher, dass Zend Framework eine eigene Klasse für z. Manipulation von Cookies.

Verwandte Themen