iT邦幫忙

2

想問問關於 php OOP 的概念,釐清一些不懂的部分

  • 分享至 

  • xImage

我最近看了很多 OOP 對於 mysqli的教學(或是PDO),發現簡直是新世界。我現在連線資料庫和語句的方式是在每個網頁上引入一個大的 php檔案,包括connect,而裡面有很多小的 php 檔案,可能是 function,或是mysql 語句,並用 switch 去設定哪一個頁面才會使用到。直到認識了 OOP之後,發現有很多程式可以優化,只是心中產生了很多很多問題
我想將舊有的寫法換成新的,只是不知道從何下手,看來有很多需要改進.....
包括我的 css, js 都是用一個 php檔案去引入
所以每個網頁上會有至少兩個引入,一個可能是 header.php 一個就是 footer.php
而在這裏面放了很多有的沒的 php...這樣至少可以確保每一個頁面都可以同步到,但我不確定這樣寫對不對...有用到的 function再引入,沒用到的就不引入...? ......等等

  1. php 跟 html 分開,這是怎麼樣的一個概念?
  2. 我目前沒有使用框架,所以現在網站的寫法是舊的,礙於時間壓力,不可能打掉重練,但至少我想將框架的邏輯慢慢地改到現在的網站上,我想到的第一個就是 connect資料庫互動了,以往我是上面宣告語句,下面是 while ($row = mysqli_fetch.... 的寫法將資料撈出,幾乎會附帶 html 在裡面,而不是純粹的 json 格式,想問問這種方式能如何灌入 OOP的概念,進行改進?
  3. 我看了不少 OOP的影片教學(國外),每個人 OOP mysqli寫法幾乎不相同,我想確定的是大大們是怎樣的寫法?我只想找到一個最安全的寫法...(我的目標是讓其他人也看得懂我的程式碼)
  4. 有用到的 class function再引入,沒有用到就不引入,於是我找到了 namespace的概念,但我始終仍是不懂這個運作邏輯,即便有看了 live coding,卻不知道怎麼套用到現在的舊有寫法,不曉得有沒有大大有推薦或經驗的取代寫法?

我是看到了這篇 http://blog.turn.tw/?p=3093 才領悟到,我現在是第二步....所以我發現 function 變多,每一頁要引入那頁用不到 function 想一想也不太對....switch 越多..也越來越醜....所以我決定發文問問看大大們的經驗....感謝各位的分享,萬分感激

看更多先前的討論...收起先前的討論...
黃彥儒 iT邦高手 1 級 ‧ 2018-10-27 18:58:09 檢舉
哦,恭喜你躍進了一大步,雖然我不會PHP,但是我推薦你看一本書:無瑕的程式碼
裡面講解的概念是很重要的,此外對於你的第一個問題有一句話還不賴:如果你發現你站在你自己挖出來的坑裡面,第一件事就是不要再往下挖了
武林中人都知道降龍十八掌招招厲害。
可是卻不是每個人都學過降龍十八掌。
關鍵在於:看過,聽過,卻不知道從何入門。
OOP也一樣。如果你是為了要OOP而急就章要用OOP,最後只會用的不淪不類。
假如你真的要使用一個你認為沒學過或是新東西。
如果你不從基礎開始,就不要冒然的想去使用他。
因為一但出事,往往難以挽回。
我只告訴你一件事:在你沒有寫過超過100個能用的class之前………
不要妄想能在專案中使用的多順利……
echochio iT邦高手 1 級 ‧ 2018-10-28 09:33:04 檢舉
先把程式 MVC 分開吧,看來以前是寫成一坨的
Miles iT邦新手 2 級 ‧ 2018-10-28 22:54:24 檢舉
如果想要立刻在現有程式上,享受框架美好的話,可以參考這一系列的文章

https://github.com/MilesChou/book-refactoring-30-days

這裡有如何把舊程式用 Laravel 包起來的範例(從第 14 天開始)。是用這個簡報的概念實作的。

https://docs.google.com/presentation/d/1k8YKDHQb6cO_zOWdo0JW3-JP7Z5TjTSl9h_n1ItYMp4
混水摸魚 iT邦研究生 2 級 ‧ 2018-10-29 09:03:00 檢舉
我也覺得先從MVC下手,分開後程式的彈性就變大,OOP 封裝 繼承 多型
一開始 就先想辦法 實作封裝吧,把相關的資料 方法寫在一個CLASS就這麼單純而已,剩下的等你功能深了再來實作。
OOP一開始花在想的時間比較長,但之後可利用率很高,開發很快;好處多多。
Dion iT邦新手 5 級 ‧ 2018-11-01 23:14:21 檢舉
不能套框架,我個人會把資料庫存取部分統一在一個物件(剛起步而已)。
至於顯示上就是單純呼叫物件跟基本的html及迴圈。
不知道其他先進還有甚麼建議方案。
火爆浪子 iT邦研究生 1 級 ‧ 2018-11-10 21:29:21 檢舉
Dion 請問可以分享一下範例嗎
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

4
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2018-10-29 13:22:36
最佳解答

其實有這樣的問題是不錯,不過如何要能意會的情況下
我先用比較白話的簡單說明來回答你問的問題。

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,卻不知道怎麼套用到現在的舊有寫法,不曉得有沒有大大有推薦或經驗的取代寫法?
答:這個問題,說真的很難給你一個標準的答案。因為這還得知道你目前的寫法應用。是否有所謂的簡單改法。說真的,站在一個過來人的經驗。所謂簡單的改法,是只有高階程度的人員,才有資格這樣說。因為他們一定了解看得懂程式的規劃應用,然後去思考如何去簡單處理及應用。但我並不太認為你有辦法做到這樣的程度。且這也不是一套方法或方式就能一次解決你想要的。還是只能靠個人的經驗來決定的。所以這部份是沒辦法給你答案的。

以上你可以好好的去思考我說的東西,你會發現,有很多東西還是需要依靠經驗來處理。

看更多先前的回應...收起先前的回應...
火爆浪子 iT邦研究生 1 級 ‧ 2018-11-01 01:54:29 檢舉

感謝。受益良多!
我想問一個問題
我現在打算原本一個文件有很多 function
我打算每個都獨立寫成 class namespace
只是引入文件的部分怎麼規劃比較恰當?

這點得要看大分小分的特性。
如function或是功能不多的情況。我會用大分法。
也就是只有global(全域用)、admin(後台用)、home(前台用)
這樣再載入時就會比較單純。

但如果功能性的程式碼很多。就會再細分功能面。

admin_user
admin_set
admin_XXX
home_user
home_set
home_XXX

不過這還得看你的程式規劃性才行。很難跟你說的準。
我只能大約的跟你說我的配置大約是這樣處理

火爆浪子 iT邦研究生 1 級 ‧ 2018-11-05 11:53:05 檢舉

也就是說我每一頁基本就會有一個 header.php
裡面會引入各種 class 跟我要使用的東西?
但我要怎麼分出這一頁只需要用到哪些class,就只要引入那幾個就好

上面不是跟你說怎麼分了??
你該不會還想要自動化處理了?

這當然是要自已引入啊!自已決定要引入的方式,引入的做法。
如真的要自動化,那就也得學會一下路由跟url的特性。
或是用參數來分配指定。

這些都是看你的規劃需求來決定方向的。沒有一定說的準的。

1
wolfwang
iT邦研究生 4 級 ‧ 2018-10-29 11:03:01

我很喜歡推薦大家去看這個免費的教學影片系列

https://laracasts.com/series/php-for-beginners

樓長發問的幾個問題,這個影片都有系統地提到,而且可以透過實際動手去學到這些概念。

我要發表回答

立即登入回答