êtes-vous prêt pour les bonbons de citrouille et le cidre? L'Halloween annuel est là! Bien que le fanatisme du monde entier ne soit pas aussi bon que les états-Unis, je veux toujours partager des conseils PHP "horribles" pour célébrer ce festival. Ce message est facile et amusant et vous montrera certains des comportements surprenants (mais logiques) de PHP lui-même, ainsi que ces fa?ons effrayantes (et peut-être très illogiques) que certaines personnes utilisent PHP pour effectuer des taches. Vous pouvez le considérer comme mon cadeau de vacances, un peu de ?bonbons spirituels? du programmeur - après tout, pourquoi les enfants de bonbons uniquement qui ne donnent pas toutes les spécialités?
Résumé des points clés
- PHP peut présenter un comportement inattendu, tel que la conservation des références en dehors de la première boucle
foreach
, entra?nant des résultats de sortie inattendus. Ce problème peut être atténué en réaffectant la cha?ne à l'aide des clés du tableau. - Lorsque vous utilisez PHP pour effectuer des taches plus complexes (telles que les scripts shell), il est crucial de comprendre comment l'environnement d'exécution est cloné lors de la fourche et comment les différentes ressources sont affectées dans tous les processus. Par exemple, lors de la connexion à une base de données, il est préférable de se connecter dans le processus parent après le processus de l'enfant de la fourche, et le processus de l'enfant se connectera par lui-même si nécessaire.
- Le modèle Singleton (en fait rien de plus que des variables globales orientées objet sophistiqué) peut rendre le débogage difficile. Il est recommandé d'éviter le mode Singleton dans la mesure du possible.
- Bien que les pratiques de codage non conventionnelles comme ?PHP effrayante? soient intéressantes et éducatives, elles ne sont généralement pas considérées
tableau de bizarrerie
Il était une fois, dans un studio de développement pas si lointain, Arthur écrivait toujours du code tard dans la nuit. Il ne savait pas que le tableau qu'il était sur le point d'utiliser était hanté! Avec chaque robinet sur le clavier, il sentit un froid glisser de sa colonne vertébrale, mais il a bêtement ignoré cette subtile prémonition.
<?php $spell = array("double", "toil", "trouble", "cauldron", "bubble"); foreach ($spell as &$word) { $word = ucfirst($word); } foreach ($spell as $word) { echo $word . "n"; }
D'accord, ce tableau n'est pas vraiment hanté, mais la sortie est en effet inattendue:
<code>Double Toil Trouble Cauldron Cauldron</code>
La raison de ce comportement "terrifiant" est de savoir comment PHP conserve les références en dehors de la première boucle foreach
. Lorsque la deuxième boucle commence, $word
est toujours une référence, pointant vers le dernier élément du tableau. La première itération de la deuxième boucle attribue "double" à $word
, qui écrase le dernier élément. La deuxième itération attribue "le travail" à $word
, en remplissant à nouveau le dernier élément. Lorsque la boucle lit la valeur du dernier élément, elle a été remplacée plusieurs fois. Pour avoir un aper?u de ce comportement, je recommande de lire le billet de blog de Johannes Schlüter sur le sujet, "Références et Foreach". Vous pouvez également exécuter cette version légèrement modifiée et vérifier sa sortie pour mieux comprendre ce que fait PHP:
<?php $spell = array("double", "toil", "trouble", "cauldron", "bubble"); foreach ($spell as &$word) { $word = ucfirst($word); } foreach ($spell as $word) { echo $word . "n"; }
Arthur a appris une le?on très importante cette nuit-là et a corrigé son code avec les clés du tableau pour réaffecter la cha?ne:
<code>Double Toil Trouble Cauldron Cauldron</code>
Connexion de la base de données fant?mes
PHP est de plus en plus demandé non seulement de générer des pages Web chaque jour. Le nombre de scripts shell écrits en PHP augmente, et les taches effectuées par ces scripts deviennent de plus en plus complexes, car les développeurs voient les avantages de l'intégration des langages de développement. En règle générale, les performances de ces scripts sont acceptables et les compromis effectués pour la commodité sont prouvés. Susan écrit donc une tache de traitement parallèle dont le code est similaire à ce qui suit:
<?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"; }
son code alimente les processus de l'enfant pour effectuer des travaux de longue durée en parallèle, tandis que le processus parent continue de surveiller les processus de l'enfant et rapporte les résultats lorsque tous les enfants se terminent.
<?php foreach ($spell as $key => $word) { $spell[$key] = ucfirst($word); }
Cependant, les dirigeants de Susan lui ont demandé de journaliser les informations sur l'état dans le journal au lieu de les sortir en sortie standard. Susan a prolongé son code à l'aide d'un mécanisme de connexion de la base de données PDO motif Singleton qui était déjà inclus dans la base de code de l'entreprise.
#! /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";
Susan s'attend à voir des lignes dans le tableau timings
mise à jour; processus. Malheureusement, l'exécution lance une exception et la base de données ne reflète pas ses attentes.
<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>
#! /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; } }
Comme le tableau d'Arthur, la base de données de Susan est-elle hantée? Eh bien, si je vous donne les indices suivants, voyez si vous pouvez reconstituer ce mystère: 1. Lorsqu'un processus est fourche, le processus parent est copié en tant que processus enfant. Ces processus répliqués s'exécutent ensuite en parallèle à partir de ce moment. 2. Les membres statiques sont partagés entre tous les cas de la classe.
La connexion PDO est enveloppée en singleton, donc toute référence dans l'application pointe la même ressource en mémoire. DB::connection()
Renvoie d'abord la référence de l'objet, la fourche du processus parent, le processus de l'enfant continue de traiter, tandis que le processus parent attend, le processus de l'enfant se termine et PHP nettoie les ressources utilisées, puis le processus parent essaie d'utiliser l'objet de base de données encore. La connexion à MySQL a été fermée dans le processus de l'enfant, donc l'appel final échoue. Essayer na?vement d'obtenir la connexion avant la dernière requête de journalisation n'aidera pas Susan car la même instance PDO échouée sera retournée car c'est un singleton. Je recommande d'éviter les singletons - ce ne sont vraiment que des variables mondiales axées sur les objets, ce qui rend le débogage difficile. Même dans notre cas, la connexion sera toujours fermée par le processus de l'enfant, mais si DB::connection()
est appelé avant la deuxième requête, il renverra au moins une nouvelle connexion sans singleton. Mais une meilleure fa?on consiste à comprendre comment l'environnement d'exécution est cloné lors de la fourche et comment les différentes ressources sont affectées dans tous les processus. Dans ce cas, il est préférable de se connecter à la base de données dans le processus parent après le processus de l'enfant de la fourche, et le processus de l'enfant se connectera par lui-même si nécessaire. Les connexions ne doivent pas être partagées.
<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. "Frankenstein" de Mary Shelley raconte l'histoire d'un scientifique créant la vie, mais il se sent dégo?té de sa laideur et l'abandonne. Après une mort et une destruction inutiles, le Dr Frankenstein poursuit sa création jusqu'à la fin du monde, essayant de le détruire. Beaucoup d'entre nous ont donné une vie en code aussi laide que nous souhaitons plus tard que nous pourrions y échapper - le code est si laid, si terne, si chaotique qu'il nous donne envie de vomir, mais il veut juste l'amour et la compréhension. Il y a quelques années, j'ai joué avec une idée des interfaces de base de données et à quoi ils ressembleraient s'ils suivaient plus strictement la philosophie d'Unix de "tout est un fichier": les requêtes seront écrites dans "Fichier", les ensembles de résultats seront être lu à partir du "fichier". Une chose mène à une autre, après une partie de ma propre mort et de mon codage destructeur, j'ai écrit la classe suivante qui a peu à voir avec mes pensées initiales: Le résultat est un génie, mais dégo?tant: une instance qui ressemble à un objet (pas de méthode API réelle), un tableau ou une cha?ne ... J'ai écrit un blog peu de temps après et je l'ai marqué comme mal. Des amis et des collègues qui l'ont vu presque tous ont répondu de la même manière: "Génial! Tuez-le maintenant ... Br?lez-le avec le feu." Mais au fil des ans, j'avoue que je l'ai adouci. La seule règle qu'il viole vraiment est les attentes du programmeur pour les méthodes de dénomination fade comme Conclusion J'espère que vous avez apprécié ce post et que ces exemples ne vous font pas (trop) cauchemars! Je crois que vous avez également vos propres histoires sur du code hanté ou terrible, peu importe où vous êtes, vous n'avez pas besoin de laisser le plaisir des vacances dispara?tre, alors n'hésitez pas à partager votre terrible histoire de PHP dans les commentaires ci-dessous! images de Fotolia (Ce qui suit est la FAQ, qui a été ajustée et rationalisée en fonction du contenu d'origine) Les questions fréquemment posées sur "Spooky Scary PHP" Qu'est-ce que "PHP effrayant effrayant"? "PHP effrayant effrayant" est une méthode de codage PHP unique qui implique l'utilisation de méthodes non conventionnelles ou inattendues pour obtenir certains résultats. Cela peut inclure l'utilisation de fonctions moins connues, en profitant des fonctionnalités de la langue et même en utilisant du code qui ne semble pas fonctionner mais fonctionne. C'est une fa?on amusante et excitante d'explorer la profondeur de PHP et conduit souvent à des découvertes surprenantes et inspirantes. Comment commencer à apprendre "php effrayant effrayant"? La meilleure fa?on d'apprendre le "php effrayant effrayant" est d'avoir une solide compréhension des bases de PHP. Une fois que vous êtes satisfait des bases, vous pouvez commencer à explorer les coins les plus obscurs de la langue. La lecture d'articles, de tutoriels et de discussions sur le forum sur le "php effrayant effrayant" peut également être très utile. N'oubliez pas que l'objectif n'est pas d'écrire un code efficace ou pratique, mais d'explorer et de comprendre la langue de manière plus profonde. "Spooky effrayant PHP" est-il une bonne pratique? "SPOOKY SCARY PHP" n'est généralement pas considéré comme une bonne pratique pour rédiger du code de production. Il implique généralement l'utilisation de fonctions ou de techniques inefficaces, peu claires ou imprévisibles. Cependant, c'est peut-être un excellent moyen d'en savoir plus sur la langue et de défier votre compréhension de PHP. Cela ressemble plus à un outil d'apprentissage et à une expérience amusante qu'à un style de codage pratique. est-il "effrayant effrayant" nocif? Bien que "Spooky effrayant PHP" soit amusant et éducatif, assurez-vous de l'utiliser de manière responsable. Certaines technologies utilisées dans "Spooky Scary PHP" peuvent causer des dommages s'ils sont utilisés dans des environnements en temps réel, tels que ceux qui exploitent les fonctionnalités ou les erreurs dans la langue. Assurez-vous de tester soigneusement tout code que vous écrivez et n'utilisez jamais la technologie "Spooky Scary PHP" dans des parties importantes de votre projet. Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!<?php
$spell = array("double", "toil", "trouble", "cauldron", "bubble");
foreach ($spell as &$word) {
$word = ucfirst($word);
}
foreach ($spell as $word) {
echo $word . "n";
}
<code>Double
Toil
Trouble
Cauldron
Cauldron</code>
query()
et result()
. Au lieu de cela, il utilise la cha?ne de requête elle-même comme méthode de requête, l'objet est l'interface et le jeu de résultats est le résultat. Bien s?r, ce n'est pas pire qu'une interface ORM trop généralisée, qui relie les méthodes select()
et where()
ensemble, qui ressemblent à des requêtes SQL, mais qui a plus ->
. Peut-être que ma classe n'est pas si mal? Peut-être que ?a veut juste être aimé? Bien s?r, je ne veux pas mourir dans l'Arctique!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Les problèmes et les solutions courants pour la portée de la variable PHP incluent: 1. La variable globale ne peut pas être accessible dans la fonction, et elle doit être transmise en utilisant le mot-clé ou le paramètre global; 2. La variable statique est déclarée avec statique, et elle n'est initialisée qu'une seule fois et la valeur est maintenue entre plusieurs appels; 3. Des variables hyperglobales telles que $ _get et $ _post peuvent être utilisées directement dans n'importe quelle portée, mais vous devez faire attention au filtrage s?r; 4. Les fonctions anonymes doivent introduire des variables de portée parents via le mot clé Utiliser, et lorsque vous modifiez les variables externes, vous devez passer une référence. La ma?trise de ces règles peut aider à éviter les erreurs et à améliorer la stabilité du code.

Pour gérer en toute sécurité les téléchargements de fichiers PHP, vous devez vérifier la source et taper, contr?ler le nom et le chemin du fichier, définir les restrictions du serveur et traiter les fichiers multimédias deux fois. 1. Vérifiez la source de téléchargement pour empêcher le CSRF via le jeton et détecter le type de mime réel via FINFO_FILE en utilisant le contr?le de liste blanche; 2. Renommez le fichier à une cha?ne aléatoire et déterminez l'extension pour la stocker dans un répertoire non Web en fonction du type de détection; 3. La configuration PHP limite la taille de téléchargement et le répertoire temporaire Nginx / Apache interdit l'accès au répertoire de téléchargement; 4. La bibliothèque GD résait les images pour effacer des données malveillantes potentielles.

Il existe trois méthodes courantes pour le code de commentaire PHP: 1. Utiliser // ou # pour bloquer une ligne de code, et il est recommandé d'utiliser //; 2. Utiliser /.../ pour envelopper des blocs de code avec plusieurs lignes, qui ne peuvent pas être imbriquées mais peuvent être croisées; 3. Compétences combinées Commentaires tels que l'utilisation / if () {} / pour contr?ler les blocs logiques, ou pour améliorer l'efficacité avec les touches de raccourci de l'éditeur, vous devez prêter attention aux symboles de fermeture et éviter les nidification lorsque vous les utilisez.

AgeneratorInphpisamemory-EfficientwaytoterateOrgedatasetsByyieldingValuesonEatatimeIntedofreturningThemallAtonce.1.GeneratorsUsEtheieldKeywordToproduceValuesondemand, ReducingMemoryUsage.2.TheyAreusefulForHandlingBigloops, ReadingLargeFiles, OR OR.

La clé pour rédiger des commentaires PHP est de clarifier l'objectif et les spécifications. Les commentaires devraient expliquer "pourquoi" plut?t que "ce qui a été fait", en évitant la redondance ou trop de simplicité. 1. Utilisez un format unifié, tel que DocBlock (/ * /) pour les descriptions de classe et de méthode afin d'améliorer la lisibilité et la compatibilité des outils; 2. Soulignez les raisons de la logique, telles que pourquoi les sauts JS doivent être sortis manuellement; 3. Ajoutez une description d'une vue d'ensemble avant le code complexe, décrivez le processus dans les étapes et aidez à comprendre l'idée globale; 4. Utilisez TODO et FIXME Rationalement pour marquer des éléments et des problèmes de taches pour faciliter le suivi et la collaboration ultérieurs. De bonnes annotations peuvent réduire les co?ts de communication et améliorer l'efficacité de la maintenance du code.

En PHP, vous pouvez utiliser des crochets ou des accolades bouclées pour obtenir des caractères d'index spécifiques à la cha?ne, mais les crochets sont recommandés; L'index commence à partir de 0 et l'accès à l'extérieur de la plage renvoie une valeur nulle et ne peut pas se voir attribuer une valeur; MB_substr est nécessaire pour gérer les caractères multi-octets. Par exemple: $ str = "Hello"; echo $ str [0]; sortie h; et les caractères chinois tels que MB_substr ($ str, 1,1) doivent obtenir le résultat correct; Dans les applications réelles, la longueur de la cha?ne doit être vérifiée avant le boucle, les cha?nes dynamiques doivent être vérifiées pour la validité et les projets multilingues recommandent d'utiliser des fonctions de sécurité multi-octets uniformément.

Toinstallphpquickly, usexAmpPonWindowsorHomebrewonMacos.1.onwindows, downloadAndInstallxAmppp, selectComponents, startapache et placefilesInhtdocs.2.

Toléarnphpeffective, startBySettingUpAlocalServerERironmentUsingToolsLILYXAMPPANDACODEDITERLIGHILLEVSCODE.1) INSTRUSITIONXAMPFORAPACHE, MYSQL, ANDPHP.2) USACODEDEDITORFORSYNTAXSUPPORT.3)
