欢迎大家访问我自己架的博客站点 码厩技术博客!

PHP:函数的引用返回

遇到函数声明时前面加引用符号的情况。
调用函数时加引用符号可以理解,就是声明的接受变量是一个引用嘛。
(实验证明,这是错的,说引用类型只能赋值给变量。What?不知所云,求指教。)
可是函数声明就没有那么好理解了。
php.net 中的例子:
-----------------------------------------------
<?php
class foo {
    public $value = 42;
    public function &getValue() {
        return $this->value;
    }
}
$obj = new foo;
$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42.
$obj->value = 2;
echo $myValue; // prints the new value of $obj->value, i.e. 2.
?>
本例中 getValue 函数所返回的对象的属性将被赋值,而不是拷贝,就和没有用引用语法一样。
-----------------------------------------------
还是没太明白,试验先。
eg 1、普通的函数声明,然后引用接收。
[code]
function foo() {
    $var = 0;
    return $var;
}
$get = & foo();
var_dump($get);
$get = 5;
$get = & foo();
var_dump($get);
[/code]
结果:
Strict standards: Only variables should be assigned by reference
int 0
Strict standards: Only variables should be assigned by reference
int 0
eg 2、将上面例子中的函数声明成了引用返回。
[code]
function & foo() {
    $var = 0;
    return $var;
}
$get = foo();
var_dump($get);
$get = 5;
$get = foo();
var_dump($get);
结果:
int 0
int 0
和没有把函数声明成引用一样的效果。
eg 3、将上面例子中的函数声明成了引用返回。
[code]
function & foo() {
    static $var = 0;
    return $var;
}
$get = & foo();
var_dump($get);
$get = 5;
$get = & foo();
var_dump($get);
[/code]
结果:
int 0
int 5
eg 4、面向对象中引用返回的应用。
[code]
/**
* 试验辅类,用于试验主类属性ref的->操作。
*/
class Ex {
public $some;
    function __construct() {
        $this->some = 0;
    }
    public function set($v) {
        $this->some = $v;
    }
    public function get() {
        return $this->some;
    }
}
/**
* 试验主类
*/
class MyClass {
    public $ref;
    function __construct() {
        $this->ref = & foo();
    }
}
function & foo() {
    $var = new Ex;
    return $var;
}
$class = new MyClass();
$class->ref->set(5);
var_dump($class->ref->get());
[/code]
结果:
int 5
总结:
1、一般来说,函数返回就是返回一个值。
2、引用就是计算出变量的地址。
3、引用返回是把返回变量的引用返回来了。而且,返回引用的格式决定了两边都要用 & 声明。
    若只是在函数那边声明引用,那么返回结果将依然是赋值给接收变量。是不是就是返回一个变量拷贝呢?
    若只是在接收变量那边声明引用就会报错,因为函数(还是返回的值?)不能用 & 求地址。

转载于:https://www.cnblogs.com/catroll/archive/2011/12/07/return_ref.html

【PHP】函数的引用返回相关推荐

  1. C++ 函数的引用返回值

    C++ 函数的引用返回值 2009-09-17 09:29 引用是给变量取一个别名,所以引用传递会直接进行变量本身的传递.它的最大好处是可以把别处对变量的改变保留下来,第二好处是它提高了性能:如果函数 ...

  2. php function 返回值_PHP函数引用返回的实例详解

    引用返回 手册里是这么写的:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时.不要用返回引用来增加性能,引擎足够聪明来自己进行优化.仅在有合理的技术原因时才返回引用!要返回引用 当你想将函数 ...

  3. c++ 函数的值传递,引用传递 和 引用返回的探索

    2019独角兽企业重金招聘Python工程师标准>>> 前言 C++的函数参数和返回分为按值传递和按引用传递,应用到类上面,会涉及到类的 赋值操作 复制函数 构造函数 析构函数 虽然 ...

  4. python 返回函数对象_返回函数

    函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_sum(*args): ax = ...

  5. python函数里面引用外部变量_Python基础 变量进阶

    目标 变量的引用 可变和不可变类型 局部变量和全局变量 01. 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的 1.1 ...

  6. python函数参数学习_python学习笔记-11.函数参数和返回值进阶

    1. 函数参数和返回值的作用 函数根据有没有参数以及有没有返回值,可以相互组合,共有4种形式: 无参数,无返回值 无参数,有返回值 有参数,无返回值 有参数,有返回值 定义函数时,是否接收参数,或者是 ...

  7. 引用参数与引用返回值

    原帖地址:http://www.cnblogs.com/bigshow/archive/2008/11/10/1330514.html 经常看到这样的声明:T& func(T& t), ...

  8. 11_python基础—函数(引用、全局、局部变量)

    文章目录 目标 一. 变量的引用 1.1 引用的概念 1.2 `变量引用` 的示例 1.3 函数的参数和返回值的传递 二.局部变量和全局变量 2.1 局部变量 2.1.1 局部变量的作用 2.1.2 ...

  9. php函数传引用,关于php:函数调用通过引用传递?

    我在cas.module的第245行drupal CAS模块中看到了一些我并不完全理解的东西: $initialized = &drupal_static(__FUNCTION__, FALS ...

最新文章

  1. ES6中Generator理解
  2. 安装mysql为什么下载了很多_mysql下载与安装过程
  3. oracle 锁表如何查看_【赵强老师】第一个Oracle的手工备份和恢复
  4. B站直播中HLS和去中心化P2P的实际应用
  5. NAS服务器局域网内IPad、手机、电视盒子等联网播放
  6. LeetCode:Path Sum II
  7. python怎么启动mne_mne-python学习之一 入门介绍
  8. JAVA学习篇--Java类加载
  9. php文件改后缀,php 如何修改文件后缀
  10. 医院信息化建设,该何去何从?
  11. 惠普计算机怎样添加程序,小编教你惠普电脑如何进入bios设置
  12. H5页面跳转传递参数过长
  13. https网站请求下载http的资源会被拦截
  14. linux服务器搭建之路7-通过rdesktop远程连接win10
  15. 《网络营销推广技术、技巧深度解密》文档
  16. today study
  17. java jceks 密钥_Java中不同类型的密钥库(Keystore) – 概述
  18. 大型机/IBM大型机 简介
  19. 学计算机随堂笔记,随堂笔记 计算机网络原理 自考 自学考试 4741.doc
  20. maven下载jar包慢-解决详细

热门文章

  1. JZOJ 3852. 【NOIP2014八校联考第2场第2试9.28】单词接龙(words)
  2. android 代码加view,Android中将View添加至窗口的源码分析
  3. linux查看网卡传输,Linux下查看网卡实时流量工具
  4. android 自定义打包,android 自定义打包后的app名称
  5. 2021.02.02 Visual QA论文阅读
  6. python绘制表格界面_python 读取 excel 生成 html 页面
  7. mysql删除以什么开头的数据_Mysql如何删除以“#sql-”开头的临时表
  8. 深入理解JVM(8)——类加载的时机
  9. 后端时间转js时间,主要用于取倒计时
  10. 网页设计界面 电脑版设计