您的位置:首页 > 编程语言 > PHP开发

PHP面向对象3-引用&

2017-06-10 17:39 405 查看
PHP中,可以引用的有变量,函数,对象。引用符号统一用&。

引用,实际上就是用不同的名字访问同一个变量内容。引用不是指针,不指向实际的内存。

PHP中的引用并不是通常意义的引用,并不是指针,就行PHP中的重载并不是真正的重载一样!!!

链接:http://php.net/manual/zh/language.references.php

1.变量引用

指多个变量名指向同一个变量,每次改动都影响其他指向此位置的变量。

$a = 3;
$b = & $a; //此时$b和$a指向同一块内存
$b = 4;	//对$b的重新赋值,也会影响$a
echo $a; //$a值变为4


变量引用的一个常见用法是引用传递,将实参的引用传到方法中,从而实现在方法中改变原数据。

注意在函数调用时没有引用符号——只有函数定义中有。

$a = 3;
f($a); //此时只能传变量名,如果传整形或字符串等数据,会报错
function f(& $param) { //此处取了实参的引用
$param++;
}
echo $a; //$a值变为4


2.函数的引用返回

当函数有返回值时,可以通过函数引用的形式,在函数外部更改函数的返回值。可以认为是将函数返回值所占用的内存引用传递给函数外部的变量,使两个变量表示同一块内存

函数的引用返回,就是将函数的返回值当做引用。

function & f() {    //方法定义时,方法名前加&表示该方法可以被引用
static $a = 3;
echo $a++;
return $a;
}

$b = &f();	//引用该函数,并将函数返回值和$b指向同一个变量
echo $b;
$b = $b + 100;   //此时同时改变函数返回值$a
f();        //本行打印104
上例打印出:34104


$a = f();
改变
$a
并不会影响函数
f()
的返回值,但是
$a = &f();
在改变
$a
时同时影响函数
f()
的返回值。

3.对象引用

PHP中,对象的复制默认就是通过引用传递来实现,
$o2 = $o1
执行时,实际就是将
$o1
的引用复制给
$o2
,两个对象实际上是同一个。

对象复制

参考:http://php.net/manual/zh/language.oop5.cloning.php

如果我们想创建对象的副本,需要使用clone关键字(这将调用对象的
__clone()
方法)。对象中的
__clone()
方法不能被直接调用。

//两种写法都可以
$copy_of_object = clone $object;
$copy_of_object = clone($object);


当用 clone 复制对象后,PHP 5 会对对象的所有属性执行一个浅复制(shallow copy)。所有的基本属性会复制到新的存储空间,但是引用属性仍然会是一个指向原来的变量的引用。可以在要复制的对象中自定义
__clone()
方法,复制对象完成后会自动调用
__clone()
方法,可用于修改属性的值。

<?php
class SubObject
{
static $instances = 0;
public $instance;

public function __construct() {
$this->instance = ++self::$instances;
}

public function __clone() {
$this->instance = ++self::$instances;
}
}

class MyCloneable
{
public $object1;
public $object2;

function __clone()
{

// 强制复制一份this->object, 否则仍然指向同一个对象
$this->object1 = clone $this->object1;
}
}

$obj = new MyCloneable();

$obj->object1 = new SubObject();
$obj->object2 = new SubObject();

$obj2 = clone $obj;

print("Original Object:\n");
print_r($obj);

print("Cloned Object:\n");
print_r($obj2);

?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: