Inhaltsverzeichnis
Warum $ Globals Unit -Tests bricht
So testen Code, der $ Global verwendet (ohne alles umzuschreiben)
1. Speichern und wiederherstellen Sie den globalen Staat
2. Wickeln Sie $ Globals Access in einen Service ein
3.. Verwenden Sie die Abhängigkeitsinjektion (sogar leicht)
Zukünftige Probleme verhindern
Heim Backend-Entwicklung PHP-Tutorial Der Albtraum von Code des Unit -Tests mit $ Global

Der Albtraum von Code des Unit -Tests mit $ Global

Aug 05, 2025 am 09:06 AM
PHP $GLOBALS

Die Verwendung von $ globals wird Unit -Tests zerstören, da sie versteckte Abhängigkeiten einführt, was zu einem staatlichen Austausch zwischen Tests, verwirrenden Einstellungen, schlechter Isolation und schwer zu simulieren. 2. Lösungen umfassen: Zuerst speichern und dann den globalen Staat wiederherstellen, um eine Kontamination zu vermeiden; 3.. Einkapseln $ globals zugreifen in Serviceklassen und übergeben Sie sie durch die Abhängigkeitsinjektion, um die Verwendung von Scheinobjekten in Tests zu erleichtern. 4. Selbst leichte Abhängigkeitsinjektion kann die Testbarkeit der Tests erheblich verbessern und die globalen Variablen direkt vermieden werden. 5. Um zukünftige Probleme zu vermeiden, sollten $ globals deaktiviert sein und Konfigurationsobjekte, Abhängigkeitsinjektionsbehälter oder Umgebungsvariablen verwenden und statische Analyse -Tools verwenden, um die Verwendung von Hyperglobalvariablen zu erkennen. Die endgültige Antwort lautet: Die Abhängigkeit von $ globals muss durch Einkapselungs- und Abhängigkeitsinjektion nach und nach elektrisch beseitigt werden, um zuverlässige und aufrechterhaltene Unit -Tests zu ermöglichen.

Der Albtraum von Unit -Testcode mit $ globals durchsetzt

Der Unit -Testcode, der stark auf $GLOBALS beruht, ist ein häufiger Schmerzpunkt in Legacy -PHP -Anwendungen. Es ist nicht nur unpraktisch - es kann Tests unzuverlässig, schwer zu pflegen und eng mit dem globalen Staat verbunden zu machen. Hier ist, warum es ein Problem ist und wie man damit umgeht.

Der Albtraum von Unit -Testcode mit $ globals durchsetzt

Warum $ Globals Unit -Tests bricht

$GLOBALS ist ein superglobales Array in PHP, das Verweise auf alle Variablen enthält, die derzeit im globalen Bereich definiert sind. Wenn Code von $ global liest oder auf $GLOBALS schreibt, wird versteckte Abhängigkeiten eingeführt. Dies macht Unit -Tests schwierig, weil:

  • Der Staat wird über Tests hinweg geteilt : Ein Test kann eine globale Variable verändern und das Ergebnis eines anderen beeinflussen.
  • Das Setup wird chaotisch : Sie müssen den globalen Zustand vor und nach jedem Test manuell aufstellen.
  • Tests sind nicht isoliert : Echte Unit -Tests sollten isoliert durchgeführt werden, aber Globale erzeugen Nebenwirkungen.
  • Schwer zu verspotten oder stumm zu sein : Im Gegensatz zu injizierten Abhängigkeiten können $GLOBALS nicht einfach ersetzt oder verspottet werden.

Zum Beispiel:

Der Albtraum von Unit -Testcode mit $ globals durchsetzt
 Funktion getuSerrol () {
    $ globals ['user_role'] zurückgeben? 'Gast';
}

Testen Dies erfordert, dass $GLOBALS['user_role'] direkt festgelegt wird - das globale Umfang und Risikointerferenz mit anderen Tests.

So testen Code, der $ Global verwendet (ohne alles umzuschreiben)

Manchmal kann man die gesamte Codebasis nicht sofort widerspiegeln. Hier sind praktische Strategien, um Tests sowieso zu schreiben.

Der Albtraum von Unit -Testcode mit $ globals durchsetzt

1. Speichern und wiederherstellen Sie den globalen Staat

PHPUNIT bietet eine integrierte Option zur Erhaltung des globalen Zustands:

 /**
 * @runtestSinSesparateProcess
 * @PreserveGlobalState aktiviert
 */

Aber das ist langsam und klobig. Ein besserer manueller Ansatz:

 public function testgetUserRole () {
    $ original = $ global;

    $ Globals ['user_role'] = 'admin';
    $ this-> assertequals ('admin', getuserrole ());

    // Wiederherstellen
    $ Globals = $ original;
}

Das funktioniert, aber es ist zerbrechlich. Das Vergessen zur Wiederherstellung kann andere Tests durchbrechen.

2. Wickeln Sie $ Globals Access in einen Service ein

Einführung Eine dünne Wrapper zum abstrakten Zugriff auf Globale:

 Klasse GlobalConfig
{
    Öffentliche Funktion get ($ key, $ default = null)
    {
        Return $ global [$ key] ?? $ Standard;
    }

    öffentliche Funktionssatz ($ Key, $ value)
    {
        $ Globals [$ key] = $ value;
    }
}

Aktualisieren Sie dann Ihre Funktionen, um dies als Abhängigkeit zu akzeptieren:

 Funktion getuSerRole (GlobalConfig $ config) {
    $ config-> get ('user_role', 'guest') zurückgeben;
}

Jetzt können Sie in Tests einen Schein bestehen:

 public function testgetUserrolwithmock () {
    $ config = $ this-> createMock (globalConfig :: class);
    $ config-> methode ('get')-> WillReturn ('admin');

    $ this-> assertequals ('admin', getuSerrol ($ config));
}

Dies ist ein sicheres, inkrementelles Refactoring.

3.. Verwenden Sie die Abhängigkeitsinjektion (sogar leicht)

Vermeiden Sie es, globale Variablen direkt anzurufen. Geben Sie stattdessen die erforderlichen Werte als Parameter übergeben:

 Funktion sendemail ($ to, $ subjekt, $ von = null) {
    $ von = $ von ?? $ Globals ['admin_email'];
    // ...
}

Besser:

 Funktion Sendemail ($ to, $ Betreff, $ von) {
    // $ von ist jetzt explizit
}

Jetzt ist der Anrufer dafür verantwortlich, den Wert bereitzustellen - Tests unkompliziert.

Zukünftige Probleme verhindern

Sobald Sie die Kontrolle erlangen, setzen Sie bessere Praktiken durch:

  • Vermeiden Sie $ Globals vollständig in neuem Code.
  • Verwenden Sie Konfigurationsobjekte oder Abhängigkeitsinjektionsbehälter.
  • Nutzen Sie Umgebungsvariablen oder Konfigurationsdateien mit explizitem Laden.
  • PSR -Standards und moderne PHP -Praktiken übernehmen .

Statische Analysewerkzeuge wie Phpstan oder Psalm können dazu beitragen, die Verwendung von Superglobal zu erkennen und zu kennzeichnen.


Grundsätzlich schafft $GLOBALS versteckte Abhängigkeiten, die die Testbarkeit untergraben. Während Sie vorübergehend daran arbeiten können, indem Sie Status sparen oder Zugang einwickeln, ist die tatsächliche Korrektur in Bezug auf explizite Abhängigkeiten nachgearbeitet. Es ist nicht glamourös, aber es macht Ihren Code - und Tests - zuverlässiger.

Das obige ist der detaillierte Inhalt vonDer Albtraum von Code des Unit -Tests mit $ Global. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

PHP-Tutorial
1511
276
Abhängigkeitsinjektion: Die überlegene Alternative zu $ Global Abhängigkeitsinjektion: Die überlegene Alternative zu $ Global Aug 03, 2025 pm 03:56 PM

Abhängigkeitsinjektion (DI) Issuperiortousing $ GlobalsBecauseitMakesDependenciesExPlicit, wohingegen $ GlobalShidestheM.2.diimProvestabilitätsbylowingAsymockingofDependenzen, im Gegensatz zu $ GlobalSwhichRequiresManipulationsgloboBalstate.3.DireducestightChouPlyDecouPling -byDecoubling -byDecouPling -byDecouPling -byDecouPlingCouPling -byDecouPling -byDecouPling -ByDecouPlingCouPlingChouPlingChouPlingChouPlingChouPling -BydecouPling -byDouPlit

$ Globals vs. das `global` keyword: Verständnis der Kernunterschiede $ Globals vs. das `global` keyword: Verständnis der Kernunterschiede Aug 04, 2025 pm 03:59 PM

$ Global und global werden verwendet, um in Funktionen auf globale Variablen zuzugreifen, aber es gibt wichtige Unterschiede: 1. $ Globals ist ein Hyperglobal -Array, das über Schlüsselnamen wie $ Globals ['var'] zugreift, während global eine Sprachstruktur ist und global $ var deklariert werden muss. 2. $ global erfordert keine Vordeklaration und kann direkt verwendet werden. Global muss zuerst deklariert und dann verwendet werden. 3. $ global unterstützt dynamischen Zugriff wie $ global [$ varname], global unterstützt keine dynamische Erklärung. 4.Unset ($ globals ['var']) löscht die globale Variable selbst, während sich Unset ($ var) in globaler $ v befindet

Die Sicherheitsrisiken des ungeprüften globalen Staates über $ Global Die Sicherheitsrisiken des ungeprüften globalen Staates über $ Global Aug 03, 2025 pm 04:20 PM

Deaktiviert $ globalSallowsuninteredVariableOverwriting, aktivieren die AngriffeInipulateCriticalDatalikeSerIdSorroles-THoutValidation; 2.itincreasheteteTackSurfaceBreakingCapsulation, MakingFunctionsDependendongloboBalStaThatcanbeexplotloted

Debugging des globalen staatlichen Chaos, der durch Manipulation von $ Globals verursacht wird Debugging des globalen staatlichen Chaos, der durch Manipulation von $ Globals verursacht wird Aug 03, 2025 pm 01:46 PM

$ GlobalsManipulationCancauseUnpredictableBugsinphp; todebugandresolveit, 1.Ver Verständnis $ GlobalSprovidesglobalaccesstoAllvariables, MakingStatechangeshardtotracker;

Der Albtraum von Code des Unit -Tests mit $ Global Der Albtraum von Code des Unit -Tests mit $ Global Aug 05, 2025 am 09:06 AM

Die Verwendung von $ globals wird Unit -Tests zerstören, da sie versteckte Abhängigkeiten einführt, was zu einem staatlichen Austausch zwischen Tests, verwirrenden Einstellungen, schlechter Isolation und schwer zu simulieren. 2. Lösungen umfassen: Zuerst einsparen und dann den globalen Staat wiederherstellen, um Kontaminationen zu vermeiden; 3.. Einkapseln $ global zugreifen in Serviceklassen und über die Abhängigkeitsinjektion weitergeben, was die Verwendung von Scheinobjekten in Tests erleichtert. 4. Selbst leichte Abhängigkeitsinjektion kann die Testbarkeit erheblich verbessern, und das direkte Lesen globaler Variablen sollte vermieden werden. 5. Um zukünftige Probleme zu vermeiden, sollten $ globale deaktiviert sein, und Konfigurationsobjekte, Abhängigkeitsinjektionsbehälter oder Umgebungsvariablen sollten stattdessen verwendet werden, und mit Hilfe statischer Analyse -Tools sollten Hyperglobal -Variablen erkannt werden. Die endgültige Antwort lautet: Die Abhängigkeit von $ global

Die Gefahren des globalen Staates: Warum Sie die $ Globals von PHP vermeiden sollten Die Gefahren des globalen Staates: Warum Sie die $ Globals von PHP vermeiden sollten Aug 03, 2025 am 04:14 AM

Mit $ globalScreateShiddendependenzen, MakingFunctionShardertotest, fragil und unreusebar;

Warum moderne PHP -Frameworks $ global veraltet machen Warum moderne PHP -Frameworks $ global veraltet machen Aug 05, 2025 am 07:39 AM

ModernPhpFrameWorkSlikelaravelandSymfonyusedEpendencyInjectionToeliminatereliance $ globalsByInjectingDependencisexplicitly, Verbesserung der Testabilität und Reduzierung der Kopplung.2.

Navigieren im Minenfeld: legitime (und seltene) Anwendungsfälle für $ global Navigieren im Minenfeld: legitime (und seltene) Anwendungsfälle für $ global Aug 04, 2025 pm 02:10 PM

Mit $ globalSmaybeAcceptableInlegacysystems LikewordpressPluginSwhereTensuresCompatibilität, 2.itcanBeUsedTeTeTinguringBootstrappingBeForatePendencyInjunctionSpaceableable, 3.ItissougableableFableForread-OnlydebuggingTool-Invelopmentenventorenien.Despitethescescescescescescescescescesces

See all articles