Несколько возвратов из функции

Возможно ли, чтобы функция с двумя возвращалась так:

function test($testvar)
{
  // do something

  return $var1;
  return $var2;
}

Если да, то как я могу получить каждый возврат отдельно?

Ответ 1

Нет способа вернуть 2 переменные. Хотя вы можете распространять массив и возвращать его; создать условие для возврата динамической переменной и т.д.

Например, эта функция будет возвращать $var2

function wtf($blahblah = true) {
    $var1 = "ONe";
    $var2 = "tWo";

    if($blahblah === true) {
      return $var2;
    }
    return $var1;
}

В приложении:

echo wtf();
//would echo: tWo
echo wtf("not true, this is false");
//would echo: ONe

Если вы хотите их обоих, вы можете немного изменить функцию

function wtf($blahblah = true) {
    $var1 = "ONe";
    $var2 = "tWo";

    if($blahblah === true) {
      return $var2;
    }

    if($blahblah == "both") {
      return array($var1, $var2);
    }

    return $var1;
}

echo wtf("both")[0]
//would echo: ONe
echo wtf("both")[1]
//would echo: tWo

list($first, $second) = wtf("both")
// value of $first would be $var1, value of $second would be $var2

Ответ 2

Технически вы не можете вернуть более одного значения. Однако есть несколько способов обойти это ограничение. Способ, который больше всего напоминает возврат нескольких значений, имеет ключевое слово list:

function getXYZ()
{
    return array(4,5,6);
}

list($x,$y,$z) = getXYZ();

// Afterwards: $x == 4 && $y == 5 && $z == 6
// (This will hold for all samples unless otherwise noted)

Технически вы возвращаете массив и используете list для хранения элементов этого массива в разных значениях вместо хранения фактического массива. Использование этого метода заставит его почувствовать себя как возвращение нескольких значений.

Решение list является скорее php-специфическим. Есть несколько языков с похожими структурами, но больше языков, которые этого не делают. Там другой способ, который обычно используется для "возврата" нескольких значений и доступен в любом языке (так или иначе). Тем не менее, этот метод будет выглядеть совсем по-другому, поэтому может потребоваться некоторое время для использования.

// note that I named the arguments $a, $b and $c to show that
// they don't need to be named $x, $y and $z
function getXYZ(&$a, &$b, &$c)
{
    $a = 4;
    $b = 5;
    $c = 6; 
}

getXYZ($x, $y, $z);

Этот метод также используется в некоторых функциях, определенных самим php (например, $count в str_replace, $matches в preg_match). Это может сильно отличаться от возврата нескольких значений, но об этом, по крайней мере, стоит знать.

Третий метод - использовать объект для хранения различных значений, которые вам нужны. Это больше печатает, поэтому оно не используется так часто, как два вышеупомянутых метода. Это может иметь смысл использовать это, однако, при использовании одного и того же набора переменных в ряде мест (или, конечно же, для работы на языке, который не поддерживает вышеуказанные методы или позволяет это сделать без дополнительной набрав).

class MyXYZ
{
    public $x;
    public $y;
    public $z;
}

function getXYZ()
{
    $out = new MyXYZ();

    $out->x = 4;
    $out->y = 5;
    $out->z = 6;

    return $out;
}

$xyz = getXYZ();

$x = $xyz->x;
$y = $xyz->y;
$z = $xyz->z;

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

Во-первых, мы можем просто вернуть массив и не рассматривать его как ничего, кроме массива:

function getXYZ()
{
    return array(1,2,3);
}

$array = getXYZ();

$x = $array[1];
$y = $array[2];
$z = $array[3];

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

В качестве альтернативы можно использовать ассоциативный массив:

function getXYZ()
{
    return array('x' => 4,
                 'y' => 5,
                 'z' => 6);
}

$array = getXYZ();

$x = $array['x'];
$y = $array['y'];
$z = $array['z'];

У Php есть функция compact, которая позволяет делать то же самое, что и выше, но при написании меньше кода. (Ну, у образца не будет меньше кода, но, вероятно, это приложение в реальном мире.) Однако, я думаю, что количество печатающих данных минимально, и это делает код более трудным для чтения, поэтому я бы сам этого не делал. Тем не менее, здесь образец:

function getXYZ()
{
    $x = 4;
    $y = 5;
    $z = 6;

    return compact('x', 'y', 'z');
}

$array = getXYZ();

$x = $array['x'];
$y = $array['y'];
$z = $array['z'];

Следует отметить, что в то время как compact имеет аналог в extract, который может быть использован в вызывающем коде здесь, но поскольку это плохая идея использовать его (особенно для чего-то простого, как это), я выиграл даже дать образец для этого. Проблема в том, что он будет делать "волшебство" и создавать переменные для вас, в то время как вы не можете видеть, какие переменные создаются, не переходя в другие части кода.

Наконец, я хотел бы упомянуть, что list не очень хорошо сочетается с ассоциативным массивом. Следующее будет делать то, что вы ожидаете:

function getXYZ()
{
    return array('x' => 4,
                 'y' => 5,
                 'z' => 6);
}

$array = getXYZ();

list($x, $y, $z) = getXYZ();

Однако следующее будет делать что-то другое:

function getXYZ()
{
    return array('x' => 4,
                 'z' => 6,
                 'y' => 5);
}

$array = getXYZ();

list($x, $y, $z) = getXYZ();

// Pay attention: $y == 6 && $z == 5

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

Ответ 3

В вашем примере второе возвращение никогда не произойдет - первое возвращение - это последнее, что будет работать PHP. Если вам нужно вернуть несколько значений, верните массив:

function test($testvar) {

    return array($var1, $var2);
}

$result = test($testvar);
echo $result[0]; // $var1
echo $result[1]; // $var2

Ответ 4

Начиная с Php 7.1 у нас есть правильная деструкция для списков. Тем самым вы можете делать такие вещи:

$test = [1,2,3,4];
[$a, $b, $c, $d] = $test;
echo($a);
> 1
echo($d);
> 4

В функции это будет выглядеть так:

function multiple_return() {
    return ['this', 'is', 'a', 'test'];
}

[$first, $second, $third, $fourth] = multiple_return();
echo($first);
> this
echo($fourth);
> test

Разрушение - очень мощный инструмент. Он также способен деструктурировать пары ключ => значение

["a" => $a, "b" => $b, "c" => $c] = ["a" => 1, "b" => 2, "c" => 3];

Взгляните на новую страницу функций: http://php.net/manual/de/migration71.new-features.php

Ответ 5

В PHP 5.5 также существует новая концепция: generators, где вы можете получить несколько значений из функции:

function hasMultipleValues() {
    yield "value1";
    yield "value2";
}

$values = hasMultipleValues();
foreach ($values as $val) {
    // $val will first be "value1" then "value2"
}

Ответ 6

Или вы можете пройти по ссылке:

function byRef($x, &$a, &$b)
{
    $a = 10 * $x;
    $b = 100 * $x;
}

$a = 0;
$b = 0;

byRef(10, $a, $b);

echo $a . "\n";
echo $b;

Это приведет к выводу

100
1000

Ответ 7

Я знаю, что я довольно поздно, но есть хорошее и простое решение этой проблемы.
Можно вернуть несколько значений одновременно, используя деструктуризацию.

function test()
{
    return [ 'model' => 'someValue' , 'data' => 'someothervalue'];
}

Теперь вы можете использовать это

$result = test();
extract($result);

extract создает переменную для каждого члена в массиве, названную в честь этого члена. Теперь вы можете получить доступ к $model и $data

Ответ 8

Вы можете вернуть несколько массивов и скаляров из функции

function x()
{
    $a=array("a","b","c");
    $b=array("e","f");
    return array('x',$a,$b);
}

list ($m,$n,$o)=x();

echo $m."\n";
print_r($n);
print_r($o);

Ответ 9

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

function test($testvar)
{
  // do something
  //just assigning a string for example, we can assign any operation result
  $var1 = "result1";
  $var2 = "result2";
  return array('value1' => $var1, 'value2' => $var2);
}

Ответ 10

да, вы можете использовать объект: -)

но самый простой способ - вернуть массив:

return array('value1','value2','value3','...');

Ответ 11

Функции, по определению, возвращают только одно значение.

Однако, как вы предполагали, это значение может быть массивом.

Итак, вы можете сделать что-то вроде:

<?PHP
function myfunc($a,$b){
   return array('foo'=>$a,'bar'=>$b);
}
print_r(myfunc('baz','bork'));

Тем не менее, стоит подумать о том, что вы пытаетесь решить. При возврате значения комплексного результата (например, массива или объекта) вполне допустимо, если вы думаете, что "я хочу вернуть два значения", вы можете плохо проектировать. Без подробностей в вашем вопросе трудно сказать, но никогда не помешает остановиться и подумать дважды.

Ответ 12

Я реализую это как функцию множественного возвращаемого значения PHP. Будьте добры с вашим кодом. спасибо.

 <?php
    function multi_retun($aa)
    {
        return array(1,3,$aa);
    }
    list($one,$two,$three)=multi_retun(55);
    echo $one;
    echo $two;
    echo $three;
    ?>

Ответ 13

да и нет, вы не можете вернуть более одной переменной/объекта, но, как вы полагаете, вы можете поместить их в массив и вернуть это, нет ограничений на вложение массивов, поэтому вы можете просто их упаковать чтобы вернуть

Ответ 14

Функции в PHP могут возвращать только одну переменную. вы можете использовать переменные с глобальной областью, вы можете вернуть массив, или вы можете передавать переменную по ссылке на функцию, а не изменять значение, но все это уменьшит читаемость вашего кода. Я бы предложил вам изучить классы.

Ответ 15

Думал, что я бы расширил несколько ответов сверху....

class nameCheck{

public $name;

public function __construct(){
    $this->name = $name;
}

function firstName(){
            // If a name has been entered..
    if(!empty($this->name)){
        $name = $this->name;
        $errflag = false;
                    // Return a array with both the name and errflag
        return array($name, $errflag);
            // If its empty..
    }else if(empty($this->name)){
        $errmsg = 'Please enter a name.';
        $errflag = true;
                    // Return both the Error message and Flag
        return array($errmsg, $errflag);
    }
}

}


if($_POST['submit']){

$a = new nameCheck;
$a->name = $_POST['name'];
//  Assign a list of variables from the firstName function
list($name, $err) = $a->firstName();

// Display the values..
echo 'Name: ' . $name;
echo 'Errflag: ' . $err;
}

?>
<form method="post" action="<?php $_SERVER['PHP_SELF']; ?>" >
<input name="name"  />
<input type="submit" name="submit" value="submit" />
</form>

Это даст вам поле ввода и кнопку отправки после отправки, если поле ввода имени пуст, оно вернет флаг ошибки и сообщение. Если поле имени имеет значение, оно вернет значение/имя и флаг ошибки 0 для false = нет ошибок. Надеюсь это поможет!

Ответ 16

Некоторые могут предпочесть возвращать несколько значений в качестве объекта:

function test() {
    $object = new stdClass();

    $object->x = 'value 1';
    $object->y = 'value 2';

    return $object;
}

И назовите его следующим образом:

echo test()->x;

Или:

$test = test();
echo $test->y;

Ответ 17

Ответ, который дан выше с зеленой галочкой, на самом деле неверен. Вы можете вернуть несколько значений в PHP, если вы возвращаете массив. См. следующий код для примера:

<?php

function small_numbers()
{
    return array (0, 1, 2);
}

list ($zero, $one, $two) = small_numbers();

Этот код фактически скопирован со следующей страницы на веб-сайте PHP: http://php.net/manual/en/functions.returning-values.php Я сам много раз использовал один и тот же код, поэтому могу подтвердить, что он хороший и работает.

Ответ 18

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

Ответ 19

Ответ - нет. Когда синтаксический анализатор достигает первого оператора return, он будет направлять управление обратно на вызывающую функцию - ваш второй оператор return никогда не будет выполнен.

Ответ 20

Я думаю, что Элиего четко объяснил ответ. Но если вы хотите вернуть оба значения, поместите их в массив и верните его.

function test($testvar)
{
  // do something

  return array('var1'=>$var1,'var2'=>$var2);
//defining a key would be better some times   
}

//для доступа к возвращаемым значениям

$returned_values = test($testvar);

echo $returned_values['var1'];
echo $returned_values['var2'];

Ответ 21

Добавьте все переменные в массив и затем верните array.

function test($testvar)
{
  // do something
  return array("var1" => $var1, "var2" => @var2);
}

И затем

$myTest = test($myTestVar);
//$myTest["var1"] and $myTest["var2"] will be usable

Ответ 22

Лучшей практикой является перенос возвращаемых переменных в массив, а затем используйте list() для назначения значений массива переменным.

<?php

function add_subt($val1, $val2) {
    $add = $val1 + $val2;
    $subt = $val1 - $val2;

    return array($add, $subt);
}

list($add_result, $subt_result) = add_subt(20, 7);
echo "Add: " . $add_result . '<br />';
echo "Subtract: " . $subt_result . '<br />';

?>

Ответ 23

Для PHP 7.1 & lt; = вы можете использовать новый синтаксис (вместо функции списка):

/**
* @return  array  [foo, bar]
*/
function getFooAndBar(): array {
    return ['foo', 'bar'];
}

[$foo, $bar] = getFooAndBar();

print 'Hello '. $foo .' and '. $bar;

Это нормально для меня, если вы хотите вернуть 2-3 переменные, в противном случае вы должны использовать объект с желаемыми свойствами.

Ответ 24

Языки, которые допускают несколько возвратов, обычно просто преобразуют несколько значений в структуру данных.

Например, в python вы можете возвращать несколько значений, однако на самом деле они просто возвращаются в виде 1 кортежа.

Таким образом, вы можете вернуть несколько значений в PHP, просто создав простой массив и вернув это.

Ответ 25

Вы можете получить значения двух или более переменных, установив их по ссылке

function t(&$a, &$b) {
    $a = 1;
    $b = 2;
}


t($a,$b);

echo $a . '  ' . $b;

выход:

1 2

Ответ 26

<?php
function foo(){
  $you = 5;
  $me = 10;
  return $you;
  return $me;
}

echo foo();
//output is just 5 alone so we cant get second one it only retuns first one so better go with array


function goo(){
  $you = 5;
  $me = 10;
  return $you_and_me =  array($you,$me);
}

var_dump(goo()); // var_dump result is array(2) { [0]=> int(5) [1]=> int(10) } i think thats fine enough

?>

Ответ 27

Использует ли php "параметры"? Если это так, вы можете использовать синтаксис для изменения одного или нескольких параметров, входящих в вашу функцию, тогда вы могли бы свободно использовать измененную переменную после возвращения своей функции.

Ответ 28

Это самый простой способ

public function selectAllUsersByRole($userRole, $selector){
    $this->userRole = $userLevel;
    $this->selector = $selector;

    $sql = "SELECT * FROM users WHERE role <= ? AND del_stat = 0";
    $stm = $this->connect()->prepare($sql);// connect function in Dbh connect to database file
    $stm->execute([$this->userRole]);//this is php7, use array($this->userRole) for php5

    $usersIdArray = array();
    $usersFNameArray = array();
    $usersLNameArray = array();

    if($stm->rowCount()){
        while($row = $stm->fetch()){

            array_push($usersIdArray, $row['id']);
            array_push($usersFNameArray, $row['f_name']);
            array_push($usersLNameArray, $row['l_name']);
// you cane return only $row['id'] or f_name or .....
//I used the array cause its most using
        }
    }
    if($this->selector == 1) {
        return $usersIdArray;
    }elseif($this->selector == 2) {
        return $usersFNameArray;
    }elseif($this->selector == 3) {
        return $usersLNameArray;
    }

}

Как вызвать эту функцию?

$idData= $selectAllUsers->selectAllUsersByLevel($userRole,0);
print_r($idData);
$idFName= $selectAllUsers->selectAllUsersByLevel($userRole,1);
print_r($idFname);

Вот оно, очень радужное

Ответ 29

$var1 = 0;
$var2 = 0;

function test($testvar, &$var1 , &$var2)
{
  $var1 = 1;
  $var2 = 2;
  return;
}
test("", $var1, $var2);

// var1 = 1, var2 = 2 

Это не очень хороший способ, но я думаю, что мы можем установить 2 переменные в функции одновременно

Ответ 30

У меня была аналогичная проблема - поэтому я попробовал и немного поработал с поиском по этой теме. После 5 минут попытки и ошибки я узнал, что вы можете просто использовать "И" вернуть две (возможно, еще - еще не проверенные) в одной строке возврата.

Мой код:

  function get_id(){
    global $b_id, $f_id;
    // stuff happens
    return $b_id AND $f_id;
  }
  //later in the code:
  get_id();
  var_dump($b_id);
  var_dump($f_id); // tested output by var_dump

он работает. Я получил оба значения, которые я ожидал получить/должен получить. Надеюсь, я смогу помочь любому, кто читает эту тему:)