Home Backend Development PHP Tutorial What is a php 'reference return'?

What is a php 'reference return'?

Jun 27, 2017 pm 01:52 PM
php What Reference return

Many times we will see code like this (from the CI framework source code):

$class =& load_class('a','b');
Copy after login

We all know that the '&' in it refers to a reference, but what is its role? What kind of problems can it solve? With these questions, we begin to understand "reference return".

Reference return

The manual says this: Reference return is used when you want to use a function to find which variable the reference should be bound to. Don't use return references to increase performance, the engine is smart enough to optimize it itself. Only return references if there is a valid technical reason! To return a reference, use this syntax:

<?php
class foo {
    public $value = 42;
    public function &getValue() {
        return $this->value;
    }
}
$obj = new foo;
// $myValue is a reference to $obj->value, which is 42.
// $myValue 是 $obj->value 的引用,它们的值都是 42
$myValue = &$obj->getValue(); 
// 对 $obj->value 重新复制,会影响到 $myValue 的值
$obj->value = 2;
// prints the new value of $obj->value, i.e. 2.
echo $myValue; // 程序输出 2
?>
Copy after login

In this example the properties of the object returned by the getValue() function will be assigned a value, not copied, just as if the reference syntax was not used.

Different from parameter passing, the & symbol must be used in both places here - indicating that a reference is returned, not a usual copy, and also indicating that $myValue is bound as a reference, and Not an ordinary assignment.

If you try to return a reference from a function like this: return ($this->value);, this will not work because you are trying to return the result of an expression instead of one referenced variable. You can only return reference variables from functions - there is no other way. If code attempts to return the result of a dynamic expression or new operator, an E_NOTICE error will be issued starting with PHP 4.4.0 and PHP 5.1.0.

Although you don’t understand? So let’s rewrite the program and make it a regular function:

<?php
class foo {
    public $value = 42;
    public function getValue() {
        return $this->value;
    }
}
$obj = new foo;
$myValue = $obj->getValue(); 
$obj->value = 2;
echo $obj->value;  // 程序输出 2
echo $myValue; // 程序输出 42
?>
Copy after login

Now we can understand that "reference return is used when you want to use a function to find which variable the reference should be bound to." In a word, the function &getValue() binds the reference to the member variable $value. Normally, the $obj generated by $obj = new foo; is a copy, and its member variable $value does not have an "alias" (reference) relationship with the function getValue().

Look at the simple example below and try to understand reference return.

<?php
function &test()
{
// 声明一个静态变量
    static $b = 0;
    $b = $b+1;
    echo $b;
    return $b;
}
$a = test();//这条语句会输出 $b 的值为 1
$a = 5;
$a = test();//这条语句会输出 $b 的值为2
$a = &test();//这条语句会输出 $b 的值为3
$a = 5;
$a = test();//这条语句会输出 $b的值 为6
?>
Copy after login

Program running result: 1236

Using the above example to explain, $a = test() calls a function in this way, just assigning the value of the function to $a, and Any changes to $a will not affect $b in the function.

When calling a function through $a = &test(), its function is to point the memory address of the $b variable in return $b to the same place as the memory address of the $a variable. That is to say, the effect is equivalent to ($a=&$b), so changing the value of $a also changes the value of $b. So after executing

$a = &test();    
$a = 5;
Copy after login

, the value of $b becomes 5.

Let’s take another program example to deepen our understanding:

<?php
/*
** 值传递和引用传递,值传递传递的是值的一个复本,引用传递传递的是值指向的内存地址
*/
// 函数的引用,定义时也要加上 &
function &func($a,$b){ 
// 这里为了更直观看到效果,定义一个静态变量
static $result = 0;  
$result+=$a+$b;
echo $result.&#39;<br />&#39;;
return $result;
}
 
$a = $b = 10;
// PHP里这样写函数的引用调用,和调用普通函数没有区别(只是将函数的返回值复制给$c这个变量,$c做任何改变不会影响上面函数中的$result)
// 要记住:PHP里的函数引用定义及调用都要在函数名前加上 &
$c = func($a,$b); 
// 第一次执行func(),其静态变量$result的值变为 20(10+10)
// 改变$c的值,不会对下面一行语句产生影响
$c = 666;  
// 第二次执行func(),其静态变量$result的值变为 40(20+10+10)
$c = func($a,$b);
echo &#39;<hr />&#39;;
// 这样才是PHP中引用函数的调用方式
$d = &func($a,$b);  
// 第三次执行func(),其静态变量$result的值变为 40(40+10+10)
$d = 888;
// 第四次执行func(),其静态变量$result的值变为 908(888+10+10)
$d = func($a,$b);
?>
Copy after login

The above is the detailed content of What is a php 'reference return'?. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

7 PHP Functions I Regret I Didn't Know Before 7 PHP Functions I Regret I Didn't Know Before Nov 13, 2024 am 09:42 AM

If you are an experienced PHP developer, you might have the feeling that you’ve been there and done that already.You have developed a significant number of applications, debugged millions of lines of code, and tweaked a bunch of scripts to achieve op

How To Set Up Visual Studio Code (VS Code) for PHP Development How To Set Up Visual Studio Code (VS Code) for PHP Development Dec 20, 2024 am 11:31 AM

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Apr 05, 2025 am 12:04 AM

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

PHP Program to Count Vowels in a String PHP Program to Count Vowels in a String Feb 07, 2025 pm 12:12 PM

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

How do you parse and process HTML/XML in PHP? How do you parse and process HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

Explain late static binding in PHP (static::). Explain late static binding in PHP (static::). Apr 03, 2025 am 12:04 AM

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? Apr 03, 2025 am 12:03 AM

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.

See all articles