iT邦幫忙

0

call 一個 function ,該 function 就只是 return 另外一個 function 結果?

php
Y.B 2019-06-22 20:51:032314 瀏覽
  • 分享至 

  • xImage

最近看到一種程式寫法,大概是這樣

<?php
class Test
{
    public function add($a, $b)
    {
        return $this->add_basic($a, $b);
    }
    public function add_basic($a, $b)
    {
        $arr = [];
        // 做一些事情
        return $arr;
    }
}
print_r((new Test())->add(1,2));

小弟百思不得其解,為何不直接 call add_basic 就好?
硬是要在外面包一層有何用意嗎......?

froce iT邦大師 1 級 ‧ 2019-06-23 11:29:25 檢舉
有可能是以前版本用add,然後後來的版本要改成add_basic,所以做個alias,如果以後還有什麼add_extend之類的,再做整合和結合。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
4
清心明月
iT邦新手 3 級 ‧ 2019-06-22 22:29:39
最佳解答

小弟百思不得其解,為何不直接 call add_basic 就好?
硬是要在外面包一層有何用意嗎......?

這是一個類似於物件導向的寫法,但是你的例子編寫方法架構並 不是完整 的物件導向寫法。所以你會看到一頭霧水。
再說這個不是一個好的學習例子。
直接去學習php物件導向程式設計比較好一點。

物件導向程式設計(英語:Object-oriented programming,縮寫:OOP)

暫時只能夠這樣說,OOP物件導向程式設計,是一種非常重要的 武功心法
我再強調一次是 心法

我試一下把一些例子說明OOP的好處

  1. 解決程式代碼變量太多的問題
  2. 簡化程式代碼的易讀性,容易修改及升級
  3. 對於 多工處理(multitasking)方面容易處理
  4. 對於記憶體比較容易管理
  5. 軟件性能改進較為容易處理
  6. 可以針對性對個別物件分工設計處理
  7. 程式代碼修正,容易快捷簡化,對整個程式影響的極低
  8. 可以這樣說,整個程式都用這種oop編寫,只有好處沒有壞處,十年後程式也很容易修改
  9. 時間長了不知道及忘記程式怎麼修改,OOP是一個很好的解決方案
  10. 每一個物件(Object),只要一經過建立,物件(Object)之中的變量,就會獨立運作,不會與主程式衝突
  11. 每一個物件(Object),可以重複使用,並且可以建立多個新(New)的物件(Object)出 來。 每一個新(New)的物件(Object)都是獨立運作,互不干擾。 編寫網站的購物車,就是一個經典例子。
  12. 將整個程式變成很多細小的積木,程式發生問題或需要升級時,只需要針對每一個細小的積木來維護就可以了

因為這個是武功心法,無法太簡單地解釋
只能夠這樣說,一種武功心法,不管在任何一種電腦語言(c, c++, c#, perl, php, .net, java, javascript)上,方法都是大同小異。
重點說明一次,物件導向是電腦程式語言的編寫方法和架構。

最後一句,在十年前,當我完全了解OOP之後, 我發現自己浪費了30年時間學習編程。 所以這個技術是非常之重要。


補充

無論你有冇需要,這是一個標準,就是說你以後所寫的程式只有一種規格。
以下說明只是基礎,這些基礎任何一項都不應該少,而且不管你是不是用php也是這個規格。
進階的不在這裡說明,因為大部分人基礎都未學習清楚,就去學進階的,結果永遠學不會。

基礎OOP架構
每一個物件導向(Class),都應該具備以下基礎規則:-

  1. 啟動 (Start),停止(End)。(php 稱之為 建構Constructors,解構Destructors)
  2. 公共變量(Public valuable),私有變量(Private valuable)
  3. Class 中的副程式 (Public Function),(Private Function)

進階的(暫時不要理會)
4. 呼叫另一個物件(Class)
5. 繼承另一個物件(Class)

每一個物件導向(Class)操作簡介:-

  1. 啟動 (Start)時,會對公共變量(Public valuable)或私有變量(Private valuable)進行初始化
  2. 停止(End)時,可以順便對公共變量(Public valuable)或私有變量(Private valuable) 清零(釋放記憶體),減少軟件佔用記憶體。這一項就算你沒有用或者是空白內容也應該要寫,這是一個好習慣。對一個嚴重資源不足的系統,這個功能是非常重要
  3. 公共變量(Public valuable),讓主程式讀寫
  4. 私有變量(Private valuable),來只有Class內部操作,主程式無法讀寫
  5. (Public Function),讓主程式執行使用
  6. (Private Function),只有Class內部執行使用

感謝 Samと可樂快跑 的補充


補充
以下是一個完整的php OOP教學例子網站

https://code.tutsplus.com/tutorials/object-oriented-php-for-beginners--net-12762


補充

個人感覺學習OOP,用c++比較容易學會和理解
但php感覺上,比較難明白一點

可能是,大家使用的編寫方法有點不同,例如一些符號
c++ { . }
php { -> }

看更多先前的回應...收起先前的回應...

回家之後我再試一試補充一些資料

補充好了 你看看這些東西對你有沒有幫助

你的是中港用詞,我幫你改台灣用語吧。
1.啟動 (Start),停止(End)。(php 稱之為 Constructors,Destructors)
這和物件的生命週期有關係。
其實就是指:建構(construct)和解構(destruct)
當物件被生成時,建構式會被驅動執行。
而當物件被消滅時,解構式會被驅動執行。(釋放資源、記憶體等等)

2.公共變量(Public valuable),私有變量(Private valuable)
其實是開放成員(public)和私有成員(private)
但其中也還有像是保護級成員(protected)之類的。不同語言可能還分的更複雜些。

3.Class 中的副程式 (Public Function),(Private Function)
事實上在class中應稱function為method(方法)
function一般稱之為函式。
但在class中則改稱之為方法(method)
副程式早其我是在basic中看過如此稱呼,但在後來絕大多數的語言都稱之為「函式」。
因為函式可以代表「功能」不見得是「副」(附屬)的範圍。

另外:
「(Public Function),讓主程式執行使用」
這說法也沒說錯,但不完整。
public就是開放給外部使用及執行(如果理解介面的用途的話)
private則是不開放(也就是私有),僅能在該類別中被使用。

謝謝,我都已經分不清楚中港台用語了。
一邊寫一邊想寫英文,哈哈

謝謝,我都已經分不清楚中港台用語了。
一邊寫一邊想寫英文,哈哈

我回家之後把你的改編貼上去

Y.B iT邦新手 5 級 ‧ 2019-06-23 19:35:18 檢舉

謝謝大大的用心回答/images/emoticon/emoticon32.gif

0
小魚
iT邦大師 1 級 ‧ 2019-06-22 21:26:39

你的參數完全沒用到 XD
可能要看原始的程式碼才會知道...

0

理由很多吧,有可能想讓呼叫端call add, 或是add_basic 有別的地方共用到,
又或是某種設計模式,這種寫法再基本不過,不管為何目的就是為了彈性,
之後有變化不用修改add_basic,只需要調整add,不會讓其他有用到add_basic的地方,
跟著被改變

0

用比較簡單點的說法好了。

1.繼承式的寫法應用:
add方法是存在主類別上。但add_basic則是繼承在子類別時。
這樣可方便切換不同類別的應用做法。並結合繼承性的處理方式。

2.統一架構的應用寫法:
在架構中,我可能會需要加入某些方法。但我想要做到一個統一的地方做加入。
也就是我些宣告一個add的方式做法。控制就單純的對照到add的方式。
未來如果我要加入其它的模組或是對應的東西。我只要改這個add的方法就可以了。

其實這樣看起來很像是多餘式的寫法。都是所謂架構式的寫法。
你看的教學只是告訴你可以這樣用。但沒跟你說這樣用的用意在哪。

依照你開發的東西而言。如果沒有特別的必要性。確實也沒那個必要分開那麼多組。反而麻煩。
我就曾經碰過架構不明確,跳來跳去的寫法。一僤作要輪到第三輪才有作用。說繼承也無繼承。都是原物件宣告。

不過比較常看到的是私密方法的應用語法。如

class db {
   function set($name,$var){
       $this->_set($name,$var,TRUE);
   }
   function arrset($arr){
       $this->_set(null,$var,FALSE);
   }
   function _set($name,$var,$isarr=TRUE){
       ...............
   }
}

像如上的應用處理。就是將語法統一化。但程式碼額外應用的做法。

我要發表回答

立即登入回答