Nasıl parametrelerin sınırsız sayıda kabul edebileceği bir fonksiyon yazabilirim?
Ne yapmaya çalışıyorum aşağıdaki sarar bir sınıf içinde bir işlev oluşturun:
$stmt->bind_param('sssd', $code, $language, $official, $percent);
Yukarıdaki özetten de anlaşılacağı hepsi iyi, ama onlar sizin durumunuza uygun olacaktır sanmıyorum.
$stmt->bind_param('sssd', $code, $language, $official, $percent);
Bu işlevi kaydırmak istiyorsanız, bind_param işlevine özgün argüman değişkenlere references geçmek gerekir. I func_get_args () bu verir sanmıyorum, bunun yerine size değerleri verir. Bu nedenle, ana işleve geçmek için, bu kullanmak mümkün olmayacaktır. Ben mysqli_stmt genişletmek için çalışırken benzer bir sorun ile mücadele ve tatmin edici bir çözüme gelmedi.
Bu gerçekten ben, diğer argümanlar argümanlar rasgele sayı sizin özel uygulama çalışmayabilir bu sadece bir uyarı korkuyorum sorunuza bir cevap değildir.
Eğer func_get_args, func_get_arg ve func_num_args bir görünüm almış
Yani, örneğin:
function foo(){
if ( func_num_args() > 0 ){
var_dump(func_get_args());
}
}
veya:
function bind_param(){
if ( func_num_args() <= 1 ){
return false; //not enough args
}
$format = func_get_arg(0)
$args = array_slice(func_get_args(), 1)
//etc
}
EDIT
Regarding Ewan Todds comment:
I don't have any knowlege of the base API you are creating the wrapper for, but another alternative may be to do something with chaining functions so your resulting interface looks something like:
$var->bind()->bindString($code)
->bindString($language)
->bindString($official)
->bindDecimal($percent);
Kod muhtemelen daha okunabilir ve daha da önemlisi daha az olası bir biçim değişkenin eksikliği nedeniyle hatalara neden olarak ben func_get_args kullanımı üzerinde tercih edilmektedir.
Kullan func_get_args()
a>:
function my_func() {
$args = func_get_args();
foreach ($args as $arg) {
echo "Arg: $arg\n";
}
}
5 parametrenin de, bu tasarım antipattern "Too Many Parameters" sergilemek başlıyor. Bu, Ancak içeri geçirilecek argümanlar temsil eden veri üyeleri ile Parameter Object, bir nesne veya yapı denilen üstlenmeden anlaşılacağı onu yapmamak bir Magic Container.
Introduce Parameter Object refactoring.com de üstlenmeden Ayrıca bkz.
Işleve iletilen tüm argümanların dizisi func_get_args() adında bir işlevi vardır.
Örnek PHP.net
function foo()
{
$numargs = func_num_args();
echo "Number of arguments: $numargs<br />\n";
if ($numargs >= 2) {
echo "Second argument is: " . func_get_arg(1) . "<br />\n";
}
$arg_list = func_get_args();
for ($i = 0; $i < $numargs; $i++) {
echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
}
}
foo(1, 2, 3);
Yukarıdaki örneğin çıktısı:
Number of arguments: 3
Second argument is: 2
Argument 0 is: 1
Argument 1 is: 2
Argument 2 is: 3
Daha önce size func_get_args()
kullanılır, ama olması gereken de yeni php 5.6 (currently in beta), kullanabilirsiniz ... operator
.
Yani, örneğin size işleve gönderilen tüm sayıların toplamını döndüren işlevi yazabilirsiniz:
function bind_param(...$params){
var_dump($params);
}
Sizin params
aslında tüm unsurların bir dizidir.