2017-02-03 53 views
0

如何可以定義具有參數的PHP函數接受一組固定的類似值來filter_var它接受作爲參數的各種值作爲上限:我猜測它將會像如何使用接受一組固定值的參數定義PHP函數?

http://php.net/manual/en/filter.filters.validate.php

function f(int $params) { ... } 

但問題是如何使我自己的固定帽類型的關聯?

例子來闡明:

目前我有兩個功能:

function defineDirConstant($constant, $dirname) { 
    if (is_dir($dirname) && is_readable($dirname)) { 
     define(__NAMESPACE__ . '\\' . $constant, $dirname . DIRECTORY_SEPARATOR); 
    } else { 
     // some other logic 
    } 
} 

function defineFileConstant($constant, $filename) { 
    if (is_file($filename) && is_readable($filename)) { 
     define(__NAMESPACE__ . '\\' . $constant, $filename); 
    } else { 
     // some other logic 
    } 
} 

我哪捨得結合成一個:

function defineFilesystemConstant($constant, $filename, int $type) { 
    // some logic considering the $type 
} 

我知道我可以使用這個特例一個布爾類型,但我的問題是一般的:如何使一個人類可讀的參數,它可以被輸入爲文本。例如。函數調用將是

f("ONE", "foo.txt", TYPE_FILE); 
f("BAR", "bar", TYPE_DIR); 
f("JIM", "jimcarrey", TYPE_SOMETHING_ELSE); 

我希望澄清。

+0

我不認爲你真的想要這個如果事情不完美,那麼會出現很多運行時錯誤。 –

+0

如果我正確理解這個,你想創建一個函數來接受一個具有常量值的參數(或者可能更多)嗎?像函數f(constant_goes_here,...){}'? – Andrew

+1

你的意思是你的函數應該接受某些常量(比如MY_FILTER1,MY_FILTER2等)而不是其他的?在這種情況下,沒有內置的方法來做到這一點。您必須檢查輸入在允許範圍內的函數主體。 –

回答

1

我認爲你要找的是define()函數 - 你可以使用它來創建類似於filter_var函數使用的常量。

在您的例子,你會創建這些常量:

define('TYPE_FILE', 1); 
define('TYPE_DIR', 2); 
define('TYPE_SOMETHING_ELSE', 3); 

然後你就可以使用,例如,f("BAR", "bar", TYPE_DIR);

或者,如果你想避免全局常量,您可以範圍使用這些類:

class FileSystemType { 
    const FILE = 1; 
    const DIR = 2; 
    const SOMETHING_ELSE = 3; 
} 

然後你就可以訪問使用:

f("BAR", "bar", FileSytemType::DIR); 
+0

這也是我想到的,但它需要全局定義這些常量,而不是在函數內部,這是糟糕的編程風格,不是嗎? – george

+0

@george,好樣的,是的,但這就是PHP爲自己的功能所做的。如果您想按照您所描述的那樣完全創建代碼,那麼這是實現它的唯一方法。否則,您可以創建一個類併爲其添加常量。看到我的第二個例子。 –

+0

謝謝!我認爲這會起作用。 – george

1

看吧http://php.net/manual/en/migration56.new-features.php

function f($req, $opt = null, int ...$params) { 
    printf('$req: %s; $opt: %s; number of params: %s'."\n", 
     $req, $opt, count($params)); 
} 

此功能需要$reg$opt作爲參數數組$params容納所有未來參數,並將其轉換爲int

所以f(1,2,3,4)$reg=1 $opt=2, $params=[3,4]

f(1,2,3,4,'5')具有$reg=1 $opt=2, $params=[3,4,5]

知道你可以檢查$params,只使用有效參數[ENUMS]。如果你把這些2個工藝你有什麼simlliar您例如

interface MyEnums { 
    const VALUE1 = 1; 
    const VALUE2 = 2; 
} 

echo MyEnums::VALUE1;

所以:

定義ENUMS你可以做。

f(1,2,MyEnums::VALUE1,MyEnums::VALUE2);

請從@ this.lau_註釋上面記在心裏。

+0

但這是爲了可變數量的參數。我正在尋找固定數量的參數,其中只有一個接受固定的一組值。 – george

+0

'filter_var'就像那樣。這只是提示或指導方向來實現您的需求。無完整解決方案。不要讓事情變得複雜,如果你不知道如何去做:-)'接受一組固定的值'完全由@ this.lau_的評論解釋''你必須檢查函數的主體,輸入在允許的範圍內'有一個不錯的嘗試 – JustOnUnderMillions

+0

謝謝。我會將他的答案標記爲答案,但您的答案也有用。 – george

相關問題