Лучший способ передачи / возврата значений - PullRequest
0 голосов
/ 08 августа 2009

Причина, по которой я задаю этот вопрос, заключается в том, что я получил свою первую настоящую (да, оплачиваемую офисную работу - больше не волонтерство!) Работу по веб-разработке около двух месяцев назад. У меня есть пара сотрудников в компьютерных информационных системах (веб-разработка и программирование). Но, как многие из вас знают, то, что вы изучаете в колледже, и то, что вам нужно на рабочем месте, может сильно отличаться и намного больше. Я определенно учусь на своей работе - я заново создал всю инфраструктуру, которую мы используем с нуля в архитектуре MVC - впервые делая что-либо, связанное с шаблонами проектирования.

Мне было интересно, что вы порекомендуете как лучший способ передачи / возврата значений в OO PHP? Прямо сейчас я не внедрил какой-либо стандарт, но я хотел бы создать его до того, как размер рамки увеличится. Я возвращаю массивы, когда требуется получить более 1 значения, и иногда я передаю массивы или имею несколько параметров. Являются ли массивы лучшим способом или есть более эффективный метод, такой как json? Мне нравится идея массивов в том, что для передачи большего или меньшего количества значений вам просто нужно изменить массив, а не само определение функции.

Спасибо всем, просто пытаюсь стать лучшим разработчиком.

РЕДАКТИРОВАТЬ: Я извиняюсь все, я думал, что принял ответ на этот вопрос. Мой плохой, очень, очень плохой.

Ответы [ 4 ]

5 голосов
/ 08 августа 2009

Как часто вы сталкиваетесь с ситуацией, когда вам действительно нужно несколько возвращаемых значений? Я не могу себе представить, что это так часто.

И я не имею в виду сценарий, в котором вы возвращаете что-то, ожидаемое , чтобы быть каким-либо перечислимым набором данных (т. Е. Результатом запроса), но когда возвращаемый массив не имеет другого значения чтобы просто держать два или более значений.

Один метод, который сама библиотека PHP использует, - это ссылочный параметр, такой как preg_match () . Сама функция возвращает единственное значение, булево, но при необходимости использует предоставленный 3-й параметр для хранения сопоставленных данных. По сути, это «второе возвращаемое значение».

Определенно не используйте формат обмена данными, такой как JSON. Целью этих форматов является перемещение данных между разнородными системами ожидаемым, анализируемым способом. В одном выполнении PHP это не нужно.

2 голосов
/ 08 августа 2009

Вы можете вернуть все, что захотите: отдельное значение, массив или ссылку (в зависимости от потребностей функции). Просто будьте последовательны.

Но, пожалуйста, не используйте JSON для внутреннего использования. Это просто приводит к ненужным накладным расходам.

1 голос
/ 08 августа 2009

Я также использую массивы для возврата нескольких значений, но на практике это происходит не очень часто. Если это так, обычно это разумная группировка данных, например, возвращение array('x'=>10,'y'=>10) из функции с именем getCoordinates(). Если вы обнаружите, что выполняете много обработки и возвращаете пакеты данных в массивах из множества функций, возможно, существует некоторый рефакторинг, который можно выполнить, чтобы распределить работу на более мелкие единицы.

Как говорится, вы упомянули:

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

В этом отношении другой метод, который может вас заинтересовать, - это использование функций с переменным числом аргументов. Вполне допустимо объявить функцию без параметров:

function stuff() {
    //do some stuff
}

но вызовите его со всеми параметрами, которые вам нужны, чтобы задать его:

$x = stuff($var1, $var2, $var3, $var4);

Используя func_get_args () , func_get_arg () (в единственном числе) и func_num_args () , вы можете легко найти / зациклить все переданные параметры. Это работает очень хорошо, если у вас нет конкретных параметров, например, функция sum():

function sum()
{
    $out = 0;
    for($i = 0; $i < $c = func_num_args(); $i++) {
        $out += func_get_arg($i);
    }
    return $out;
}

//echoes 35
echo sum(10,10,15);

Пища для размышлений, может быть, вы найдете ее полезной.

0 голосов
/ 08 августа 2009

Единственное, что я стараюсь избегать передачи / возврата массивов, где ключи имеют «особое» значение. Пример:

<?php
// Bad. Don't pass around arrays with 'special' keys
$personArray = array("eyeColor"=>"blue", "height"=>198, "weight"=>103, ...); 

?>

Код, который использует такой массив, сложнее реорганизовать и отладить. Этот тип структуры лучше представить в виде объекта.

<?php

Interface Person {
    /**
     * @return string Color Name
     */
    public function getEyeColor();
    ...
}
?>

Этот интерфейс предоставляет контракт , на который может положиться потребительский код.

Кроме этого, я не могу думать ни о какой причине ограничивать себя.


Примечание: для ясности, ассоциативные массивы отлично подходят для данных списка. как:

<?php
// Good array
$usStates = array("AL"=>"ALABAMA", "AK"="ALASKA", ... );
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...