Php echo return values
Значения возвращаются при помощи необязательного оператора возврата. Возвращаемые значения могут быть любого типа, в том числе это могут быть массивы и объекты. Возврат приводит к завершению выполнения функции и передаче управления обратно к той строке кода, в которой данная функция была вызвана. Для получения более детальной информации ознакомьтесь с описанием return .
Замечание:
Если конструкция return не указана, то функция вернёт значение null .
Использование выражения return
Пример #1 Использование конструкции return
Функция не может возвращать несколько значений, но аналогичного результата можно добиться, возвращая массив.
Пример #2 Возврат нескольких значений в виде массива
function small_numbers ()
return [ 0 , 1 , 2 ];
>
// Деструктуризация массива будет собирать каждый элемент массива индивидуально
[ $zero , $one , $two ] = small_numbers ();
?php
// До версии 7.1.0 единственной эквивалентной альтернативой было использование конструкции list().
list( $zero , $one , $two ) = small_numbers ();
Для того, чтобы функция возвращала результат по ссылке, вам необходимо использовать оператор & и при описании функции, и при присвоении переменной возвращаемого значения:
Пример #3 Возврат результата по ссылке
Для получения более детальной информации о ссылках обратитесь к разделу документации Подробно о ссылках.
User Contributed Notes 10 notes
PHP 7.1 allows for void and null return types by preceding the type declaration with a ? — (e.g. function canReturnNullorString(): ?string)
However resource is not allowed as a return type:
function fileOpen ( string $fileName , string $mode ): resource
$handle = fopen ( $fileName , $mode );
if ( $handle !== false )
return $handle ;
>
>
$resourceHandle = fileOpen ( «myfile.txt» , «r» );
?>
Errors with:
Fatal error: Uncaught TypeError: Return value of fileOpen() must be an instance of resource, resource returned.
Developers with a C background may expect pass by reference semantics for arrays. It may be surprising that pass by value is used for arrays just like scalars. Objects are implicitly passed by reference.
# (1) Objects are always passed by reference and returned by reference
function obj_inc_x ( $obj ) $obj -> x ++;
return $obj ;
>
$obj2 = obj_inc_x ( $obj );
obj_inc_x ( $obj2 );
print $obj -> x . ‘, ‘ . $obj2 -> x . «\n» ;
# (2) Scalars are not passed by reference or returned as such
function scalar_inc_x ( $x ) $x ++;
return $x ;
>
$x2 = scalar_inc_x ( $x );
scalar_inc_x ( $x2 );
# (3) You have to force pass by reference and return by reference on scalars
$x2 =& scalar_ref_inc_x ( $x ); # Need reference here as well as the function sig
scalar_ref_inc_x ( $x2 );
# (4) Arrays use pass by value sematics just like scalars
function array_inc_x ( $array ) $array < 'x' >++;
return $array ;
>
$array = array();
$array [ ‘x’ ] = 1 ;
$array2 = array_inc_x ( $array );
array_inc_x ( $array2 );
print $array [ ‘x’ ] . ‘, ‘ . $array2 [ ‘x’ ] . «\n» ;
# (5) You have to force pass by reference and return by reference on arrays
$array = array();
$array [ ‘x’ ] = 1 ;
$array2 =& array_ref_inc_x ( $array ); # Need reference here as well as the function sig
array_ref_inc_x ( $array2 );
print $array [ ‘x’ ] . ‘, ‘ . $array2 [ ‘x’ ] . «\n» ;
Be careful about using «do this thing or die()» logic in your return lines. It doesn’t work as you’d expect:
function myfunc1 () return( ‘thingy’ or die( ‘otherthingy’ ));
>
function myfunc2 () return ‘thingy’ or die( ‘otherthingy’ );
>
function myfunc3 () return( ‘thingy’ ) or die( ‘otherthingy’ );
>
function myfunc4 () return ‘thingy’ or ‘otherthingy’ ;
>
function myfunc5 () $x = ‘thingy’ or ‘otherthingy’ ; return $x ;
>
echo myfunc1 (). «\n» . myfunc2 (). «\n» . myfunc3 (). «\n» . myfunc4 (). «\n» . myfunc5 (). «\n» ;
?>
Only myfunc5() returns ‘thingy’ — the rest return 1.
With 7.1, these are possible yet;
function ret_void (): void // do something but no return any value
// if needs to break fn exec for any reason simply write return;
if (. ) return; // break
// return null; // even this NO!
>
$db -> doSomething ();
// no need return call anymore
>
function ret_nullable () ? int if (. ) return 123 ;
> else return null ; // MUST!
>
>
?>
Functions which return references, may return a NULL value. This is inconsistent with the fact that function parameters passed by reference can’t be passed as NULL (or in fact anything which isnt a variable).
if ( testRet () === NULL )
echo «NULL» ;
>
?>
parses fine and echoes NULL
PHP 7 return types if specified can not return a null.
For example:
declare( strict_types = 1 );
function add2ints ( int $x , int $y ): int
$z = $x + $y ;
if ( $z === 0 )
return null ;
>
return $z ;
>
$a = add2ints ( 3 , 4 );
echo is_null ( $a ) ? ‘Null’ : $a ;
$b = add2ints (- 2 , 2 );
echo is_null ( $b ) ? ‘Null’ : $b ;
exit();
Output :
7
Process finished with exit code 139
Be careful when introducing return types to your code.
Only one return type can be specified (but prefacing with ? allows null).
Return values of a type different to that specified are silently converted with sometimes perplexing results. These can be tedious to find and will need rewriting, along with calling code.
Declare strict types using «declare(strict_types=1);» and an error will be generated, saving much head-scratching.
You may specify child return type if there is no parent:
class A public function f ( $a )
return 1 ;
>
>
class B extends A public function f ( $a ): int // + return type, OK
return 1 ;
>
>
class C extends A public function f ( int $a ) // + argument type, WARNING
return 1 ;
>
>
?>
Note: the function does not have «alternative syntax» as if/endif, while/endwhile, and colon (:) here is used to define returning type and not to mark where the block statement begins.
Declaring a collection of objects as return type is not implemented and forbidden:
class Child <>
function getChilds (): Child [] return [(new Child ()), (new Child ())];
>
var_dump ( getChilds ());
// Returns: Parse error: syntax error, unexpected ‘[‘, expecting ‘ ?>
We have to use:
class Child <>
function getChilds (): array
return [(new Child ()), (new Child ())];
>
var_dump ( getChilds ());
// Returns:
/*
array (size=2)
0 =>
object(Child)[168]
1 =>
object(Child)[398]*/
?>
Idem for function parameter:
function setChilds ( Child [] $childs )<>
// Not allowed
function setChilds (array $childs )<>
// Allowed
?>
echo
Outputs one or more expressions, with no additional newlines or spaces.
echo is not a function but a language construct. Its arguments are a list of expressions following the echo keyword, separated by commas, and not delimited by parentheses. Unlike some other language constructs, echo does not have any return value, so it cannot be used in the context of an expression.
echo also has a shortcut syntax, where you can immediately follow the opening tag with an equals sign. This syntax is available even with the short_open_tag configuration setting disabled.
The major differences to print are that echo accepts multiple arguments and doesn’t have a return value.
Parameters
One or more string expressions to output, separated by commas. Non-string values will be coerced to strings, even when the strict_types directive is enabled.
Return Values
Examples
Example #1 echo examples
echo «echo does not require parentheses.» ;
?php
// Strings can either be passed individually as multiple arguments or
// concatenated together and passed as a single argument
echo ‘This ‘ , ‘string ‘ , ‘was ‘ , ‘made ‘ , ‘with multiple parameters.’ , «\n» ;
echo ‘This ‘ . ‘string ‘ . ‘was ‘ . ‘made ‘ . ‘with concatenation.’ . «\n» ;
// No newline or space is added; the below outputs «helloworld» all on one line
echo «hello» ;
echo «world» ;
// Same as above
echo «hello» , «world» ;
echo «This string spans
multiple lines. The newlines will be
output as well» ;
echo «This string spans\nmultiple lines. The newlines will be\noutput as well.» ;
// The argument can be any expression which produces a string
$foo = «example» ;
echo «foo is $foo » ; // foo is example
$fruits = [ «lemon» , «orange» , «banana» ];
echo implode ( » and » , $fruits ); // lemon and orange and banana
// Non-string expressions are coerced to string, even if declare(strict_types=1) is used
echo 6 * 7 ; // 42
// Because echo does not behave as an expression, the following code is invalid.
( $some_var ) ? echo ‘true’ : echo ‘false’ ;
// However, the following examples will work:
( $some_var ) ? print ‘true’ : print ‘false’ ; // print is also a construct, but
// it is a valid expression, returning 1,
// so it may be used in this context.
echo $some_var ? ‘true’ : ‘false’ ; // evaluating the expression first and passing it to echo
?>
Notes
Note: Because this is a language construct and not a function, it cannot be called using variable functions, or named arguments.
Note: Using with parentheses
Surrounding a single argument to echo with parentheses will not raise a syntax error, and produces syntax which looks like a normal function call. However, this can be misleading, because the parentheses are actually part of the expression being output, not part of the echo syntax itself.
echo( «hello» );
// also outputs «hello», because («hello») is a valid expression
echo( 1 + 2 ) * 3 ;
// outputs «9»; the parentheses cause 1+2 to be evaluated first, then 3*3
// the echo statement sees the whole expression as one argument
echo «hello» , » world» ;
// outputs «hello world»
echo( «hello» ), ( » world» );
// outputs «hello world»; the parentheses are part of each expression
echo( «hello» , » world» );
// Throws a Parse Error because («hello», » world») is not a valid expression
?>
Passing multiple arguments to echo can avoid complications arising from the precedence of the concatenation operator in PHP. For instance, the concatenation operator has higher precedence than the ternary operator, and prior to PHP 8.0.0 had the same precedence as addition and subtraction:
// Below, the expression ‘Hello ‘ . isset($name) is evaluated first,
// and is always true, so the argument to echo is always $name
echo ‘Hello ‘ . isset( $name ) ? $name : ‘John Doe’ . ‘!’ ;
?php
// The intended behaviour requires additional parentheses
echo ‘Hello ‘ . (isset( $name ) ? $name : ‘John Doe’ ) . ‘!’ ;
// In PHP prior to 8.0.0, the below outputs «2», rather than «Sum: 3»
echo ‘Sum: ‘ . 1 + 2 ;
// Again, adding parentheses ensures the intended order of evaluation
echo ‘Sum: ‘ . ( 1 + 2 );
If multiple arguments are passed in, then parentheses will not be required to enforce precedence, because each expression is separate:
echo «Hello » , isset( $name ) ? $name : «John Doe» , «!» ;
?php
PHP echo and print Statements
With PHP, there are two basic ways to get output: echo and print .
In this tutorial we use echo or print in almost every example. So, this chapter contains a little more info about those two output statements.
PHP echo and print Statements
echo and print are more or less the same. They are both used to output data to the screen.
The differences are small: echo has no return value while print has a return value of 1 so it can be used in expressions. echo can take multiple parameters (although such usage is rare) while print can take one argument. echo is marginally faster than print .
The PHP echo Statement
The echo statement can be used with or without parentheses: echo or echo() .
Display Text
The following example shows how to output text with the echo command (notice that the text can contain HTML markup):
Example
echo «
PHP is Fun!
«;
echo «Hello world!
«;
echo «I’m about to learn PHP!
«;
echo «This «, «string «, «was «, «made «, «with multiple parameters.»;
?>?php
Display Variables
The following example shows how to output text and variables with the echo statement:
Example
echo «
» . $txt1 . «
«;
echo «Study PHP at » . $txt2 . «
«;
echo $x + $y;
?>
The PHP print Statement
The print statement can be used with or without parentheses: print or print() .
Display Text
The following example shows how to output text with the print command (notice that the text can contain HTML markup):
Example
print «
PHP is Fun!
«;
print «Hello world!
«;
print «I’m about to learn PHP!»;
?>?php
Display Variables
The following example shows how to output text and variables with the print statement: