我最近看了很多 OOP 對於 mysqli的教學(或是PDO),發現簡直是新世界。我現在連線資料庫和語句的方式是在每個網頁上引入一個大的 php檔案,包括connect,而裡面有很多小的 php 檔案,可能是 function,或是mysql 語句,並用 switch 去設定哪一個頁面才會使用到。直到認識了 OOP之後,發現有很多程式可以優化,只是心中產生了很多很多問題
我想將舊有的寫法換成新的,只是不知道從何下手,看來有很多需要改進.....
包括我的 css, js 都是用一個 php檔案去引入
所以每個網頁上會有至少兩個引入,一個可能是 header.php 一個就是 footer.php
而在這裏面放了很多有的沒的 php...這樣至少可以確保每一個頁面都可以同步到,但我不確定這樣寫對不對...有用到的 function再引入,沒用到的就不引入...? ......等等
while ($row = mysqli_fetch....
的寫法將資料撈出,幾乎會附帶 html 在裡面,而不是純粹的 json 格式,想問問這種方式能如何灌入 OOP的概念,進行改進?我是看到了這篇 http://blog.turn.tw/?p=3093 才領悟到,我現在是第二步....所以我發現 function 變多,每一頁要引入那頁用不到 function 想一想也不太對....switch 越多..也越來越醜....所以我決定發文問問看大大們的經驗....感謝各位的分享,萬分感激
其實有這樣的問題是不錯,不過如何要能意會的情況下
我先用比較白話的簡單說明來回答你問的問題。
1.php 跟 html 分開,這是怎麼樣的一個概念?
其實這就是mvc的觀念做法。所謂的html,在mvc中,就是屬於v(view)的概念。再早期就是所謂的樣板系統。
答:一般不將php跟html寫在一起的原因是,在看view搭配了php的寫法。實在很難處理對應的排版。
早期是用所謂的樣版系統。在當時的樣板系統,大多數用的方式都是用php先去載入樣板的內容。再依照其規定的一些規則重新產生對應的html。如某一套樣板系統。就是用<for>...</for>這樣的方式來代表要跑for。載入內容後,會重新解析搭配原來的php中的for將其對應完成。
認真來說,不將php跟html寫在一起的最大原因,其實就是為了程式的判讀因素。
2.我目前沒有使用框架,所以現在網站的寫法是舊的,礙於時間壓力,不可能打掉重練,但至少我想將框架的邏輯慢慢地改到現在的網站上,我想到的第一個就是 connect資料庫互動了,以往我是上面宣告語句,下面是 while ($row = mysqli_fetch.... 的寫法將資料撈出,幾乎會附帶 html 在裡面,而不是純粹的 json 格式,想問問這種方式能如何灌入 OOP的概念,進行改進?
答:認真來說,這就是利用了mvc中的m(model)原理。來達到你想要的資料處理。當然這得捨棄了在view直接操作資料庫輸出。而是利用了model,從中獲取資料庫的值轉變為變數。再交回變數給view做輸出處理。這其實就是一種容器的觀念。介接的觀念。
目的也是為了與第1點所說明的情況,將其化成物件來應用。化成物件來應用也有一個好處。同樣的資料可以在多個地方使用。不需要再一次與資料庫做連接處理。降低資料庫的命令運行。
3.我看了不少 OOP的影片教學(國外),每個人 OOP mysqli寫法幾乎不相同,我想確定的是大大們是怎樣的寫法?我只想找到一個最安全的寫法...(我的目標是讓其他人也看得懂我的程式碼)
答:你會看到不同的寫法,大多是因為物件應用的不同。其實資料庫的應用語法不外手就是函數或是物件的處理應用。但由於正統的資料庫寫法是需要「連接」->「取用庫」->「命令」->「輸出」等行為。其中「連接」「取用」這兩個動作幾乎都是相同的。(除非你是要做多重式連結多庫應用)
所以採用物件來省略掉需要在一般程式中這兩個動作。你的做法因該是會在函式中處理。物件的做法則是會採用直連接,只給命令,跟定義要輸出的方式就好了。認真來說,db庫跟物件你並不太需要擔心別人會看不太懂你的程式碼。至於所謂最安全的寫法。這一直都是寫程式最大的目標。但所謂最安全的寫法,這得要看你的場合環境來決定。也得要靠經驗。你並不能說,找到一套很安全的寫法。
但就認為一切沒事的搞錯語法,安全的東西也會被搞的不安全了。
4.有用到的 class function再引入,沒有用到就不引入,於是我找到了 namespace的概念,但我始終仍是不懂這個運作邏輯,即便有看了 live coding,卻不知道怎麼套用到現在的舊有寫法,不曉得有沒有大大有推薦或經驗的取代寫法?
答:這個問題,說真的很難給你一個標準的答案。因為這還得知道你目前的寫法應用。是否有所謂的簡單改法。說真的,站在一個過來人的經驗。所謂簡單的改法,是只有高階程度的人員,才有資格這樣說。因為他們一定了解看得懂程式的規劃應用,然後去思考如何去簡單處理及應用。但我並不太認為你有辦法做到這樣的程度。且這也不是一套方法或方式就能一次解決你想要的。還是只能靠個人的經驗來決定的。所以這部份是沒辦法給你答案的。
以上你可以好好的去思考我說的東西,你會發現,有很多東西還是需要依靠經驗來處理。
這點得要看大分小分的特性。
如function或是功能不多的情況。我會用大分法。
也就是只有global(全域用)、admin(後台用)、home(前台用)
這樣再載入時就會比較單純。
但如果功能性的程式碼很多。就會再細分功能面。
如
admin_user
admin_set
admin_XXX
home_user
home_set
home_XXX
不過這還得看你的程式規劃性才行。很難跟你說的準。
我只能大約的跟你說我的配置大約是這樣處理
也就是說我每一頁基本就會有一個 header.php
裡面會引入各種 class 跟我要使用的東西?
但我要怎麼分出這一頁只需要用到哪些class,就只要引入那幾個就好
上面不是跟你說怎麼分了??
你該不會還想要自動化處理了?
這當然是要自已引入啊!自已決定要引入的方式,引入的做法。
如真的要自動化,那就也得學會一下路由跟url的特性。
或是用參數來分配指定。
這些都是看你的規劃需求來決定方向的。沒有一定說的準的。
我很喜歡推薦大家去看這個免費的教學影片系列
https://laracasts.com/series/php-for-beginners
樓長發問的幾個問題,這個影片都有系統地提到,而且可以透過實際動手去學到這些概念。