亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

怪異的可怕php

Feb 25, 2025 am 09:25 AM

Spooky Scary PHP

準(zhǔn)備好南瓜糖和蘋果酒了嗎?一年一度的萬(wàn)圣節(jié)又到了!雖然全球各地慶祝萬(wàn)圣節(jié)的狂熱程度不及美國(guó),但我還是想分享一些“恐怖”的PHP技巧來慶祝這個(gè)節(jié)日。這篇文章輕松有趣,將向您展示PHP自身的一些令人驚訝(但合乎邏輯)的行為,以及一些人利用PHP完成任務(wù)時(shí)那些令人毛骨悚然(且可能非常不合邏輯)的方法。您可以把它看作我的節(jié)日禮物,一點(diǎn)程序員的“精神糖果”——畢竟,為什么只有不給糖就搗蛋的小朋友才能享用所有美味呢?

要點(diǎn)總結(jié)

  • PHP可能會(huì)表現(xiàn)出意想不到的行為,例如在第一個(gè)foreach循環(huán)之外保留引用,導(dǎo)致輸出結(jié)果出乎意料。可以通過使用數(shù)組的鍵將字符串重新賦值來緩解這個(gè)問題。
  • 當(dāng)使用PHP執(zhí)行更復(fù)雜的任務(wù)(例如shell腳本)時(shí),理解在fork時(shí)執(zhí)行環(huán)境是如何克隆的,以及各種資源如何在所有進(jìn)程中受到影響至關(guān)重要。例如,連接數(shù)據(jù)庫(kù)時(shí),最好在fork子進(jìn)程后在父進(jìn)程中連接,子進(jìn)程如有需要?jiǎng)t自行連接。
  • 單例模式(實(shí)際上只不過是花哨的面向?qū)ο笕肿兞浚?huì)使調(diào)試變得困難。建議盡可能避免使用單例模式。
  • 雖然像“Spooky Scary PHP”這樣的非常規(guī)編碼實(shí)踐很有趣且具有教育意義,但它們通常不被認(rèn)為是編寫生產(chǎn)代碼的良好實(shí)踐,因?yàn)樗鼈兺ǔI婕笆褂眯实拖隆⒉磺宄虿豢深A(yù)測(cè)的函數(shù)或技術(shù)。

鬧鬼的數(shù)組

從前,在一個(gè)不那么遙遠(yuǎn)的開發(fā)工作室里,亞瑟深夜還在編寫代碼。他不知道自己即將使用的數(shù)組鬧鬼了!每敲擊一次鍵盤,他都感到一陣寒意從脊椎滑落,但他愚蠢地忽略了這種微妙的預(yù)感。

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

好吧,這個(gè)數(shù)組并沒有真正鬧鬼,但輸出結(jié)果確實(shí)出乎意料:

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

這種“恐怖”行為的原因在于PHP如何在第一個(gè)foreach循環(huán)之外保留引用。當(dāng)?shù)诙€(gè)循環(huán)開始時(shí),$word仍然是引用,指向數(shù)組的最后一個(gè)元素。第二個(gè)循環(huán)的第一次迭代將“double”賦值給$word,這覆蓋了最后一個(gè)元素。第二次迭代將“toil”賦值給$word,再次覆蓋最后一個(gè)元素。當(dāng)循環(huán)讀取最后一個(gè)元素的值時(shí),它已經(jīng)被多次覆蓋了。要深入了解這種行為,我建議閱讀Johannes Schlüter關(guān)于這個(gè)主題的博客文章,“References and foreach”。您還可以運(yùn)行這個(gè)稍微修改過的版本并檢查其輸出,以便更好地了解PHP正在做什么:

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

亞瑟那天晚上吸取了一個(gè)非常重要的教訓(xùn),并使用數(shù)組的鍵將字符串重新賦值來修復(fù)了他的代碼:

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

幽靈數(shù)據(jù)庫(kù)連接

PHP越來越多的被要求不僅僅是每天生成網(wǎng)頁(yè)。用PHP編寫的shell腳本數(shù)量正在增加,這些腳本執(zhí)行的任務(wù)也越來越復(fù)雜,因?yàn)殚_發(fā)人員看到了整合開發(fā)語(yǔ)言的優(yōu)點(diǎn)。通常情況下,這些腳本的性能是可以接受的,為了方便而進(jìn)行的權(quán)衡是可以證明的。因此,蘇珊正在編寫一個(gè)并行處理任務(wù),其代碼類似于以下代碼:

<?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";
}

她的代碼fork了子進(jìn)程來并行執(zhí)行一些長(zhǎng)時(shí)間運(yùn)行的工作,而父進(jìn)程繼續(xù)監(jiān)控子進(jìn)程,并在所有子進(jìn)程終止時(shí)報(bào)告結(jié)果。

<?php
foreach ($spell as $key => $word) {
    $spell[$key] = ucfirst($word);
}

然而,蘇珊的領(lǐng)導(dǎo)要求她將狀態(tài)信息記錄到日志中,而不是輸出到標(biāo)準(zhǔn)輸出。蘇珊使用已經(jīng)包含在公司代碼庫(kù)中的單例模式PDO數(shù)據(jù)庫(kù)連接機(jī)制擴(kuò)展了她的代碼。

#! /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";

蘇珊期望看到timings表中的行被更新;“start time”行應(yīng)該列出整個(gè)進(jìn)程啟動(dòng)的時(shí)間戳,“stop time”行應(yīng)該列出所有進(jìn)程完成的時(shí)間戳。不幸的是,執(zhí)行拋出了異常,數(shù)據(jù)庫(kù)沒有反映她的預(yù)期。

<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;
    }
}

像亞瑟的數(shù)組一樣,蘇珊的數(shù)據(jù)庫(kù)也鬧鬼了嗎?好吧,如果我給你以下線索,看看你能不能把這個(gè)謎團(tuán)拼湊起來:1. 當(dāng)一個(gè)進(jìn)程fork時(shí),父進(jìn)程會(huì)被復(fù)制為子進(jìn)程。然后,這些復(fù)制的進(jìn)程從那時(shí)起并行執(zhí)行。2. 靜態(tài)成員在類的所有實(shí)例之間共享。

PDO連接被包裝為單例,因此應(yīng)用程序中對(duì)它的任何引用都指向內(nèi)存中的相同資源。DB::connection()首先返回對(duì)象引用,父進(jìn)程fork,子進(jìn)程繼續(xù)處理,而父進(jìn)程等待,子進(jìn)程終止并PHP清理使用的資源,然后父進(jìn)程嘗試再次使用數(shù)據(jù)庫(kù)對(duì)象。連接到MySQL的連接已在子進(jìn)程中關(guān)閉,因此最終調(diào)用失敗。在最終日志記錄查詢之前天真地嘗試再次獲取連接不會(huì)幫助蘇珊,因?yàn)闀?huì)返回相同的失效PDO實(shí)例,因?yàn)樗且粋€(gè)單例。我建議避免使用單例——它們實(shí)際上只不過是花哨的面向?qū)ο蟮娜肿兞浚@會(huì)使調(diào)試變得困難。即使在我們的例子中,連接仍然會(huì)被子進(jìn)程關(guān)閉,但如果在第二個(gè)查詢之前調(diào)用DB::connection(),如果不用單例,它至少會(huì)返回一個(gè)新的連接。但更好的方法是理解在fork時(shí)執(zhí)行環(huán)境是如何克隆的,以及各種資源如何在所有進(jìn)程中受到影響。在這種情況下,最好在fork子進(jìn)程后在父進(jìn)程中連接到數(shù)據(jù)庫(kù),子進(jìn)程如有需要?jiǎng)t自行連接。連接不應(yīng)該共享。

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

弗蘭肯斯坦博士的API

瑪麗·雪萊的《弗蘭肯斯坦》講述的是一個(gè)科學(xué)家創(chuàng)造生命的故事,但他對(duì)其丑陋感到厭惡,于是拋棄了它。在一些不必要的死亡和破壞之后,弗蘭肯斯坦博士追捕他的創(chuàng)造物,直到世界的盡頭,試圖摧毀它。我們?cè)S多人都賦予了如此丑陋的代碼以生命,以至于我們后來希望自己能逃離它——代碼如此丑陋、如此愚鈍、如此混亂,以至于讓我們想嘔吐,但它只想要愛和理解。幾年前,我一直在玩弄一個(gè)關(guān)于數(shù)據(jù)庫(kù)接口的想法,以及如果它們更嚴(yán)格地遵守Unix的“一切都是文件”的哲學(xué),它們會(huì)是什么樣子:查詢將被寫入“文件”,結(jié)果集將從“文件”中讀取。一件事導(dǎo)致另一件事,經(jīng)過我自己的一些死亡和破壞性編碼之后,我編寫了以下這個(gè)與我最初的想法幾乎沒有關(guān)系的類:

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

結(jié)果是天才的,但令人厭惡:一個(gè)看起來像對(duì)象(沒有真正的API方法)、數(shù)組或字符串的實(shí)例……

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

我此后不久寫了一篇博客,并將其標(biāo)記為邪惡的。看到它的朋友和同事幾乎都做出了同樣的反應(yīng):“太棒了!現(xiàn)在把它殺了……用火燒死它?!?但多年以來,我承認(rèn)我對(duì)它有所軟化。它真正違反的唯一規(guī)則是程序員對(duì)query()result()等平淡無(wú)奇的命名方法的期望。相反,它使用查詢字符串本身作為查詢方法,對(duì)象是接口,結(jié)果集是結(jié)果。當(dāng)然,它并不比過度泛化的ORM接口更糟糕,ORM接口將select()where()方法鏈接在一起,看起來像SQL查詢,但有更多的->。也許我的類并沒有那么邪惡?也許它只是想被愛?我當(dāng)然不想死在北極!

結(jié)束語(yǔ)

我希望您喜歡這篇文章,并且這些例子不會(huì)給您帶來(太多)噩夢(mèng)!我相信您也有自己關(guān)于鬧鬼或可怕代碼的故事,無(wú)論您身在何處,都不需要讓節(jié)日的樂趣消失,因此請(qǐng)隨時(shí)在下面的評(píng)論中分享您可怕的PHP故事!圖片來自Fotolia

(以下為FAQ,已根據(jù)原文內(nèi)容調(diào)整和精簡(jiǎn))

關(guān)于“Spooky Scary PHP”的常見問題

什么是“Spooky Scary PHP”?

“Spooky Scary PHP”是一種獨(dú)特的PHP編碼方法,它涉及使用非常規(guī)或意想不到的方法來實(shí)現(xiàn)某些結(jié)果。這可能包括使用鮮為人知的函數(shù)、利用語(yǔ)言中的特性,甚至使用看起來不應(yīng)該工作但確實(shí)有效的代碼。這是一種有趣且令人興奮的方式,可以探索PHP的深度,并且經(jīng)常會(huì)帶來令人驚訝和啟迪的發(fā)現(xiàn)。

如何開始學(xué)習(xí)“Spooky Scary PHP”?

學(xué)習(xí)“Spooky Scary PHP”的最佳方法是對(duì)PHP基礎(chǔ)知識(shí)有扎實(shí)的理解。一旦您對(duì)基礎(chǔ)知識(shí)感到滿意,就可以開始探索該語(yǔ)言更晦澀的角落。閱讀關(guān)于“Spooky Scary PHP”的文章、教程和論壇討論也可能非常有幫助。記住,目標(biāo)不是編寫高效或?qū)嵱玫拇a,而是以更深入的方式探索和理解語(yǔ)言。

“Spooky Scary PHP”是一種好的實(shí)踐嗎?

“Spooky Scary PHP”通常不被認(rèn)為是編寫生產(chǎn)代碼的良好實(shí)踐。它通常涉及使用效率低下、不清楚或不可預(yù)測(cè)的函數(shù)或技術(shù)。但是,它可能是學(xué)習(xí)更多關(guān)于該語(yǔ)言以及挑戰(zhàn)您對(duì)PHP的理解的一種好方法。它更像是一種學(xué)習(xí)工具和有趣的實(shí)驗(yàn),而不是一種實(shí)用的編碼風(fēng)格。

“Spooky Scary PHP”有害嗎?

雖然“Spooky Scary PHP”既有趣又有教育意義,但務(wù)必負(fù)責(zé)任地使用它。在“Spooky Scary PHP”中使用的一些技術(shù)如果在實(shí)時(shí)環(huán)境中使用,可能會(huì)造成危害,例如那些利用語(yǔ)言中的特性或錯(cuò)誤的技術(shù)。務(wù)必徹底測(cè)試您編寫的任何代碼,并且永遠(yuǎn)不要在項(xiàng)目的重要部分使用“Spooky Scary PHP”技術(shù)。

以上是怪異的可怕php的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

PHP正則密碼強(qiáng)度 PHP正則密碼強(qiáng)度 Jul 03, 2025 am 10:33 AM

判斷密碼強(qiáng)度需結(jié)合正則與邏輯處理,基礎(chǔ)要求包括:1.長(zhǎng)度不少于8位;2.至少含小寫字母、大寫字母、數(shù)字;3.可加入特殊字符限制;進(jìn)階方面需避免連續(xù)重復(fù)字符及遞增/遞減序列,這需PHP函數(shù)檢測(cè);同時(shí)應(yīng)引入黑名單過濾常見弱密碼如password、123456;最終建議結(jié)合zxcvbn庫(kù)提升評(píng)估精度。

PHP變量范圍解釋了 PHP變量范圍解釋了 Jul 17, 2025 am 04:16 AM

PHP變量作用域常見問題及解決方法包括:1.函數(shù)內(nèi)部無(wú)法訪問全局變量,需使用global關(guān)鍵字或參數(shù)傳入;2.靜態(tài)變量用static聲明,只初始化一次并在多次調(diào)用間保持值;3.超全局變量如$_GET、$_POST可在任何作用域直接使用,但需注意安全過濾;4.匿名函數(shù)需通過use關(guān)鍵字引入父作用域變量,修改外部變量則需傳遞引用。掌握這些規(guī)則有助于避免錯(cuò)誤并提升代碼穩(wěn)定性。

如何在PHP中牢固地處理文件上傳? 如何在PHP中牢固地處理文件上傳? Jul 08, 2025 am 02:37 AM

要安全處理PHP文件上傳需驗(yàn)證來源與類型、控制文件名與路徑、設(shè)置服務(wù)器限制并二次處理媒體文件。1.驗(yàn)證上傳來源通過token防止CSRF并通過finfo_file檢測(cè)真實(shí)MIME類型使用白名單控制;2.重命名文件為隨機(jī)字符串并根據(jù)檢測(cè)類型決定擴(kuò)展名存儲(chǔ)至非Web目錄;3.PHP配置限制上傳大小及臨時(shí)目錄Nginx/Apache禁止訪問上傳目錄;4.GD庫(kù)重新保存圖片清除潛在惡意數(shù)據(jù)。

在PHP中評(píng)論代碼 在PHP中評(píng)論代碼 Jul 18, 2025 am 04:57 AM

PHP注釋代碼常用方法有三種:1.單行注釋用//或#屏蔽一行代碼,推薦使用//;2.多行注釋用/.../包裹代碼塊,不可嵌套但可跨行;3.組合技巧注釋如用/if(){}/控制邏輯塊,或配合編輯器快捷鍵提升效率,使用時(shí)需注意閉合符號(hào)和避免嵌套。

發(fā)電機(jī)如何在PHP中工作? 發(fā)電機(jī)如何在PHP中工作? Jul 11, 2025 am 03:12 AM

AgeneratorinPHPisamemory-efficientwaytoiterateoverlargedatasetsbyyieldingvaluesoneatatimeinsteadofreturningthemallatonce.1.Generatorsusetheyieldkeywordtoproducevaluesondemand,reducingmemoryusage.2.Theyareusefulforhandlingbigloops,readinglargefiles,or

撰寫PHP評(píng)論的提示 撰寫PHP評(píng)論的提示 Jul 18, 2025 am 04:51 AM

寫好PHP注釋的關(guān)鍵在于明確目的與規(guī)范,注釋應(yīng)解釋“為什么”而非“做了什么”,避免冗余或過于簡(jiǎn)單。1.使用統(tǒng)一格式,如docblock(/*/)用于類、方法說明,提升可讀性與工具兼容性;2.強(qiáng)調(diào)邏輯背后的原因,如說明為何需手動(dòng)輸出JS跳轉(zhuǎn);3.在復(fù)雜代碼前添加總覽性說明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標(biāo)記待辦事項(xiàng)與問題,便于后續(xù)追蹤與協(xié)作。好的注釋能降低溝通成本,提升代碼維護(hù)效率。

快速PHP安裝教程 快速PHP安裝教程 Jul 18, 2025 am 04:52 AM

ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

學(xué)習(xí)PHP:初學(xué)者指南 學(xué)習(xí)PHP:初學(xué)者指南 Jul 18, 2025 am 04:54 AM

易于效率,啟動(dòng)啟動(dòng)tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)

See all articles