PHP一種友好的函式傳參模式設計

2021-07-08 10:40:34 字數 2000 閱讀 9235

當乙個類的建構函式函式中,需要傳入的引數較多時,程式設計師在編碼時由於傳參的順序和寫法難記憶,容易出現編譯錯誤,或者出現值傳給錯誤引數(弱型別語言)的情況.

程式設計師在例項化乙個class時,傳入的引數應該滿足以下友好性目標

1. 能夠只傳入部分引數

2. 能夠不按順序傳入引數

3. 能夠不區分引數的大小寫

4. 能夠及時準確的提示傳參時產生的錯誤

class

fileupload

這一次,為了消除上例的notice,實現可以傳入任意數量的引數,沒有傳入的引數使用預設值,將程式改為:在建構函式中設定預設值.

又乙個問題出現:當程式設計師傳入引數為(「/upload」,array(「jpg」,」gif」),false)時,即程式設計師忘記傳入了maxsize引數,這時系統會錯誤的將false賦值給maxsize而不是israndname,系統沒有任何錯誤輸出,為後續工作留下隱患!

class

fileupload

為解決例2的問題,我們可以對傳入的值進行檢查來防止賦值錯位的情況發生(反正一般情況下我們都會對傳入的值進行檢查).然而這並不是解決問題的方法,因為我們要實現的功能還有使程式設計師可以不按順序傳值

在弱型別語言中,解決這個問題可以使用陣列的特殊性,將所有傳遞的引數封裝到陣列中,以key=>value鍵值對的形式儲存.請看如下**:

class

fileupload

}

這樣就解決了傳入引數的順序問題,同時也解決了只傳部分引數的問題.

然而新的問題出現了,這時程式設計師需要輸入乙個陣列作為引數,如下:

$up = new

$fileupload(array(

"filepath" => "/upload",

"israndname" => false,

"maxsize" => 2000000

));

在使用陣列封裝引數之後,這時需要程式設計師手動輸入變數的名字,這就會因風格不同導致maxsizemaxsizemaxsize這樣的寫法問題,解決這個問題只需要在宣告成員變數時都統一用小寫,然後在建構函式裡加一行:

foreach($options

as$key=>$value)

到這裡,我們的設計已經滿足了友好性目標中的前三點,整體**如下:

class

fileupload

}}

在上例中,如果程式設計師傳入了乙個類中根本沒有的引數,系統會報錯,這裡我們有兩種處理方案:

1. 忽略無效引數,僅執行有效引數

2. 友好的提示出你傳入的某個引數無效

個人認為為了程式的健壯性,不能輕易容許錯誤的**存在,故選擇第二者,我們將這個錯誤友好的提示給呼叫者.

foreach($options

as$key=>$value)else

}

至此,預期的4個目標均已實現,且為了使__construct()函式具有復用性,使用時可以直接paste,我們將對value的檢查抽象成乙個函式,請看修改後的**:

class

fileupload else

}else }}

function

checkvalue

return

false;

}}

python函式的傳參模式

python裡的變數更像是乙個名字 標籤。而python中一切又皆為物件。當函式傳參時,函式引數作為乙個標籤,指向某個物件,因此更貼切的說是 call by object 但是python中是不是就沒用傳值引用的引數了呢 類似c語言的傳參模式 答案是有的,那就是切片,切片就是傳值引用,切片當作引數時...

非固定函式傳參元組和字典的另外一種寫法

非固定函式傳參元組和字典的另外一種寫法 1.當預留的引數為元組格式,則可以 def name args print args name 123,456 def name args print args name 123,456 666,777 def name args print args nam...

C 函式的四種傳參方式

1 call by value 2 call by constant reference 3 call by lvalue reference call by reference 4 call by rvalue reference c 11 1 call by value 小物件 複製代價小 不應...