一步步教你編寫不可維護的 PHP 代碼

file

譯者注:這是一篇很棒文章,使用有趣的敘述方式,從反面講解了做爲一個優秀的 PHP 工程師,有哪些事情是你不能作的。請注意哦,此篇文章羅列的行爲,都是你要儘可能避免的。

隨着失業率愈來愈高,不少人意識到保全本身的工做是多麼的重要。那麼,什麼是保住本身工做,並讓本身無可替代的好方法呢?一個很簡單的事實是隻要你的代碼沒有人可以維護,那麼你就成功保住了工做。編寫不可維護的代碼是一個特殊的技能,但奇怪的是,彷佛對某些開發者來講是很天然的。不過對於剩下的開發者來講,這裏有一些技巧和提示來讓你開始寫不可維護的代碼。html

首先要作的事情

第一步,從找工做開始。你應該尋找合適的公司,在那裏你能夠盡情發揮並實現你那不可維護的潛力。 你不必定須要成爲公司的 PHP 大牛若是是那更好。找工做時,若是工做描述提到須要從其它的遷移到 PHP (因此你知道你會作主),或者也能夠搜索那種須要10年 PHP5 工做經驗的誤導性工做,再加上熟練使用 FrontPage 和 Netscape Composer 。laravel

一旦你得到這種百年不遇的機會,從第一天開始就要採起措施。在會議上發言,讓你的意見被聽到。大膽談論面向對象的架構設計,企業,改革方案,怎樣讓夠好變得更好,固然你也得作出相應的承諾。確保每一個人在重要的編碼環節都諮詢你的意見。程序員

不可維護的核心

靈感來源於優秀的文章 「Writing unmaintainable code」 (想要保住工做的人必定會看的), 如下是你須要掌握和精通的兩個重要概念:正則表達式

  1. 你應該讓別人沒法輕易地修改任何東西,除非他破壞另一些東西。

    維護人員沒有時間去理解你的代碼。 可維護的代碼意味着可以在堆積如山的代碼中快速定位到特定的部分,可以快速明白它是如何工做的而且在不破壞一些東西的狀況下進行修改。你不能這樣作。 不能讓別人能輕易地搜索到某些東西或者在他們期待的地方找到。數據庫

  2. 你的代碼不能「看起來」不可維護(由於別人會懷疑的), 它必須「是」不可維護。

    代碼在維護人員看起來應該是正常的,但要在他們最意想不到的時候給他們一個驚喜。編程

最佳實踐

  1. 禁止代碼約定。 關於編碼和命名約定的對罵無窮無盡。這樣的狀況毫不能在你優秀的組織中出現。你有牛逼的項目要作,你不可能花上無數的時間來討論用 tab 仍是仍是空格。再說了,約定就是限制。若是一個新人入職,而且他不習慣你的約定,他會很痛苦。不快樂的程序員是沒有效率的程序員。誰問你你就向他們解釋。讓每一個人都用他們本身喜歡的風格寫代碼。至於你本身的代碼 - 變換你的約定。週一用 camelCase 小駝峯命名,週二用 all_lowercase 全小寫命名,週五混合着用,在每一個 2 月 29 日 使用匈牙利命名法。
  2. 不寫註釋。 你的代碼很優美,它不須要註釋。若是有人不理解你的代碼,那麼頗有可能他們不是那麼好的程序員。若是,有這個可能的話,你被強迫要求寫註釋,那麼直接誇張的寫。詳細描述最明顯和最不重要的代碼,跳過其它的。數組

    // 下面這一塊代碼
        // 咱們增長兩個變量:
        // 命名爲變量 a 和變量 b
        // 兩個都是整數
    
        // 聲明變量 a
        // 並給它賦值整數 1
        $a = 1;
        // 聲明變量 b
        $b = 2;
        // 給變量 a 和 b 求和
        // 聲明和初始化見上面
        // 而且將結果賦值給
        // 一個新的變量 c
        $c = $a + $b;
  3. 使用記事本編碼。 或者使用其餘沒有代碼縮進展現的編輯器。使得其餘人忍受痛苦最終離開團隊。這樣你就不用老是聽他們的抱怨了。若是有人問你爲何使用記事本,準備好解釋:由於它來自於 Windows (當今惟一一個,爲富有創造性的程序員準備的操做系統),無需任何須要的培訓,也不須要花費任何代價。我相信你能在網上找到你可使用任何程序的參考文獻,甚至包括 Word,來編寫你的網頁代碼,可是隻有記事本纔是真正的權威,畢竟,大家公司僱傭的人只有你纔是權威。
  4. 拒絕單元測試。 向任何質疑你的人解釋,你是被僱傭過來編寫高質量而且沒有漏洞的代碼的(所以,無需測試)。爲何會有頭腦正常的人會花時間來寫可有可無的測試來證明代碼可否正常運行?有些事情在生活中就像-天空是藍色的,太陽從東方升起,你的代碼是可以正常運行的,所以很是感謝。繼續(就像評論同樣,若是被迫接受測試,那麼準備好測試那些顯而易見的內容而後跳過其餘的部分)
  5. 不使用模板引擎。 模板引擎可以幫助你區分業務邏輯層與展現層。它能夠保證代碼的可維護性因此你不能遵照這個規定。PHP 之父 Rasmus Lerdorf 說過:「PHP 就是模板引擎」。即便你無可奈何使用模板引擎,也要找到對應的方法濫用它,例如放一些業務代碼在模板中,或者是當心的將HTML(和 CSS 和 JavaScript)代碼混合在數據庫訪問層中。

通常來講,儘量在同一行代碼中的將你的 PHP,HTML,CSS 和 JavaScript 代碼義正詞嚴地混合在一塊兒。在 PHP 代碼中建立 JavaScript 和帶內聯樣式的 HTML 代碼。若是別人問到,告訴他們這種模式叫作「封裝」,你會對你的代碼負所有責任。架構

  1. 版本控制。 雖然這很難避免,可是使本身擺脫任何形式或版本控制很值得嘗試。你能夠在討論的時候向你們證實這樣作提升了團隊成員之間的溝通,而不是去依賴冷血的版本控制軟件。若是你沒有說服任何人,請不要絕望。 你提交的時候能夠不 commit all 。 在本地保留一些本身的代碼。這樣若是你之外的人試圖構建和部署的話,這些小而致命的代碼片斷將會破壞這個項目。 若是被抓了,就辯解說這些代碼還不適合展現,畢竟,你提交了可以教育初級團隊的高質量的代碼和優秀的解決方案。這些小男孩和小女孩將會仰望着你並充滿期待!
  2. 構建一個框架。 而後你不可避免地成爲架構師,你的權威毋庸置疑。這樣你就能夠添加一些祕密約定(固然其中大多數有時是自相矛盾的),即便是最有經驗的維護人員也察覺不出。 你的框架將負責全部的事情,不須要任何人費心地去理解它,你們會很開心由於你一我的讓開發變得更容易並且提升了整個公司的產能。不要以開源的方式發佈你的框架,由於 a) 這個框架是公司的資產並且公司投入了人大量的資金, b) 開源社區會嘲笑你,並且這將成爲你虛張聲勢的結局。

命名相關

你的變量名應該起的神祕一些,最好只有一個字母。 這樣誰都沒法經過簡單的搜索找到須要的內容。框架

類名和方法最好也使用一個字母來定義。若是你確實想定義一個正常點的名字,那就一直使用它吧 —— 記住,隱藏信息的最好方法就是頻繁的使用它。 當重複使用相同名稱(稱爲「面向對象的編程」)時,若是將圓括號和花括號放在新的一行,這將有助於提升代碼的可讀性,而且讓隊友在你的代碼中尋找任何東西時,都得重溫一下正則表達式。考慮一下吧:編輯器

$noodles = 1;
    class
    noodles
    {
        var $noodles = 2;
        function
            noodles
            ()
        {
            $noodles['noodles'] = 'noodles';
        }
    }
    function
        noodles() {
            return new noodles;
        }
    $noodles = noodles();
    var_dump($noodles);

你也可使用奇特的字符集來命名變量。西裏爾字母就很是合適,由於有些字母看起來跟羅馬字母同樣, 但其實不是(全部這些:xopekacMEBCTAKXOPH)。那麼下面的輸出是:

$alert = 1;
    $аlert = 2;
    echo $alert;

2?若是第二個 alert以西裏爾字母"a"開頭,則不能夠!

引用相關

即便你很是正常的定義來一些東西,但並不意味着你不能以有趣的方式來使用它。主要的武器有:

  • eval()
  • 可變變量
  • 可變類,好比$strudels = "noodles"; $noo = new $strudels;
  • call_user_func()

基本上任何將代碼視爲字符串的語言結構都是你的好朋友。

// calling abc();
    $z = 'A';
    call_user_func($z .'bC');

大寫

字母例子,函數方法名不區分大小寫,濫用這個特色。

function abc(){
    echo "abc";
}
AbC();

另外一方面,數組的健(key) 對大小寫敏感,也濫用這個特色。

$a['UseConvetionsOnlyTobreakThem'] = 1;
if (isset($a['UseConvetionsOnlyToBreakThem'])) {
    // ?? 大寫 B !!1!
}

重寫

在不指望的狀況下重寫全局變量,尤爲是超全局變量。儘早重寫$_GET數組中的屬性,屢次重寫,$_POST亦是如此。在$_REQUEST上作一些不起眼的重寫做爲點綴。若是是在WTF-ed上,你能夠解釋是在防止用戶輸入的 XSS 攻擊、注入攻擊以及其餘的病毒攻擊。

控制結構

使用、混合、匹配全部備選的ifwhileforforeachswitch語法。若是被問起來,全部的這些,請解釋說你正在培訓新員工學習真正的語言。

if ($a > 5):
  if ($a > 4) {
      while ($a > 0):
        echo --$a;
      endwhile;
  }
endif;

嵌套三元運算符,沒有比這個更好、更簡潔的代碼了。

// 猜猜這裏輸出什麼
echo true ? 'true' : false ? 't' : 'f';

for的循環體內,再次增長$i以保持全部人的注意。或者,經過不使用$i來實現循環增量的驚喜。從不。

嵌套循環、深刻,而後忽然跳出它們(循環)。像 break 2break 3 這樣的代碼存粹是爲了娛樂,尤爲是當混合了奇怪的縮進代碼時。

這是一個開始!

這就是今天的所有。我但願你相信你本身也能作到,你也能夠編寫不可維護的代碼。如今你的將來就在你的手中!固然,你也能夠編寫可讀性比較高的代碼,可是冒着被替代的風險。

更多現代化 PHP 知識,請前往 Laravel / PHP 知識社區
相關文章
相關標籤/搜索