怎樣深入學習php,成為php高手?

學習php已經有一定基礎,並有一定的項目開發經驗後,怎樣深入學習php,成為php高手,應該學習哪些方面的知識。


基礎的都了解全面了,了解透徹了,再加上經驗就是市高手了。


深入學習的話可能不要局限php了。

數據結構是基礎,但php語言,這方面就不考慮了。要寫出一些優雅,可拓展性強的代碼,設計模式是一門必修課。平時可能也會用到一些模式,但是會沒有系統,也達不到交流的要求。不管是java,c++,php還是js,思想是一樣的,任意哪種語言的實現都是可以的。

深入php的前提是你已經完成了相當的項目,對php的特性理解程度比較深。之後在socket編程這塊花一些時間,寫一些c/s應用。因為網路的大部分應用現在幾乎都是基於套接字之上,而php正是一門web語言。

php底層調用的都是c模塊,這也是它速度變慢的原因,php只是一個中間件。到語言層面的話,試著開發php擴展已完善現有的功能或是項目需求。

推薦進入linux的學習,對了解系統層的幫助很大。看完《unix高級環境編程》和《unix編程藝術》,會有一覽眾山小的感覺。


0 堅持寫博客,有獨立的博客

1 有自己的github項目,目前致力於瓦力:meolu/walle-web · GitHub,瓦爾登:meolu/walden · GitHub變得更實用,歡迎標星:)

2 堅持看完一個項目源碼

3 寫一個MVC,只有自己寫一個完整的MVC才會真正開始理解PHP,理解設計模式,面向對象開發

4 開發PHP擴展(曾寫過一個ip2city服務meolu/ip2city · GitHub)

5 掌握python, shell, scala(一入函數式編程深似海)

6 深入了解存儲,MySQL, nosql

7 你還得謙虛,耐心,堅持,分享

8 最後要健身,為更好的生活


在PHP程序員的技術成長規划上看到,很實際,從低段位到到高段位都有。

PHP程序員的技術成長規劃

按照了解的很多PHP/LNMP程序員的發展軌跡,結合個人經驗體會,抽象出很多程序員對未來的迷漫,特別對技術學習的盲目和慌亂,簡單梳理了這個每個階段PHP程序員的技術要求,來幫助很多PHP程序做對照設定學習成長目標。

本文按照目前主流技術做了一個基本的梳理,整個是假設PHP程序員不是基礎非常紮實的情況進行的設定,並且所有設定都非常具體明確清晰,可能會讓人覺得不適,請理解僅代表一家之言。(未來技術變化不在討論範圍)

第一階段:基礎階段(基礎PHP程序員)

重點:把LNMP搞熟練(核心是安裝配置基本操作)

目標:能夠完成基本的LNMP系統安裝,簡單配置維護;能夠做基本的簡單系統的PHP開發;能夠在PHP中型系統中支持某個PHP功能模塊的開發。

時間:完成本階段的時間因人而異,有的成長快半年一年就過了,成長慢的兩三年也有。

1.Linux:

基本命令、操作、啟動、基本服務配置(包括rpm安裝文件,各種服務配置等);會寫簡單的shell

腳本和awk/sed 腳本命令等。

2.Nginx:

做到能夠安裝配置nginx+php,知道基本的nginx核心配置選項,知道 server/fastcgi_pass/access_log 等基礎配置,目標是能夠讓nginx+php_fpm順利工作。

3.MySQL:

會自己搭建mysql,知道基本的mysql配置選項;知道innodb和myisam的區別,知道針對InnoDB和MyISAM兩個引擎的不同 配置選項;知道基本的兩個引擎的差異和選擇上面的區別;能夠純手工編譯搭建一個MySQL資料庫並且配置好編碼等正常穩定運行;核心主旨是能夠搭建一個可 運行的MySQL資料庫。

4.PHP:

基本語法數組、字元串、資料庫、XML、Socket、GD/ImageMgk圖片處理等等;熟悉各種跟MySQL操作鏈接的api(mysql /mysqli/PDO),知道各種編碼問題的解決;知道常規熟練使用的PHP框架(ThinkPHP、Zendframework、Yii、Yaf 等);了解基本MVC的運行機制和為什麼這麼做,稍微知道不同的PHP框架之間的區別;能夠快速學習一個MVC框架。能夠知道開發工程中的文件目錄組織,有基本的良好的代碼結構和風格,能夠完成小系統的開發和中型系統中某個模塊的開發工作。

5.前端:

如果條件時間允許,可以適當學習下 HTML/CSS/JS 等相關知識,知道什麼web標準,div+css的web/wap頁面模式,知道 HTML5和HTML4的區別;了解一些基本的前端只是和JS框架(jQuery之類的);了解一些基本的JavaScript編程知識;(本項不是必須 項,如果有時間,稍微了解一下是可以的,不過不建議作為重點,除非個人有強烈興趣)

6.系統設計:

能夠完成小型系統的基本設計,包括簡單的資料庫設計,能夠完成基本的:瀏覽器 -&> Nginx+PHP -&> 資料庫 架構的設計開發工作;能夠支撐每天幾十萬到數百萬流量網站的開發維護工作;

第二階段:提高階段 (中級PHP程序員)

重點:提高針對LNMP的技能,能夠更全面的對LNMP有熟練的應用。

目標:能夠隨時隨地搭建好LNMP環境,快速完成常規配置;能夠追查解決大部分遇到的開發和線上環境的問題;能夠獨立承擔中型系統的構架和開發工作;能夠在大型系統中承擔某個中型模塊的開發工作;

1. Linux:

在第一階段的基礎上面,能夠流暢的使用Shell腳本來完成很多自動化的工作;awk/sed/perl 也操作的不錯,能夠完成很多文本處理和數 據統計等工作;基本能夠安裝大部分非特殊的Linux程序(包括各種庫、包、第三方依賴等等,比如MongoDB/Redis/Sphinx /Luncene/SVN之類的);了解基本的Linux服務,知道如何查看Linux的性能指標數據,知道基本的Linux下面的問題跟蹤等。

2. Nginx:

在第一階段的基礎上面,了解複雜一些的Nginx配置;包括 多核配置、events、proxy_pass,sendfile/tcp_*配置, 知道超時等相關配置和性能影響;知道nginx除了web server,還能夠承擔代理伺服器、反向靜態伺服器等配置;知道基本的nginx配置調優; 知道如何配置許可權、編譯一個nginx擴展到nginx;知道基本的nginx運行原理(master/worker機制,epoll),知道為什麼 nginx性能比apache性能好等知識;

3. MySQL/MongoDB:

在第一階段的基礎上面,在MySQL開發方面,掌握很多小技巧,包括常規SQL優化(group by/order by/rand優化等);

除了能夠搭建MySQL,還能夠冷熱備份MySQL數據,還知道影響innodb/myisam性能的配置選項(比如key_buffer /query_cache/sort_buffer/innodb_buffer_pool_size /innodb_flush_log_at_trx_commit等),也知道這些選項配置成為多少值合適;另外也了解一些特殊的配置選項,比如 知道 如何搭建mysql主從同步的環境,知道各個binlog_format的區別;

知道MySQL的性能追查,包括slow_log/explain等,還 能夠知道基本的索引建立處理等知識;原理方面了解基本的MySQL的架構(Server+存儲引擎),知道基本的InnoDB/MyISAM索引存儲結構 和不同(聚簇索引,B樹);知道基本的InnoDB事務處理機制;了解大部分MySQL異常情況的處理方案(或者知道哪兒找到處理方案)。條件允許的情 況,建議了解一下NoSQL的代表MongoDB資料庫,順便對比跟MySQL的差別,同事能夠在合適的應用場景安全謹慎的使用MongoDB,知道基本 的PHP與MongoDB的結合開發。

4. Redis/Memcached:

在大部分中型系統裡面一定會涉及到緩存處理,所以一定要了解基本的緩存;知道Memcached和Redis的異同和應用場景,能夠獨立安 裝 Redis/Memcached,了解Memcahed的一些基本特性和限制,比如最大的value值,知道PHP跟他們的使用結合;Redis了解 基本工作原理和使用,了解常規的數據類型,知道什麼場景應用什麼類型,了解Redis的事務等等。原理部分,能夠大概了解Memcached的內存結構 (slab機制),redis就了解常用數據類型底層實現存儲結構(SDS/鏈表/SkipList/HashTable)等等,順便了解一下Redis 的事務、RDB、AOF等機制更好

5. PHP:

除了第一階段的能力,安裝配置方面能夠隨意安裝PHP和各種第三方擴展的編譯安裝配置;了解php-fpm的大部分配置選項和含義(如 max_requests/max_children/request_terminate_timeout之類的影響性能的配置),知道mod_php /fastcgi的區別;在PHP方面已經能夠熟練各種基礎技術,還包括各種深入些的PHP,包括對PHP面向對象的深入理解/SPL/語法層面的特殊特 性比如反射之類的;在框架方面已經閱讀過最少一個以上常規PHP MVC框架的代碼了,知道基本PHP框架內部實現機制和設計思想;在PHP開發中已經能 夠熟練使用常規的設計模式來應用開發(抽象工廠/單例/觀察者/命令鏈/策略/適配器 等模式);建議開發自己的PHP MVC框架來充分讓開發自由化, 讓自己深入理解MVC模式,也讓自己能夠在業務項目開發里快速升級;熟悉PHP的各種代碼優化方法,熟悉大部分PHP安全方面問題的解決處理;熟悉基本的 PHP執行的機制原理(Zend引擎/擴展基本工作機制);

6. C/C++:

開始涉獵一定的C/C++語言,能夠寫基本的C/C++代碼,對基本的C/C++語法熟悉(指針、數組操作、字元串、常規標準API)和數據結構 (鏈表、樹、哈希、隊列)有一定的熟悉下;對Linux下面的C語言開發有基本的了解概念,會簡單的makefile文件編寫,能夠使用簡單的 GCC/GDB的程序編譯簡單調試工作;對基本的網路編程有大概了解。(本項是為了向更高層次打下基礎)

7. 前端:

在第一階段的基礎上面,熟悉基本的HTTP協議(協議代碼200/300/400/500,基本的HTTP交互頭);條件允許,可以在深入寫出稍微 優雅的HTML+CSS+JavaScript,或者能夠大致簡單使用某些前端框架(jQuery/YUI/ExtJS/RequireJS /BootStrap之類);如果條件允許,可以深入學習JavaScript編程,比如閉包機制、DOM處理;再深入些可以讀讀jQuery源碼做深入 學習。(本項不做重點學習,除非對前端有興趣)

8. 系統設計:

能夠設計大部分中型系統的網站架構、資料庫、基本PHP框架選型;性能測試排查處理等;能夠完成類似:瀏覽 器 -&> CDN(Squid) -&> Nginx+PHP -&> 緩存 -&> 資料庫 結構網站的基本設計開發維護;能夠支撐 每天數百萬到千萬流量基本網站的開發維護工作;

第三階段:高級階段 (高級PHP程序員)

重點:除了基本的LNMP程序,還能夠在某個方向或領域有深入學習。(縱深維度發展)

目標:除了能夠完成基本的PHP業務開發,還能夠解決大部分深入複雜的技術問題,並且可以獨立設計完成中大型的系統設計和開發工作;自己能夠獨立hold深入某個技術方向,在這塊比較專業。(比如在MySQL、Nginx、PHP、Redis等等任一方向深入研究)

1. Linux:

除了第二階段的能力,在Linux下面除了常規的操作和性能監控跟蹤,還能夠使用很多高級複雜的命令完成工作(watch/tcpdump /starce/ldd/ar等);在shell腳本方面,已經能夠編寫比較複雜的shell腳本(超過500行)來協助完成很多包括備份、自動化處理、 監控等工作的shell;對awk/sed/perl 等應用已經如火純青,能夠隨意操作控制處理文本統計分析各種複雜格式的數據;對Linux內部機制 有一些了解,對內核模塊載入,啟動錯誤處理等等有個基本的處理;同時對一些其他相關的東西也了解,比如NFS、磁碟管理等等;

2. Nginx:

在第二階段的基礎上面,已經能夠把Nginx操作的很熟練,能夠對Nginx進行更深入的運維工作,比如監控、性能優化,複雜問題處理等等;看個人 興趣,更多方面可以考慮側重在關於Nginx工作原理部分的深入學習,主要表現在閱讀源碼開始,比如具體的master/worker工作機 制,Nginx內部的事件處理,內存管理等等;同時可以學習Nginx擴展的開發,可以定製一些自己私有的擴展;同時可以對Nginx+Lua有一定程度 的了解,看看是否可以結合應用出更好模式;這個階段的要求是對Nginx原理的深入理解,可以考慮成為Nginx方向的深入專業者。

3. MySQL/MongoDB:

在第二階段的基礎上面,在MySQL應用方面,除了之前的基本SQL優化,還能夠在完成一些複雜操作,比如大批量數據的導入導出,線上大批量數據的 更改表結構或者增刪索引欄位等等高危操作;除了安裝配置,已經能夠處理更多複雜的MySQL的問題,比如各種問題的追查,主從同步延遲問題的解決、跨機房 同步數據方案、MySQL高可用架構等都有涉及了解;對MySQL應用層面,對MySQL的核心關鍵技術比較熟悉,比如事務機制(隔離級別、鎖等)、對觸 發器、分區等技術有一定了解和應用;對MySQL性能方面,有包括磁碟優化(SAS遷移到SSD)、伺服器優化(內存、伺服器本身配置)、除了二階段的其 他核心性能優化選項(innodb_log_buffer_size/back_log/table_open_cache /thread_cache_size/innodb_lock_wait_timeout等)、連接池軟體選擇應用,對show * (show status/show profile)類的操作語句有深入了解,能夠完成大部分的性能問題追查;MySQL備份技術的深入熟悉,包括災備 還原、對Binlog的深入理解,冷熱備份,多IDC備份等;在MySQL原理方面,有更多了解,比如對MySQL的工作機制開始閱讀部分源碼,比如對主 從同步(複製)技術的源碼學習,或者對某個存儲引擎(MyISAM/Innodb/TokuDB)等等的源碼學習理解,如果條件允許,可以參考CSV引擎 開發自己簡單的存儲引擎來保存一些數據,增強對MySQL的理解;在這個過程,如果自己有興趣,也可以考慮往DBA方向發展。MongoDB層面,可以考 慮比如說在寫少讀多的情況開始在線上應用MongoDB,或者是做一些線上的數據分析處理的操作,具體場景可以按照工作來,不過核心是要更好的深入理解 RMDBS和NoSQL的不同場景下面的應用,如果條件或者興趣允許,可以開始深入學習一下MongoDB的工作機制。

4. Redis/Memcached:

在第二階段的基礎上面,能夠更深入的應用和學習。因為Memcached不是特別複雜,建議可以把源碼進行閱讀,特別是內存管理部分,方便深入理 解;Redis部分,可以多做一些複雜的數據結構的應用(zset來做排行榜排序操作/事務處理用來保證原子性在秒殺類場景應用之類的使用操作);多涉及 aof等同步機制的學習應用,設計一個高可用的Redis應用架構和集群;建議可以深入的學習一下Redis的源碼,把在第二階段積累的知識都可以應用 上,特別可以閱讀一下包括核心事件管理、內存管理、內部核心數據結構等充分學習了解一下。如果興趣允許,可以成為一個Redis方面非常專業的使用者。

5. PHP:

作為基礎核心技能,我們在第二階段的基礎上面,需要有更深入的學習和應用。從基本代碼應用上面來說,能夠解決在PHP開發中遇到95%的問題,了解 大部分PHP的技巧;對大部分的PHP框架能夠迅速在一天內上手使用,並且了解各個主流PHP框架的優缺點,能夠迅速方便項目開發中做技術選型;在配置方 面,除了常規第二階段會的知識,會了解一些比較偏門的配置選項(php auto_prepend_file/auto_append_file),包括 擴展中的一些複雜高級配置和原理(比如memcached擴展配置中的memcache.hash_strategy、apc擴展配置中的 apc.mmap_file_mask/apc.slam_defense/apc.file_update_protection之類的);對php的 工作機制比較了解,包括php-fpm工作機制(比如php-fpm在不同配置機器下面開啟進程數量計算以及原理),對zend引擎有基本熟悉 (vm/gc/stream處理),閱讀過基本的PHP內核源碼(或者閱讀過相關文章),對PHP內部機制的大部分核心數據結構(基礎類型/Array /Object)實現有了解,對於核心基礎結構(zval/hashtable/gc)有深入學習了解;能夠進行基本的PHP擴展開發,了解一些擴展開發 的中高級知識(minit/rinit等),熟悉php跟apache/nginx不同的通信交互方式細節(mod_php/fastcgi);除了開發 PHP擴展,可以考慮學習開發Zend擴展,從更底層去了解PHP。

6. C/C++:

在第二階段基礎上面,能夠在C/C++語言方面有更深入的學習了解,能夠完成中小型C/C++系統的開發工作;除了基本第二階段的基礎C/C++語 法和數據結構,也能夠學習一些特殊數據結構(b-tree/rb-tree/skiplist/lsm-tree/trie-tree等)方便在特殊工作 中需求;在系統編程方面,熟悉多進程、多線程編程;多進程情況下面了解大部分多進程之間的通信方式,能夠靈活選擇通信方式(共享內存/信號量/管道等); 多線程編程能夠良好的解決鎖衝突問題,並且能夠進行多線程程序的開發調試工作;同時對網路編程比較熟悉,了解多進程模型/多線程模型/非同步網路IO模型的 差別和選型,熟悉不同非同步網路IO模型的原理和差異(select/poll/epoll/iocp等),並且熟悉常見的非同步框架(ACE/ICE /libev/libevent/libuv/Boost.ASIO等)和使用,如果閑暇也可以看看一些國產自己開發的庫(比如muduo);同時能夠設 計好的高並發程序架構(leader-follow/master-worker等);了解大部分C/C++後端Server開發中的問題(內存管理、日 志列印、高並發、前後端通信協議、服務監控),知道各個後端服務RPC通信問題(struct/http/thirft/protobuf等);能夠更熟 絡的使用GCC和GDB來開發編譯調試程序,在線上程序core掉後能夠迅速追查跟蹤解決問題;通用模塊開發方面,可以積累或者開發一些通用的工具或庫 (比如非同步網路框架、日誌庫、內存池、線程池等),不過開發後是否應用要謹慎,省的埋坑去追bug;

7. 前端:

深入了解HTTP協議(包括各個細緻協議特殊協議代碼和背後原因,比如302靜態文件緩存了,502是nginx後面php掛了之類的);除了之前 的前端方面的各種框架應用整合能力,前端方面的學習如果有興趣可以更深入,表現形式是,可以自己開發一些類似jQuery的前端框架,或者開發一個富文本 編輯器之類的比較瑣碎考驗JavaScript功力;

8. 其他領域語言學習:

在基礎的PHP/C/C++語言方面有基本積累,建議在當前階段可以嘗試學習不同的編程語言,看個人興趣愛好,腳本類語言可以學學 Python /Ruby 之類的,函數式編程語言可以試試 Lisp/Haskell/Scala/Erlang 之類的,靜態語言可以試試 Java /Golang,數據統計分析可以了解了解R語言,如果想換個視角做後端業務,可以試試 Node.js還有前面提到的跟Nginx結合的 Nginx_Lua等。學習不同的語言主要是提升自己的視野和解決問題手段的差異,比如會了解除了進程/線程,還有輕量級協程;比如在跨機器通信場景下 面,Erlang的解決方案簡單的驚人;比如在不想選擇C/C++的情況下,還有類似高效的Erlang/Golang可用等等;主要是提升視野。

9. 其他專業方向學習:

在本階段裡面,會除了基本的LNMP技能之外,會考慮一些其他領域知識的學習,這些都是可以的,看個人興趣和長期的目標方向。目前情況能夠選擇的領 域比較多,比如、雲計算(分散式存儲、分散式計算、虛擬機等),機器學習(數據挖掘、模式識別等,應用到統計、個性化推薦),自然語言處理(中文分詞 等),搜索引擎技術、圖形圖像、語音識別等等。除了這些高大上的,也有很多偏工程方面可以學習的地方,比如高性能系統、移動開發 (Android/IOS)、計算機安全、嵌入式系統、硬體等方向。

10. 系統設計:

系統設計在第二階段的基礎之上,能夠應用掌握的經驗技能,設計出比較複雜的中大型系統,能夠解決大部分線上的各種複雜系統的問題,完成類似 瀏覽 器 -&> CDN -&> 負載均衡 -&>接入層 -&> Nginx+PHP -&> 業務緩存 -&> 數據 庫 -&> 各路複雜後端RPC交互(存儲後端、邏輯後端、反作弊後端、外部服務) -&> 更多後端 醬紫的複雜業務;能夠支撐每天數千萬到數 億流量網站的正常開發維護工作。


文章開頭我想問一句話:PHP是做什麼的?

因為這是面試中會問到的一個問題,雖然它看起來很簡單。

回答做網站的,也就是個簡單建站的水平。

回答做網站後端開發的,對PHP有了一定的認識。

回答做後端處理的,有了更深層次的認識。

學習一樣技能,你得先清楚這項技能是到底做什麼的,說到這裡,我想大家都會簡單的說是做網站的,因為PHP在WEB領域應用最為廣泛,大多數網站都是用PHP做的。準確的說PHP是做網站的後端開發的,其實我這樣說還不算正確,PHP只是做後端開發的,但不只是網站而已。就像現在比較火的APP開發也可以用PHP做後端處理。

PHP相對於其他語言,比較簡單,相對好上手,比較適合零基礎的人學習,但是就像我上面說的那樣,PHP只完成了一個網站或者系統的一部分。

一個運行的網站或者軟體系統可以分為前端頁面,後端程序,資料庫,linux。而處理後端的PHP僅僅是只佔了四分之一,PHP本身的東西其實並不多,真正多的東西都在PHP之外,所以單純的掌握PHP並不足已做出什麼產品,可能連工作都找不到。

關於學習PHP,我想講講我的心路歷程:

前端:

但凡是一個網站都必須得讓人能看得見,使用得起來。任何一個網站可以沒有資料庫,可以沒有後端程序,但是必須得有前端頁面,而這也是最早期的網站形態—一 一個只能展示文字和圖片等信息的靜態頁面。

掌握靜態網頁的製作技術是學習開發網站的先決條件。這裡面的學習包括 HTML,css,javascript,它們可以直接使用瀏覽器運行。

HTML負責網頁的結構,用它來規定網頁排版中哪部分是文字,哪部分可以放圖片,音頻文件,視頻文件放在網頁中什麼位置顯示等。

CSS可以把這些文字,圖片,視頻等信息擁有一定的合理好看的樣式,可以定義文字的大小,顏色,圖片的大小等等。

javascript可以讓網頁與人產生交互,就像你登錄網站,點擊登錄按鈕就會跳轉,把滑鼠放到菜單,菜單就會自動展示下拉,逛淘寶時,把滑鼠放在產品圖片上,圖片就會放大等等。

我的學習技巧和心得

我算是零基礎學習開發的吧,連大學都沒上,沒系統的學過計算機專業,初次開始學習html時,我是以w3c手冊為學習教材,但是越往後看越覺得裡面寫的東西瑣碎繁多,手冊里介紹了很多標籤,標籤又有很多屬性,它們各自又代表的什麼含義。

就像下面的這個表示表格的一些標籤,這是手冊給出的概念,看了之後似乎也明白又不太明白,看完又沒記住,回想起來,還是一頭霧水,像是什麼也沒學到。

那時我開始心急了,我無法想像我居然連基礎的東西都都學不會,思量了一兩天,我覺得我還是太浮躁了,我決定重新開始,動手敲敲試試,以前只是光看。就這樣開始後,仿照別人家寫的,運行一下看看瀏覽器顯示的是什麼效果,去掉某個屬性之後看看是什麼反應。我就這樣笨拙的進行著,把每一個標籤,每一個屬性都敲了一遍,一個個的看到效果之後,我才理解手冊里描述的概念是怎麼回事了。

前端的知識比較鎖碎,沒有太多邏輯性可言。其中html和css的任何元素標記都要親自動手實踐,大部分新手之所以覺得難學,看不懂手冊概念,主要是學習方法不對,「懶」是首要原因,因為不動手實踐,光看概念是沒什麼用的。

所以克服掉懶的習慣,動起手來寫一個HTML標記,運行之後看看效果吧,這樣你才能真正掌握住。

不過,我建議初學的同學還是先看視頻為好,因為操作效果都能看的到,手冊這東西作為工具使用。

關於html和css中的標籤和屬性你沒必要完全一個不差的記住,因為這沒有太大的意義,等你做了一個小項目之後,你只需要記住常用的就行,其他的做到有印象,用的時候能想到,然後查手冊即可。

當你學完之後一定要做一個簡單的小項目,你學習時針對的都是散亂的知識點,最後要把這些東西整體的用一遍。

以下這個圖就是我上一年學習html最後自己動手做的一個小頁面項目:

嚴肅說來,HTML是否被認為是「真正」的編程語言並不重要——它依然是一種需要學習的新技能。嘗試新的東西是非常可怕的。你需要在處於這種未知的弱勢地位時也敢於勇往直前,不要急頭急腦一下子就想把東西學會,要沉得住氣,踏踏實實的心態一點一點的來,而且失敗和不確定也沒有關係—— 事實上,它們都是成功的重要組成部分。

再說下js

在上面我已經闡述過了javascript,(簡稱js),但是在這裡為什麼還要再強調js呢?

因為很多人都說不用學js了,直接學jquery(簡稱jq)就行。jq是什麼,jq是一種js的框架,它可以使開發速度更快,有很多做好的功能和特效,直接使用就行了。

但我並不同意光學jq,如果你想讓自己能解決更複雜的問題,變得更有競爭力,或者只僅僅能更好的學習理解使用jq。那麼請學習js!

上面說了jq是js的一種框架,它的本質還是js寫的。js能完成的,理論上來說jq也能完成,但是並不是100%都能處理,而且jquery能做的,js 100%能完成。jquery只是工具簡化操作,底層還是js。只有在學好原生js的基礎上,才能更好的學習jquery或其它框架和處理前端問題。

後端:

到這裡才說到我們的PHP。如果說HTML和css是看得見的部分,那麼PHP就是看不見的部分。它負責在後面處理數據,然後返回給用戶。

當網站由開始的靜態頁面發展到現在有了後端程序,那麼網站才有了業務邏輯。簡單的說,就像一台計算器,你在前端輸入數據,然後點擊提交,PHP給你處理運算,然後返回到前端,這時你就看到了結果。需要特別說明的是PHP並不能直接在瀏覽器中運行,它需要Apache環境支持,放在Apache伺服器裡面,然後用瀏覽器用訪問,這個需要大家在學習過程中配置一下,非常簡單。

我的學習技巧和心得

學習PHP我推薦韓順平老師的《PHP從入門到精通》的視頻教程,做PHP開發,包括有了解的同學可能都知道韓順平老師,名氣很大,它的這個教程幾乎是每個PHP學子必看的精品教程。網上有很多這個教程的下載。其實韓老師不只是出了這一個教程,大家可以順便搜一下每學網,每學網上有更多韓老師親自做的其他教程。

我學習PHP時,慢慢的隨著講解的知識不斷增多,不懂的問題也開始出現,剛開始時我就簡單用腦子記著,想以後再解決。但是後來再回想,發現有一些竟然記不起來了,慢慢的,不懂的問題越積越多,我害怕遺忘掉我不想遺漏任何我沒學會的地方,哪怕是一個暫時沒細想,細想一下就能懂的簡單問題。如果忘掉了,可能以後再也想不起來了,這對我來說是個很難彌補的損失,我是個完美主義者。

我想起了學習html時的教訓,還是不能懶!我建立了一個文本,專門記載我不懂的,難以理解的,還有暫時沒有解決的種種問題,甚至是靈機一動偶然想到的問題,也都統統不拉的記下來。

當我學完PHP後,再回頭看,數一數大概百十條,這個文本我依然保留著:

我希望大家在學習的過程中也能養成寫記問題的習慣,好記性不如爛筆頭么,因為學習過程中難免會碰到很多不懂的問題,但是你又不能一直等著這個問題解決,你需要繼續前進,而時間久了,你可能就會遺忘掉。

每學到一個腳本難點的時候,嘗試對別人講一遍,你能講清楚才說明你真的理解了。

除了記問題,我還把老師講的知識,用自己的話按自己的理解自己的話寫下來,這就如同是跟別人講一遍似得。記住,要用自己的話寫,忘記老師的原話,這樣別人的知識才會轉化成你的。

所以,這是我當時寫的筆記:

寫到這裡,大家不要覺得我太麻煩,這樣太慢,記住,思考要慢,慢的為了以後更快!

合理的「慢」,不是速度上的缺失,而恰是對「過快」的反思與矯正。慢是一種方法。尊重規律,沉下心來,追求質量,做起事來,嚴格有序,精益求精。

實踐也是強化知識理解的過程

千萬不要只看教程和學知識點,最重要的是要實踐,大多數人包括我,曾經都是跟別人學起來像是學會了,到了自己做的時候卻很難進行下去。

當你看完教程掌握了裡面所述的內容後,可以按照老師講的例子或者自己構思某個應用或者某個使用場景,然後從頭寫起。你會發現很多問題,也會加深對教程知識的理解。這樣通過不斷地練習和獲取反饋,你的開發功底會很快提升。

MySQL資料庫

當網站技術再往後發展時,人們需要網站處理存放更多的數據,和滿足現實生活中的業務邏輯,這時候資料庫技術應用而生。

資料庫是什麼,按字面的意思,資料庫說白就是存放數據的地方,它可以是一段文字,一張圖片或者一個文件的URL地址等等。比如,當你想瀏覽一篇文章時,你點擊文章標題,這個請求會跳轉到PHP文件那裡,PHP再從資料庫取出你想看的那篇文章。

PHP和資料庫是密不可分的,PHP後來在網站開發中更多的任務就變成了操縱資料庫了。資料庫有很多種,準確的說咱的這個資料庫是mysql資料庫,只是因為php和mysql關係非常好,它們兩個是完美的搭配。所以我們學習PHP開發學習的資料庫就是MySQL資料庫。

我的學習技巧和心得

學習mysql時,我同樣採用了學習PHP時的學習方法:記問題,寫筆記。

還是想在強調一遍:要用自己的話寫,忘記老師的原話,這樣別人的知識才會轉化成你的。

同樣,這也是我寫的:

該通過做一個小項目強化一下。比如去做一個文章或者商品管理系統,做做常用的增刪改查。就像下面的添加這個商品功能頁面,無非就是用PHP把前端用戶填寫的數據存放到資料庫么。

編程只會在最初的幾天里是個有意思的事情,之後大多會出現厭煩厭學。所以興趣並不能完全成為編程的動力。通過項目開發,你會發現更多的編程動力是生活中需要的實際需求和通過高強度高密度的學習和思考後解決需求後的強烈成就感。

框架:

框架說白了就是一個已經幫你完成了部分功能的程序部件結構。

基本上到了公司動手做起真實的項目中都是使用框架來開發的,它可以使你的開發速度更快。

為什麼?就說網站開發吧,比如你要做網站中的驗證碼功能,你需要動手自己從0開始寫,同樣的,寫一個文件上傳程序,你需要動手從0開始寫。

這時你會問,我做什麼不都是要動手寫的嗎?

但是你忽略了一個問題,驗證碼,上傳文件等等這些都是網站中幾乎不可缺少的基本功能,每個網站都要用到,這時候你可以動手把這些常用的功能寫好,然後封裝起來,用的時候直接調用就行了,大大減少了代碼的重複性,而這其實也就是框架了。

先別說自己做一個框架,因為完成一個好的框架不是一項簡單輕鬆的工作,而且更需要高的知識技術水平。所以我們要學習使用別人做好的專業的框架,大都說中小型公司都是使用的別人的框架,PHP常見的有thinkphp, ci, yii,我個人推薦學thinkphp,這個是國人做的,輕量級,學起來更容易些,使用的公司也比較多。

MySQL優化技術:

當你學會了PHP,mysql的一些增刪改查技術後,你可以嘗試做一個簡單的文章管理系統了,能發布,修改,和查看文章。

但是,你試想一下,會不會遇到這樣一個問題:當你查看一篇文章,MySQL需要從文章表中尋找你需要的那一篇取出來,此時你的文章已經很多了,比如有一百萬篇,或者一千萬篇時,mysql再從裡面找一篇文章是不是越來越耗時了,平常文章量少的時候也許1秒鐘就能打開一篇文章,此時可能需要十來秒,你願意等嗎?用戶願意等嗎?就像新浪網,騰訊網這樣的大型新聞網站,如果用戶看一篇新聞需要等很長時間,那能行嗎?

所以我們要對mysql進行,讓資料庫盡量用更少的時間找到我們需要的東西。

在這裡就不討論具體的技術細節了,

優化手段主要包括:

1,表的設計

2,mysql的索引優化

3,mysql的查詢優化。

4,分區分表

大家在後來的學習中可以參照我介紹的這幾個。

那麼我學習mysql優化看的也是韓順平老師的教程,叫做《韓順平 大型門戶網站Mysql優化技術》

地址:每學網 韓順平 大型門戶網站Mysql優化技術(完整版)【限時特價課程,獨家配權威的PPT 課堂筆記 練習題】

頁面靜態化技術:

當你學會了MySQL優化技術,切不要沾沾自喜,新的問題的依然很多。

可以再試想一下:一個人訪問時,和大量的人訪問時?當你一個人訪問也許很快,但是大量的人訪問,mysql要處理大量的請求,它是忙不過來的,mysql支持的請求數是有限的,這很容易理解吧。

假如它一次只能處理100個請求,當超過100個人時,其他的用戶是不是就要等著,這樣速度又降下來了,如同上面舉的新浪和騰訊網的例子,用戶是等不了的。

怎麼辦?一個很好的解決方案是採用靜態化技術。

為什麼要採用靜態化,就是把資料庫的數據生成一個文件,用戶第一次訪問時,mysql依然從資料庫裡面取,當第二次乃至以後更多次的訪問時就直接訪問這個靜態文件了,不再勞煩資料庫了,這樣就減輕了伺服器的壓力了。

推薦教程: 《韓順平 大型門戶網站頁面靜態化技術(完整版》

地址:http://www.imeixue.cn/Course-Index-course-id-16.html

Linux

我們的程序,資料庫,整個網站終歸都是放在linux系統的伺服器上的,對於一般的程序員能做到基本的配置即可。基本命令、操作、啟動、基本服務配置(包括rpm安裝文件,各種服務配置等);會寫簡單的shell腳本和awk/sed 腳本命令等一般公司有相應的運維人員管理。如果對這個有興趣,後期可以繼續深挖。

非關係型資料庫Redis/Memcached

怎麼又是資料庫?,不是已經講過了mysql了?是的,上面咱們說的mysql是關係型資料庫,所以這兩個叫做非關係型資料庫。

為什麼需要它們?

與mysql不同的是Redis和Memcached 的數據是放在內存中的,mysql是放在磁碟中的,而訪問內存中的數據速度要遠大於放在磁碟中,這就是它們的好處。

那為什麼還要學習MySQL,幹嘛不直接學習使用Redis和Memcached?

因為:MySQL更適合海量存儲數據,Redis和Memcached是在內存中的,需要很大的內存才行,而且放在內存中的數據也容易丟失,如果機器故障重啟內存就釋放了。

一般互聯網公司大都採用MySQL + Redis,或者 MySQL +Memcached的方式進行架構;Redis/Memcached都是基於內存的,所以它們的速度非常快,包括讀和寫都很快,一般用在一些高並發,大數據量訪問的場景之下。

推薦視頻教程:《韓順平 大型門戶網站Memcached緩存技術(完整版)獨家配權威的PPT 課堂筆記 練習題》

地址:每學網 韓順平 大型門戶網站Memcached緩存技術(完整版)【限時特價課程,獨家配權威的PPT 課堂筆記 練習題】

《韓順平 Redis經典入門視頻課程》

地址:每學網 韓順平 Redis經典入門視頻課程

說到最後,總之,學習PHP並不難,難的是一個體系。我寫的總體比較基礎,主要是針對一些剛入門學習的同學,在整體上給建立一個完整的知識體系。

**************************************************************************************************

在這條路上,可能儘管你如此努力,可還是會遇到你難以理解的問題。同樣,我自己曾經連續半個月失眠,為了考慮那些棘手的問題。

我想讓你知道的是:

要想確切地掌握編程語言的每一個特質是不可能的——它們是野性難馴的猛獸,如果你認為編程是一種易於學習的簡單技能,那可能就會南轅北轍。作為一個程序員,需要學習的東西是無限的,並且一種不能滿足的持久遺憾感,即使是該領域的專家也時常會有。

不用擔心,知道了這些,把心態放正,一步一步的來。不要放棄,吸取知識是擅長它的第一步驟,一定要給自己信心,嘗試用更多的方式去考慮一個問題。

不要試圖一下子掌握所有內容,設定那種如 「我要學習如何編寫代碼」這種不明確的目標——目標應該更具體,並將任務分解成更小的任務。

俗話說得好:無論你認為自己能做到,還是認為自己做不到…..就要看你怎麼暗示自己了:

我之所以不明白這一點,是因為我有一個創造性的大腦。而編程是邏輯性的,我的大腦只是不習慣這種思維方式!

事實證明,它確實這樣!

在整個學習過程中,我希望大家:

不要相信任何『神話』,學會自己思考。

不要墨守成規,大部分人知道的事情可能都是錯的。

不要相信網上的傳言,敢於提出質疑,去測試,根據實踐做決定


看一下這個吧;PHP程序員升級必備—LAMP技能樹http://www.php10086.com/2012/08/903.html,可以直接查看大圖。


在 WEB 開發世界裡,PHP 是最流行的語言之一,從 PHP 里,你能夠很容易的找到你所需的腳本,遺憾的是,很少人會去用「最佳做法」去寫一個 PHP 程序。這裡,我們向大家介紹 PHP 的 10 種最佳實踐,當然,每一種都是經過大師們證明而得出的。

1. 在合適的時候使用 PHP – Rasmus Lerdorf

沒有誰比 PHP 的創建者 Rasmus Lerdorf 明白 PHP 用在什麼地方是更合理的,他於 1995 年發布了 PHP 這門語言,從那時起,PHP 就像燎原之火,燒遍了整個開發陣營,改變了互聯網的世界。可是,Rasmus 並不是因此而創建 PHP 的。PHP 是為了解決 WEB 開發者的實際問題而誕生的。

和許多開源項目一樣,PHP 變得流行,流行的動機並不能用正常的哲學來進行解釋,甚至流行得有些孤芳自賞。它完全可以作為一個案例,一個解決各種 Web 問題的工具需求所引起的案例,因此當 PHP 剛出現的時候,這種工具需求全部聚焦到 PHP 的身上。

但是,你不能奢望 PHP 可以解決所有問題。Lerdorf 是第一個承認 PHP 只是一種工具的人,並且 PHP 也有很多力所不能及的情況。

根據工作的不同來選擇合適的工具。我跑了很多家公司,為了說服他們部署和使用 PHP,但是這並不意味著 PHP 對所有問題都適用。它只是可以一個解決大部分問題的 front-end 腳步語言。

作為一個 web 開發者,嘗試用 PHP 解決所有問題是不科學的,同時也會浪費你的時間。當
PHP 玩不轉的時候,不要猶豫,試用一下其他的語言吧。

2. 使用多表存儲提高規模伸縮性
– Matt Mullenweg

沒有人願意質疑 Matt Mullenweg 在 PHP 方面的權威性,他開發了這個星球上最流行的
blog 系統,(依靠一個強大的社區力量支持): WordPress. 創建 WordPress 以後,Matt 和他的團隊啟動了 http://WordPress.com 平台,一個基於
WordPress MU 的免費 blog 站點。現在,http://Wordpress.com 已經擁有大約 400 萬用戶,
這些用戶每天提供超過 140,000 篇的日誌。

如果有人知道如何讓網站的規模伸縮自如,這個人一定是 Matt Mullenweg。2006 年的時候 Matt 對 WordPress 的數據結構進行了前瞻性的改進,並且解釋了為什麼 WordPress MU 對每個 blog 使用獨立的 MYSQL 表格, 而不是把所有的 blog 數據都塞進一個巨大的表格。

我們測試過這個方法,但是發現如果要擴展它的伸縮性,代價太高。如果用一個整體的數據結構,在大流量面前,你將會面臨伺服器硬體的問題。在 MU 裡面。用戶們都被分布到獨立的表格當中,並且可以輕易地組織起來。舉個例子,http://WordPress.com 把用戶的數據分散存儲到 4096
個資料庫中,這些資料庫可以分散大規模的數據訪問,實現流量和壓力分流。

數據表的可遷移性讓代碼(blog)可以運行得更快,並且讓系統具備更強的伸縮性。依靠強大的緩存策略和靈活的資料庫運用策略, Matt 向人們展示了時下最流行的 Facebook 和 http://Wordpress.com 都可以在 PHP 下穩定運行,並且處理驚人的訪問量。

3. 千萬不要相信用戶 – Dave Child

Dave Child 是 Added Bytes (previously http://ilovejackdaniels.com) 網站的核心人物,這個網站以他出色的《cheat sheets for many programming languages》而聞名。 Dave 為很多英國的公司服務,並且已經在編程世界裡樹立起相當的權威。

Dave 為 PHP 開發者提供了很多深謀遠慮的建議,並總結成了《writing
secure code in PHP》:千萬不要相信你的用戶,他們甚至可能會傷害你。

有一條 web 開發的基本原則,我重複多少遍都覺得不夠,那就是:千萬不要相信你的用戶,同時要假設你網站中的每個數據單元都是從用戶那裡收集來的惡意代碼。很多時候,你必須用 JAVAscript 在客戶端檢驗表單提交過來的內容, 如果你習慣了如此,那麼,這是一個好習慣。如果安全性對你來說很重要,這就是最重要最需要學習的原則。

Dave 目前正致力於為它的《Writing Secure PHP》系列書籍整理實例,書的最後他說:

最後,變得偏執一點吧。除非你認為你的站點永遠不會受到攻擊,否則就正視所有的問題,當問題真正發生的時候,你的情況會變得很糟。你需要把每個用戶都看成會帶來一場攻防站的黑客,想盡一切辦法來保護站點的安全,同時想好相應問題的解決方案。

4. 多使用 PHP 緩存 – Ben Balbo

Ben Balbo 開發了 Site Point,一個為 developers 和 designers 提供指導的網站。他是墨爾本
PHP 開發和開源俱樂部的成員, 因此他對 PHP 有一定的了解,同時對 PHP caching 有一定的想法和經驗。

如果你擁有一個訪問量很大,但更新並不頻繁的站點(比如 blog,基於某種 CMS),或許它需要進行一些改造,這些改造不會花費太多的時間,但是對性能有突出的貢獻。
如果要為一個複雜/更新頻率很快的站點建立緩存機制,過程可能會很曲折,但是好處也是顯而易見的。

PHP 緩存技術有很多種,Ben 為我們推薦了如下一些:

緩存函數的運行結果

設置過期時間

緩存 IE 下載的文件

模板緩存技術

Cache_Lite

由於 PHP 作為動態語言的特性,緩存機制對於更新頻率並不快的站點來說非常重要。

5. 使用 IDE, Templates 和 Snippets 加速 PHP 開發 – Chad Kieffer

當 Chad Kieffer 從 UI 設計和資料庫優化的工作中抽身出來的時候,他會在他的博客 2 tablespoons 上分享很多技術經驗。由於
Chad 多方面的全面發展,他經常可以發現其他程序員不能發現的問題,並形成相關經驗,尤其是他開發網站的方法。他參與了網站開發的各個環節,因此他的建議對於提高網站開發的大局觀非常有用。

Chad 認為使用 Eclipse PDT (Eclipse』s PHP
development package) 這樣的 IDE,同時使用一些模板技術和開源項目可以有效地提高 PHP 的開發速度。

緊湊的計劃,長長的 to do lists 以及 deadlines 讓開發人員非常苦悶。不過有些功能,比如 Eclipse Templates,可以有效減少編碼的時間和出錯的幾率。

通常來說,任何項目都可以自動化,自動化程度越高, 你完成項目的時間就越短。花時間來開發使用頻率很高的框架和模板,將會節省你以後更多時間。同時,使用像 Eclipse and the PDT package 這樣的 IDE,你會發現效率得到明顯提高,IDE 可以自動閉合,補全分號並且可以在本地 debug。

6. 利用好 PHP 的過濾函數 – Joey Sochacki

或許 Joey Sochacki 並不像 Matt Mullenweg 那樣有名 ,但他也是一個經驗豐富的開發者,並且通過他的博客 Devolio 分享了很多技術經驗

Joey 發現在編寫 php 代碼的過程中有很多地方需要進行過濾,但卻並沒有太多的 coder 關注 php 的內置過濾函數。

過濾數據是我們經常需要做的事情,但是很多功能豐富的 PHP 內置過濾函數卻不為人知。使用類似
filter_* 的 PHP 內置函數,我們幾乎可以處理所有的過濾任務,包括數據類型驗證/URL/email 和 IP 地址驗證/特殊字元處理等等。

過濾是一件複雜的事情,但是我相信 joey 的發現會給你很多啟發,讓你認識到 PHP 強大的過濾功能。

7. 使用 PHP 框架 – Josh Sharp

對於是否應該使用 Zend, CakePHP,
Code Igniter, 或者其他 PHP 框架,一直存在著很多爭議,但是在 web 開發者的心中,他們有自己衡量的標準。

Josh Sharp 自己創建了一家提供麵包和黃油服務的網站,因此他對於使用 PHP 框架來開發網站有一定的經驗。他認為使用一個
PHP 框架來進行項目開發(use a PHP
framework ),可以有效地節省時間,並且減少出錯的幾率。為什麼?因為他覺得 PHP 實在是太好上手了。

PHP 的易於使用有時候也有缺陷,因為並不嚴格的語法,經常會導致很多錯誤代碼的誕生。但如果使用一個 PHP 框架,出錯的幾率就會大大減少。

PHP 框架可以讓你的代碼結構更加規範,並且節省大量時間。

8. 不要使用 PHP 框架 – Rasmus Lerdorf

與 Josh 的觀點恰恰相反,PHP 的鼻祖 Rasmus Lerdorf 卻認為最好不要使用 PHP 框架,為什麼?因為不基於框架的 PHP 性能更好。Rasmus 在 Drupalcon 2008
的演講上,用「Hello World」的例子來對比了一些框架 PHP 和簡單 PHP 之間的性能,結果顯示框架 PHP 的性能要遠遠落後。

9. 使用批處理 – Jack D. Herrington

Jack Herrington 對 PHP 世界並不陌生, 並且為大名鼎鼎的 IBM developerWorks 貢獻過超過 30 篇的專搞,
同時出版過《PHP Hacks》的書,因此他是一個真正的專家。

Herrington 推薦使用批處理和 Cron 來代替那些可以運行在後台的程序腳步,Web 用戶並不願意在線等待你的處理過程,所以有些事情更適合放到後台來處理。

誠然,在某些情況下,這有點大材小用了,但是你可以清楚地看到,使用 Cron, MySQL, PHP 面向對象的方法以及
Pear::DB 這些便捷的工具來創建一個批處理工具並不是一件複雜的事情。

Jack 認為使用 cron, PHP 和 MySQL 在後台處理一些任務,比起多進程的業務邏輯要划算得多。

兩種方法我都嘗試過,我認為 Cron 非常符合」Keep It Simple, Stupid」 (KISS) 的原則,它讓後台處理變得簡單。與多進程的業務邏輯相比,它沒有內存溢出的風險。你可以創建一個簡單的批處理腳本,並且在 cron 中運行,這個腳本會定時檢查是否有任務需要處理,處理完之後就會自動退出,因此你不用擔心是否有進程卡殼,或者陷入死循環。

10. 及時啟用錯誤報告 – David Cummings

David Cummings 有一個專門提供 CMS 軟體服務的公司 ,並且獲得過幾次獎 ,他有非常豐富的 PHP 開發經驗。David 曾經寫過《two PHP tips he wished he』d learned in the beginning》,其中一點就是:及時啟用錯誤報告,這會節省大量的時間。

我告訴人們,最重要的事情就是最大程度地開啟
PHP 的錯誤報告,為什麼?因為 PHP 可能會隱藏很多小問題:

變數沒有預定義

在代碼片段中引用了不可用的變數

使用了未定義的常量這些因素看起來並不是什麼大事,除非你在使用面向對象的方法編寫一些類庫。通常,關閉錯誤報告將可能使你付出更大的成本來維護你的代碼。

錯誤報告可以幫你輕易地找到代碼的問題所在,如果錯誤報告的等級夠高,細微的錯誤都能被立即發現,幫助你節省整體 debug 的時間。


以前我總是覺得你把php學到極致,你會是個高手,可是我現在的想法漸漸有點變了,你要設計好整個程序的架構,可管控,可擴展,當然不僅僅是程序,db,cache等等


本人不是高手,但我學習的過程是這樣的,先搞好基礎語法,接著分模塊功能實現,學習smarty,嘗試做幾個小項目,接著看流行的cms的源碼,看多了,就嘗試自己寫一個,接下來就是看各種流行框架了,先學會用,最後試著自己寫一個(能寫一個的話,本人覺得就是高手了,本人還是停留在寫cms的水平),其中看cms源碼跟學框架可以同時進行,因為有一些cms直接就是框架實現的。


會用PHP寫幾個項目之後,更多地會去了解支撐其運行的背後架構,那些東西才是「進階知識」;當你對背後架構有一定了解後,會發現演算法與數據結構才是真正的核心


學好PHP的關鍵就是不學PHP。

去學java,學C,多了解架構,而不是沉迷於PHP的語法糖


要想成為一個php高手,首先得成為一個編程高手,要成為一個編程高手,那麼至少對(編譯,線程,設計模式,數據結構)有不錯的了解和理解。(喜歡噴php用不上數據結構和設計模式的人勿噴,對此我統一回復呵呵~)。掌握了基礎知識之後就得大量的工程鍛煉了,寫很多項目,然後就成為高手了。


其實說那麼多.. 其實想從一個初學者 到 對PHP精通

只需要注意兩點就可以了.

1. 常翻 php CHM 電子手冊

2. 不停的閱讀別人的代碼 (從底層一步一步理解別人的代碼)

3, 盡量讓自己的代碼獨立完成任務,自己去定義類,規範,不要依賴各種PHP框架


@高票 首先第一點,php是一款前端腳本語言

工作了兩年多了,說一點小體會

第一 基本運維知識

至少自己的環境可以搭建起來,一般問題可以自己排查解決,包括配置nginx或apache,備份資料庫,資料庫或環境起不來了能自己解決

學會搭建最起碼會使用svn(至少大多數公司版本控制系統使用的是)

crontab等基本運維操作

第二 初級前端水平

很少有php程序員可以完全脫離前端工作內容,至少知道怎麼使用插件實現大部分前段效果

第三 資料庫操作優化

大部分初級乃至中級php程序員代碼效率低的最主要的原因之一

第四 函數的運用

php函數強大到你不能想像的地步,初級程序員和高級程序員之間最明顯的差距除了代碼的嚴密性就是php函數運用的熟練程度

第五代碼的嚴密性

這點其實不好說,工作久了就發現大部分bug是可以避免的,尤其是剛工作的時候,寫的東西簡直漏洞百出,php的容錯體系不是很完善,尤其是涉及到資料庫操作,事務基本可以忽略,所以多數情況只能靠程序員自己盡量將自己代碼的的嚴謹一些

基本這就是工作一兩年的php程序員和剛工作的php程序員的區別,以及工作中常用的東西,想到什麼說什麼,後面想起會補充

再說一點php可以做什麼,大部分人都說php不適合做數據處理,這句也對,但不全對,極其頻繁的複雜的專業數據計算,php肯定是不適合的,但是百分之七八十的情況都遇不到這種 龐大的 複雜的 數據計算,前段時間公司需要實時處理遊戲rsync過來的日誌,分析處理後落地入庫,在線人數大概在兩萬人左右,推過來的所有玩家實時數據純文本php處理完全沒有壓力,這樣的處理效率對於大多數數據處理需求已經完全足夠了


從自己的一些切身經歷,開始說起吧。剛開始的PHP程序員從業都會從內容管理系統,企業網站開始。HTML靜態頁面,JS特效是必須的技能。也許有很多的Java程序員不太能理解,甚至有人在懷疑,PHP是前端語言,不是服務端腳本語言。在一些二三線城市中,項目都比較小,而且都是希望獨立完成,沒什麼分工的,PHP程序員都是從台前到幕後的。後面有機會在公司中接觸到大的項目,對PHP深入的運用,發現其實PHP還是很強大的,可以用PHP自帶的函數實現很多功能,可以裝不同的擴展實現很多軟體的應用。但到後來去學習Linux就發現,其實自己作為PHP程序員還是很狹隘的,發現PHP程序員可以走的很遠,而不止是在企業網站。這一切都是在不斷地壯大自己,經歷了這一些。現在也回顧下,也是說說自己的看法。如何成為一個PHP程序員?

1、先了解一下PHP是什麼?PHP能做什麼?你為什麼選擇PHP程序員這樣一個行業?你想用PHP做什麼?先自己想清楚以後是不是想長期做PHP程序員,因為你要是不長期寫代碼,去練習,去解決問題,去積累,你是不可能有什麼成就的。這不是一個投機的事,投機也只會什麼沒學到,浪費時間。

2、用集成環境安裝PHP環境,一定要記住這一點,不要自己分開去裝,尤其是自學的朋友。不然你會覺得很複雜,會沒有信心學下去的。也要注意任何高手都不是一蹴而就的,是一步一步,不同的階段歷練才有最後的沉澱。

3、先了解一些PHP基本的變數類型,語法,函數,基本邏輯,寫簡單的代碼。前期以嘗試,培養興趣為主。這段時間是打基礎很好的時候,這個會影響你後面的發展,不過也可以在後期去完善。

4、這時候你可能覺得PHP就這樣,沒什麼難度,或者有的覺得太難了,簡直一臉疑惑,這個到底有什麼用?在這時候一定要堅持下來,可以試試先放一下,別太較真,慢慢的困惑你的會被你領悟的。建議學習html+css+js,緩解自己的壓力,這個相對簡單,建立信心。尤其是js,總結其實和PHP有相同的思路,可以結合著一起體會。

5、這些都感覺有80%了解就可以先放放了,現在再學習MySQL,也是先了解MySQL基礎的,MySQL是幹什麼的,我可以用它做什麼?因為之前裝的集成環境。為什麼感覺是學習的過程很凌亂?我想告訴你的是,一是不要在自己沒能力解決問題的時候死磕,浪費時間,喪失信心。這時候我們應該做的是學習壯大自己,不要灰心。二是我本來覺得前端、MySQL資料庫、PHP編程都了解才是完整的,這才是一個合格的PHP程序員。

6、這一切都順利的話,你基本離預設的目標不遠了,完成了整個學習的70%了,後面的是在之前的學過的知識點上升華。把HTML和CSS、JS結合、靜態文件和PHP結合、PHP和MySQL結合。這個階段可能越到的問題會異常的多,一定要學會解決問題。網上很多都是答案,同樣你要學會問問題。

7、這些之後你基本已經快到學習的尾聲了,但還缺少經驗。這時,你可以看一些網上開源的CMS,例如織夢,國內用的多,越到問題好解決。看看一些視頻(網上免費的很多),查漏補缺,總結歸納形成自己的知識體系。是時候該準備慶祝下自己這段的時間沒有白費(一般2到3各月,看平時每天花的時間),基本成為一個合格的PHP程序員了。也該恭喜你了,其實作為一個PHP程序員並不那麼難。堅持,堅持;努力,努力;學習,學習。

8、可以去準備再招聘網站上看看大部分公司的就職需求,再準備下自己還不會的知識點就可以了。剛開始選擇小一點的公司,可能要求會的比較多,但一般都不需要你很精通,這段時間還是還是以虛心學習為主。小公司會讓你面更廣闊,大公司會讓你更專註,技術更拔尖。後面的各個人的高度就看自己的造化了。

以上不一定按你學習的進度順序,可以自己靈活調整,我只是把PHP整個學習的時間段分成幾個重要點,幾個常見的階段。可能帶有強烈的個人經歷,但也是一些意見和建議。希望給一些迷茫,還在努力的或者想放棄的一些幫助。總結下,合格的PHPer應該是會靜態網頁,PHP編程,熟悉資料庫的。


我覺得有幾個方面可以選擇下

1、數據存儲,像MySQL 存儲引擎那塊。nosql 等,主要看數據的落地啊,緩存啊,還有數據鎖。這些方面一般都在這些裡面就會涉及。

2、php內核,因為只有你了解他的運行原理你才能說你真正懂這門語言了。當然最好是自己去看源碼。這樣對自己提升更大。前提是你要會c或者c--

3、伺服器的管理與維護。不僅僅是看怎麼做,重點在於人家怎麼實現的。好吧沒錯還是源碼。

4、別發時間糾結在那些框架上,多出去走走泡泡妹子。身體是革命的本錢。我估計著你做完上面的肯定還是單身 。


加入一個比較大的公司,做一些大項目,躺幾次坑兒。

還有就是深入了解一些底層原理!


henhao


高手很多啊,很值得學習~


基礎做起


推薦閱讀:

會PHP會讓人笑瘋嗎?
禁止了瀏覽器 cookie,session 還可以用嗎?

TAG:PHP | 如何學習X | PHP學習 |