Позволяет ли переменная функции PHP быть либо строкой, либо массивом шаблоном или анти-шаблоном? - PullRequest
6 голосов
/ 20 января 2011

Исходя из C # Я привык перегружать свои методы переменными типами параметров.Поскольку вы не можете сделать это в PHP , я часто создаю методы, такие как пример ниже, которые принимают переменную, тогда я проверяю тип и действую соответственно:

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/>';
    }
}

output:

3
3
3
5
4

Это дает мне ту же функциональность, что и в C #, но кажется немного грязным, как будто есть лучший способ.

Этопринятый способ сделать перегрузку метода в PHP (5.3) или есть лучший способ?

Ответы [ 3 ]

11 голосов
/ 20 января 2011

Я знаю, что многие фреймворки делают это для определенных функций, где это имеет смысл, как и некоторые основные функции PHP. Разница между «хорошим» использованием и «плохим» использованием для меня заключается в документации (docblock). В документации должно быть указано, что параметр имеет смешанный тип и различные допустимые типы переменных.

Например:

<?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;
}
3 голосов
/ 20 мая 2012

Я не люблю бить мертвую лошадь, но все же я буду весить здесь.

Я бы не считал это анти-паттерном;как указывает @Merijn, многие нативные функции PHP принимают параметры смешанного типа.Кроме того, многие ваши собственные обстоятельства требуют, чтобы для краткости функция принимала элемент или коллекцию заданного типа вместо разделения его на две функции.

Приведение к (array) - это быстро и легкоспособ достижения этой функциональности:

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

Использование $foo = (array) $foo; лучше 1 , чем $foo = array($foo);, поскольку, когда $foo уже является массивом, он не будет переноситься снова.


Ссылка


1 Дает желаемые результаты со скалярами;объекты дают разные результаты.Объекты, приведенные к массиву, будут перечислять свойства, поэтому используйте усмотрение.

3 голосов
/ 20 января 2011

Как вы сказали, на самом деле не существует метода приема параметров нескольких типов в PHP, как в C #, но это не должно вызывать проблем, если вы проверяете, какого типа параметры, прежде чем что-то с ними делать.

Многие нативные функции PHP принимают параметры смешанного типа, например, str_replace () .

...