Spooky Scary Php

William Shakespeare
William ShakespeareOriginal
2025-02-25 09:25:08597Durchsuche

Spooky Scary PHP

Sind Sie bereit für Kürbis Süßigkeiten und Apfelwein? Das jährliche Halloween ist wieder da! Obwohl der Fanatismus auf der ganzen Welt nicht so gut ist wie die Vereinigten Staaten, möchte ich immer noch einige "schreckliche" PHP -Tipps teilen, um dieses Festival zu feiern. Dieser Beitrag ist einfach und unterhaltsam und zeigt Ihnen einige der überraschenden (aber logischen) Verhaltensweisen von PHP selbst sowie diese gruseligen (und möglicherweise sehr unlogischen) Möglichkeiten, wie einige Menschen PHP verwenden, um Aufgaben zu erledigen. Sie können es als mein Urlaubsgeschenk betrachten, ein bisschen Programmierer "Spirituelle Süßigkeiten" - warum Süßigkeiten nur Kinder, die nicht alle Köstlichkeiten geben?

Zusammenfassung der Schlüsselpunkte

  • PHP kann ein unerwartetes Verhalten aufweisen, wie z. Dieses Problem kann durch Neuzuweisung der Zeichenfolge mit den Schlüssel des Arrays gelindert werden. foreach
  • Bei der Verwendung von PHP zur Ausführung komplexerer Aufgaben (z. B. Shell -Skripte) ist es entscheidend zu verstehen, wie die Ausführungsumgebung bei der Gabelung kloniert wird und wie verschiedene Ressourcen in allen Prozessen beeinflusst werden. Wenn Sie beispielsweise eine Verbindung zu einer Datenbank herstellen, ist es am besten, sich nach dem Gabel Child -Prozess im übergeordneten Prozess zu verbinden, und der untergeordnete Prozess wird bei Bedarf von selbst hergestellt.
  • Singleton-Muster (eigentlich nichts anderes als ausgefallene objektorientierte globale Variablen) kann das Debuggen erschweren. Es wird empfohlen, nach Möglichkeit den Singleton -Modus zu vermeiden.
  • Während unkonventionelle Codierungspraktiken wie "gruseliges beängstigendes PHP" interessant und lehrreich sind, werden sie normalerweise nicht als gute Praktiken für das Schreiben von Produktionscode angesehen, da sie häufig ineffizienten Gebrauch, unklar oder unvorhersehbar sind.

HACED -Array

Es war einmal, dass Arthur in einem nicht so fernigen Entwicklungsstudio spät in der Nacht Code geschrieben hat. Er wusste nicht, dass das Array, das er benutzen wollte, heimgesucht wurde! Mit jedem Tap auf der Tastatur spürte er, wie eine Kälte von seiner Wirbelsäule rutschte, aber er ignorierte diese subtile Vorahnung dumm.

<code class="language-php"><?php
$spell = array("double", "toil", "trouble", "cauldron", "bubble");
foreach ($spell as &$word) {
    $word = ucfirst($word);
}
foreach ($spell as $word) {
    echo $word . "n";
}</code>
Okay, dieses Array ist nicht wirklich verfolgt, aber die Ausgabe ist in der Tat unerwartet:

<code>Double
Toil
Trouble
Cauldron
Cauldron</code>
Der Grund für dieses "erschreckende" Verhalten ist, wie PHP Referenzen außerhalb der ersten

-Schule behält. Wenn die zweite Schleife beginnt, ist foreach immer noch eine Referenz, die auf das letzte Element des Arrays zeigt. Die erste Iteration der zweiten Schleife weist $word "Double" zu, was das letzte Element überschreibt. Die zweite Iteration weist $word "Mühe" zu und überschreibt das letzte Element erneut. Wenn die Schleife den Wert des letzten Elements liest, wurde er mehrmals überschrieben. Um einen Einblick in dieses Verhalten zu erhalten, empfehle ich, Johannes Schlüters Blog -Beitrag zum Thema "Referenzen und Foreach" zu lesen. Sie können diese leicht modifizierte Version auch ausführen und ihre Ausgabe überprüfen, um besser zu verstehen, was PHP tut: $word

<code class="language-php"><?php
$spell = array("double", "toil", "trouble", "cauldron", "bubble");
foreach ($spell as &$word) {
    $word = ucfirst($word);
}
foreach ($spell as $word) {
    echo $word . "n";
}</code>

Arthur lernte in dieser Nacht eine sehr wichtige Lektion und fixierte seinen Code mit den Schlüssel des Arrays, um die Zeichenfolge neu zuzuweisen:

<code>Double
Toil
Trouble
Cauldron
Cauldron</code>

Ghost Database Connection

PHP wird zunehmend nicht nur jeden Tag gebeten, Webseiten zu generieren. Die Anzahl der in PHP geschriebenen Shell -Skripte nimmt zu, und die von diesen Skripten ausgeführten Aufgaben werden immer komplexer, da Entwickler die Vorteile der Integration von Entwicklungssprachen sehen. In der Regel ist die Leistung dieser Skripte akzeptabel und die für die Bequemlichkeit geführten Kompromisse werden nachgewiesen. Also schreibt Susan eine parallele Verarbeitungsaufgabe, deren Code dem folgenden ähnlich ist:

<code class="language-php"><?php
$spell = array("double", "toil", "trouble", "cauldron", "bubble");
foreach ($spell as &$word) {
    $word = ucfirst($word);
}
var_dump($spell);
foreach ($spell as $word) {
    echo join(" ", $spell) . "n";
}</code>

Ihr Code greift die untergeordneten Prozesse auf, um eine langjährige Arbeit parallel auszuführen, während der übergeordnete Prozess weiterhin die Kinderprozesse überwacht und die Ergebnisse meldet, wenn alle Kinder enden.

<code class="language-php"><?php
foreach ($spell as $key => $word) {
    $spell[$key] = ucfirst($word);
}</code>

Susans Führung forderte sie jedoch auf, Statusinformationen in das Protokoll zu protokollieren, anstatt sie an die Standardausgabe auszugeben. Susan erweiterte ihren Code mit einem Singleton -Muster -PDO -Datenbankverbindungsmechanismus, der bereits in der Codebasis des Unternehmens enthalten war.

<code class="language-php">#! /usr/bin/env php
<?php
$pids = array();
foreach (range(0, 4) as $i) {
    $pid = pcntl_fork();
    if ($pid > 0) {
        echo "Fork child $pid.n";
        // record PIDs in reverse lookup array
        $pids[$pid] = true;
    } else if ($pid == 0) {
        echo "Child " . posix_getpid() . " working...n";
        sleep(5);
        exit;
    }
}
// wait for children to finish
while (count($pids)) {
    $pid = pcntl_wait($status);
    echo "Child $pid finished.n";
    unset($pids[$pid]);
}
echo "Tasks complete.n";</code>

Susan erwartet, dass Zeilen in der Tabelle timings aktualisiert werden. Prozesse. Leider bringt die Ausführung eine Ausnahme aus und die Datenbank spiegelt ihre Erwartungen nicht wider.

<code>Fork child 1634.
Fork child 1635.
Fork child 1636.
Child 1634 working...
Fork child 1637.
Child 1635 working...
Child 1636 working...
Fork child 1638.
Child 1637 working...
Child 1638 working...
Child 1637 finished.
Child 1636 finished.
Child 1638 finished.
Child 1635 finished.
Child 1634 finished.
Tasks complete.</code>
<code class="language-php">#! /usr/bin/env php
<?php
$db = Db::connection();
$db->query("UPDATE timings SET tstamp=NOW() WHERE name='start time'");

$pids = array();
foreach (range(0, 4) as $i) {
    ...
}
while (count($pids)) {
    ...
}

$db->query("UPDATE timings SET tstamp=NOW() WHERE name='stop time'");

class Db
{
    protected static $db;

    public static function connection() {
        if (!isset(self::$db)) {
            self::$db = new PDO("mysql:host=localhost;dbname=test",
                "dbuser", "dbpass");
            self::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        return self::$db;
    }
}</code>

Wie Arthurs Array ist Susans Datenbank heimgesucht? Wenn ich Ihnen die folgenden Hinweise gebe, prüfen Sie, ob Sie dieses Geheimnis zusammenfügen können: 1. Wenn ein Prozess Gabel ist, wird der übergeordnete Prozess als Kinderprozess kopiert. Diese replizierten Prozesse führen dann von da an parallel aus. 2. statische Mitglieder werden unter allen Fällen der Klasse geteilt.

PDO -Verbindung wird als Singleton verpackt, sodass jeder Hinweis darauf in der Anwendung auf dieselbe Ressource im Speicher zeigt. DB::connection() Gibt zunächst die Objektreferenz, die übergeordnete Prozessgabel, der untergeordnete Prozess fort wieder. Die Verbindung zu MySQL wurde im Kinderprozess geschlossen, sodass der letzte Anruf fehlschlägt. Naiv zu versuchen, die Verbindung erneut zu erhalten, bevor die endgültige Protokollierungsanfrage Susan nicht hilft, da die gleiche fehlgeschlagene PDO -Instanz zurückgegeben wird, da es sich um einen Singleton handelt. Ich empfehle, Singletons zu vermeiden - sie sind wirklich nur ausgefallene objektorientierte globale Variablen, was das Debuggen erschwert. Selbst in unserem Fall wird die Verbindung immer noch durch den Kinderprozess geschlossen, aber wenn DB::connection() vor der zweiten Abfrage gerufen wird, wird sie zumindest eine neue Verbindung ohne Singleton zurückgeben. Ein besserer Weg ist jedoch zu verstehen, wie die Ausführungsumgebung bei Gabel geklont wird und wie verschiedene Ressourcen in allen Prozessen beeinflusst werden. In diesem Fall ist es am besten, eine Verbindung zur Datenbank im übergeordneten Prozess nach dem Gabel Child -Prozess herzustellen, und der untergeordnete Prozess wird bei Bedarf selbst eine Verbindung hergestellt. Verbindungen sollten nicht geteilt werden.

<code>PHP Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2006 MySQL server has gone away' in /home/susanbrown/test.php:21
Stack trace:
#0 /home/susanbrown/test.php(21): PDO->query('UPDATE timers S...')
#1 {main}</code>

dr

Mary Shelleys "Frankenstein" erzählt die Geschichte eines Wissenschaftlers, das Leben schafft, aber er fühlt sich angewidert von seiner Hässlichkeit und verlässt es. Nach einigen unnötigen Tod und Zerstörung verfolgt Dr. Frankenstein seine Schöpfung bis zum Ende der Welt und versucht, sie zu zerstören. Viele von uns haben so hässliches Code -Leben gegeben, dass wir uns später wünschten, wir könnten ihm entkommen - der Code ist so hässlich, so langweilig, so chaotisch, dass wir uns erbrechen wollen, aber er will nur Liebe und Verständnis. Vor ein paar Jahren habe ich mit einer Idee über Datenbankschnittstellen und wie sie aussehen, wenn sie die Unix -Philosophie von "Alles is eine Datei" aussehen würden: Abfragen werden in "Datei" geschrieben. aus der "Datei" gelesen werden. Eines führt zum anderen, nachdem ich nach einigen meiner eigenen Tod und zerstörerischen Kodierung die folgende Klasse geschrieben habe, die wenig mit meinen ersten Gedanken zu tun hat:

<code class="language-php"><?php
$spell = array("double", "toil", "trouble", "cauldron", "bubble");
foreach ($spell as &$word) {
    $word = ucfirst($word);
}
foreach ($spell as $word) {
    echo $word . "n";
}</code>

Das Ergebnis ist Genie, aber ekelhaft: eine Instanz, die wie ein Objekt (keine echte API -Methode), ein Array oder eine Zeichenfolge aussieht ...

<code>Double
Toil
Trouble
Cauldron
Cauldron</code>

Ich habe kurz danach einen Blog geschrieben und ihn als böse gekennzeichnet. Freunde und Kollegen, die es fast alle sahen: "Großartig! Töte es jetzt ... verbrenne es mit Feuer." Die einzige Regel, die sie wirklich verletzt, sind die Erwartungen des Programmierers an milde Benennungsmethoden wie query() und result(). Stattdessen verwendet es die Abfragezeichenfolge selbst als Abfragemethode, das Objekt ist die Schnittstelle und der Ergebnissatz ist das Ergebnis. Natürlich ist es nicht schlechter als eine übergeneralisierte ORM -Schnittstelle, die select() und where() Methoden miteinander verbindet, die wie SQL -Abfragen aussieht, aber mehr -> hat. Vielleicht ist meine Klasse das nicht böse? Vielleicht will es nur geliebt werden? Natürlich möchte ich in der Arktis nicht sterben!

Schlussfolgerung

Ich hoffe, Sie haben diesen Beitrag genossen und dass diese Beispiele Sie (zu viele) Albträume nicht bringen! Ich glaube, Sie haben auch Ihre eigenen Geschichten über heimgesuchte oder schreckliche Code, egal wo Sie sich befinden, Sie müssen den Urlaubsspaß nicht verschwinden lassen. Teilen Sie also Ihre schreckliche PHP -Geschichte in den Kommentaren unten! Bilder aus Fotolien

(Folgendes ist FAQ, die gemäß dem ursprünglichen Inhalt angepasst und optimiert wurden)

Häufig gestellte Fragen zu "gruseliger gruseliger PHP"

Was ist "gruseliges beängstigendes PHP"?

"Spooky Scary PHP" ist eine eindeutige PHP -Codierungsmethode, die die Verwendung unkonventioneller oder unerwarteter Methoden zur Erzielung bestimmter Ergebnisse beinhaltet. Dies kann die Verwendung weniger bekannter Funktionen, die Nutzung von Funktionen in der Sprache und sogar die Verwendung von Code, die nicht funktionieren, aber funktioniert, umfassen. Es ist eine unterhaltsame und aufregende Möglichkeit, die Tiefe von PHP zu erkunden und oft zu überraschenden und inspirierenden Entdeckungen zu führen.

Wie kann man "Spooky Scary PHP" lernen?

Der beste Weg, um "gruselige, beängstigende PHP" zu lernen, ist ein solides Verständnis der Grundlagen von PHP. Sobald Sie mit den Grundlagen zufrieden sind, können Sie die dunklen Ecken der Sprache erkunden. Auch das Lesen von Artikeln, Tutorials und Forum -Diskussionen über "gruselige Scary PHP" kann sehr hilfreich sein. Denken Sie daran, das Ziel ist es nicht, effiziente oder praktische Code zu schreiben, sondern die Sprache tiefer zu erforschen und zu verstehen.

Ist "gruseliges beängstigendes PHP" eine gute Praxis?

"Spooky Scary PHP" wird normalerweise nicht als gute Praxis für das Schreiben von Produktionscode angesehen. Es beinhaltet normalerweise die Verwendung ineffizienter, unklarer oder unvorhersehbarer Funktionen oder Techniken. Es kann jedoch eine großartige Möglichkeit sein, mehr über die Sprache zu erfahren und Ihr Verständnis von PHP in Frage zu stellen. Es ist eher ein Lernwerkzeug und ein lustiges Experiment als ein praktischer Codierungsstil.

Ist "gruseliges beängstigendes PHP" schädlich?

Während "Spooky Scary PHP" lustig und lehrreich ist, verwenden Sie es verantwortungsbewusst. Einige Technologien, die in "Spooky Scary PHP" verwendet werden, können Schaden zufügen, wenn sie in Echtzeitumgebungen verwendet werden, wie z. B. solche, die Merkmale oder Fehler in der Sprache ausnutzen. Stellen Sie sicher, dass Sie jeden Code, den Sie schreiben, gründlich testen, und verwenden Sie niemals die "Spooky Scary PHP" -Technologie in wichtigen Teilen Ihres Projekts.

Das obige ist der detaillierte Inhalt vonSpooky Scary Php. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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