商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > php引用是什么,php引用是什么

php引用是什么,php引用是什么

  发布于2026-07-21 阅读(0)

扫一扫,手机访问

聊到PHP里的引用,其实核心就一句话:不同的名字,访问的是同一个变量内容。这跟C语言里的指针可不一样——指针存的是变量在内存中的地址,而PHP的引用,更接近“别名”的概念。

变量的引用

先看一个最直观的例子,通过这种方式,两个变量指向同一块“内存空间”:


看到了吗?当$b发生变化时,$a也跟着变了。用&符号,就把两个变量“绑定”在了一起。

函数的引用传递(传址调用)

传址调用的写法也很直接。函数参数前加个&,表示接收的是变量的地址,而不是值拷贝:

";
echo $b; // 输出101
?>

注意一个细节:调用test($b)时,$b前面不需要加&。但在call_user_func_array这种函数里,如果要传址,就必须显式加&了:


函数的引用返回

函数的引用返回稍微绕一点。看下面这段代码,注意函数声明时加了&:


怎么理解?通过$a = test()这种写法,得到的并不是函数的引用返回——它跟普通函数调用没区别。PHP规定,只有通过$a = &test()这种方式,才能拿到函数的引用返回。引用返回的作用,按手册的说法,是“当想用函数找到引用应该被绑定在哪一个变量上面时”。说白了,就是让函数返回的变量,能跟外部变量建立持久绑定。

对象的引用

PHP5以后,对象的赋值默认就是引用过程。看这个例子:

abc; // 输出ABC
echo $c->abc; // 输出ABC
$b->abc = "DEF";
echo $c->abc; // 输出DEF
?>

这里$c = $b,其实等效于$c = &$b。PHP5中,new自动返回引用,所以用&已经过时了,还会产生E_STRICT级别的警告。如果确实想创建一个对象的副本,让副本不受原对象影响,PHP5提供了__clone方法。

回忆一下PHP4时代,那时候对象的赋值是拷贝过程。比如$b = new a,new a产生一个匿名对象实例,$b是对它的拷贝。$c = $b又是对$b的拷贝。为了省内存,通常写成$b = &new a。PHP5之后,这一切都简化了。

最后看一个官方示例,完整展示了对象引用在各种场景下的行为:

name = $str;
    }
    function __toString(){
        return 'my name is "' . $this->name . '" and I live in "' . __CLASS__ . '".' . "\n";
    }
    function setName($str){
        $this->name = $str;
    }
}

class MasterOne{
    protected $foo;
    function __construct($f){
        $this->foo = $f;
    }
    function __toString(){
        return 'Master: ' . __CLASS__ . ' | foo: ' . $this->foo . "\n";
    }
    function setFooName($str){
        $this->foo->setName( $str );
    }
}

class MasterTwo{
    protected $foo;
    function __construct($f){
        $this->foo = $f;
    }
    function __toString(){
        return 'Master: ' . __CLASS__ . ' | foo: ' . $this->foo . "\n";
    }
    function setFooName($str){
        $this->foo->setName( $str );
    }
}

$bar = new foo('bar');
print("\n");
print("Only Created \$bar and printing \$bar\n");
print( $bar );
print("\n");
print("Now \$baz is referenced to \$bar and printing \$bar and \$baz\n");
$baz = & $bar;
print( $bar );
print("\n");
print("Now Creating MasterOne and Two and passing \$bar to both constructors\n");
$m1 = new MasterOne( $bar );
$m2 = new MasterTwo( $bar );
print( $m1 );
print( $m2 );
print("\n");
print("Now changing value of \$bar and printing \$bar and \$baz\n");
$bar->setName('baz');
print( $bar );
print( $baz );
print("\n");
print("Now printing again MasterOne and Two\n");
print( $m1 );
print( $m2 );
print("\n");
print("Now changing MasterTwo's foo name and printing again MasterOne and Two\n");
$m2->setFooName( 'MasterTwo\'s Foo' );
print( $m1 );
print( $m2 );
print("Also printing \$bar and \$baz\n");
print( $bar );
print( $baz );
?>

这个例子展示了:当$bar通过引用传递给MasterOne和MasterTwo的构造函数后,无论通过哪个对象修改foo的name,所有持有同一引用的对象都会感知到变化。这就是PHP引用在对象传递中的核心表现——共享,而非复制。

本文转载于:https://blog.csdn.net/weixin_39770506/article/details/116105182 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注