2011-01-20 9 views
5

Pochodzę z C# Jestem przyzwyczajony do przeciążania moich metod zmiennymi parametrami. Ponieważ nie można tego zrobić w PHP, często tworzenia metod, takich jak na przykładzie poniżej, które przyjmują zmienną, następnie sprawdzić typ i działać odpowiednio:Czy dozwolona jest zmienna funkcji PHP jako ciąg lub tablica z wzorcem lub wzorem?

showLength('one'); 
showLength(array(
    'one', 
    'two', 
    'three' 
)); 

function showLength($stringOrArray) { 
    $arr = array(); 
    if(is_array($stringOrArray)) { 
     $arr = $stringOrArray; 
    } else if(is_string($stringOrArray)) { 
     $arr[] = $stringOrArray; 
    } else { 
     //exception 
    } 
    foreach ($arr as $str) { 
     echo strlen($str).'<br/>'; 
    } 
} 

wyjściowa:

3 
3 
3 
5 
4 

Daje mi to tę samą funkcjonalność co w C#, ale wydaje się nieco niechlujny, jak gdyby był lepszy sposób.

Czy jest to zaakceptowany sposób na przeciążenie metody w PHP (5.3), czy jest lepszy sposób?

Odpowiedz

9

Wiem, że wiele frameworków robi to dla pewnych funkcji, gdzie ma sens, podobnie jak niektóre podstawowe funkcje PHP. Różnica między "dobrymi" zastosowaniami i "złymi" wykorzystuje mnie do dokumentacji (docblock). Dokumentacja musi wskazywać, że parametr jest mieszany i różne akceptowalne typy zmiennych.

Na przykład:

<?php 
/** 
    * Function used to assign roles to a user 
    * @param int $user_id The user's id 
    * @param mixed $role Either a string name of the role 
    *      or an array with string values 
    * 
    * @return bool on success/failure 
    */ 
function addRole($user_id, $role) { 
    if (!is_array($role)) { 
    $role = array($role); 
    } 

    foreach($role as item) { 
    Model::addRole($item); 
    } 

    return true; 
} 
+0

Tak, CodeIgniter zrobić to w wielu z ich funkcji i działa dobrze i oszczędza dużo kodu. Dopóki jest to udokumentowane, polecam to. Pamiętaj tylko, aby zwrócić oczekiwany typ. Jeśli przekazałem liczbę całkowitą do modelu, oczekuję obiektu wstecz. Jeśli przekażę tablicę liczb całkowitych, oczekuję od tyłu tablicy obiektów (być może indeksowanych przez ID). – Sid

3

Tak jak powiedziałeś, że nie jest to metoda przyjmowania stwardnienie typu parametersin PHP jak C# robi, ale nie powinno to powodować problemy tak długo, jak sprawdzić, co wpisać parametry są przed zrobieniem z nimi nic.

Wiele natywnych funkcji PHP akceptuje parametry typu mieszanego, np. str_replace().

3

Nie lubię bić martwego konia, ale nadal będę tu ważony.

Nie uważam tego za anty-wzór; jak wskazuje @Merijn, wiele natywnych funkcji PHP akceptuje parametry mieszane. Ponadto, wiele okoliczności jako własnych wymaga, aby dla zwięzłości funkcja akceptowała element lub kolekcję danego typu, zamiast dzielić ją na dwie funkcje.

Casting do (array) to szybki i łatwy sposób, aby osiągnąć tę funkcjonalność:

function printStuff($stuff) 
{ 
    foreach((array) $stuff as $key => $value) { 
     echo sprintf('%d : %s', $key, $value) . PHP_EOL; 
    } 
} 

printStuff("foo"); 
// 0 : foo 

printStuff(array("foo", "bar", "qux")); 
// 0 : foo 
// 1 : bar 
// 2 : qux 

Korzystanie $foo = (array) $foo; lepiej niż $foo = array($foo); jak podczas $foo jest już tablicą, to nie będzie owinąć go ponownie.


odniesienia


produkuje pożądane rezultaty skalarów; obiekty wytwarzają różne wyniki. Obiekty rzucane do tablicy będą wyliczyć właściwości, więc użyj dyskrecji.

Powiązane problemy