【php手册:类与对象】对象和引用

7人阅读 评论(0) 收藏 举报
分类:

对象和引用

PHP 的引用是别名,就是两个不同的变量名字指向相同的内容。
在 PHP 5,一个对象变量已经不再保存整个对象的值。只是保存一个标识符来访问真正的对象内容。 当对象作为参数传递,作为结果返回,或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个标识符指向同一个对象的真正内容。

Example #1 引用和对象

<?php
class A {
    public $foo = 1;
}  

$a = new A;
$b = $a;     // $a ,$b都是同一个标识符的拷贝
             // ($a) = ($b) = <id>
$b->foo = 2;
echo $a->foo."\n";


$c = new A;
$d = &$c;    // $c ,$d是引用
             // ($c,$d) = <id>

$d->foo = 2;
echo $c->foo."\n";


$e = new A;

function foo($obj) {
    // ($obj) = ($e) = <id>
    $obj->foo = 2;
}

foo($e);
echo $e->foo."\n";

?>

User Contributed Notes

/*
Notes on reference:
A reference is not a pointer. However, an object handle IS a pointer. Example:
*/

<?php
class Foo {
  private static $used;
  private $id;
  public function __construct() {
    $id = $used++;
  }
  public function __clone() {
    $id = $used++;
  }
}

$a = new Foo; // $a is a pointer pointing to Foo object 0
$b = $a; // $b is a pointer pointing to Foo object 0, however, $b is a copy of $a
$c = &$a; // $c and $a are now references of a pointer pointing to Foo object 0
$a = new Foo; // $a and $c are now references of a pointer pointing to Foo object 1, $b is still a pointer pointing to Foo object 0
unset($a); // A reference with reference count 1 is automatically converted back to a value. Now $c is a pointer to Foo object 1
$a = &$b; // $a and $b are now references of a pointer pointing to Foo object 0
$a = NULL; // $a and $b now become a reference to NULL. Foo object 0 can be garbage collected now
unset($b); // $b no longer exists and $a is now NULL
$a = clone $c; // $a is now a pointer to Foo object 2, $c remains a pointer to Foo object 1
unset($c); // Foo object 1 can be garbage collected now.
$c = $a; // $c and $a are pointers pointing to Foo object 2
unset($a); // Foo object 2 is still pointed by $c
$a = &$c; // Foo object 2 has 1 pointers pointing to it only, that pointer has 2 references: $a and $c;
const ABC = TRUE;
if(ABC) {
  $a = NULL; // Foo object 2 can be garbage collected now because $a and $c are now a reference to the same NULL value
} else {
  unset($a); // Foo object 2 is still pointed to $c
}

<?php

//The two are meant to be the same
$a = "Clark Kent"; //a==Clark Kent
$b = &$a; //The two will now share the same fate.

$b="Superman"; // $a=="Superman" too.
echo $a; 
echo $a="Clark Kent"; // $b=="Clark Kent" too.
unset($b); // $b divorced from $a
$b="Bizarro";
echo $a; // $a=="Clark Kent" still, since $b is a free agent pointer now.

//The two are NOT meant to be the same.
$c="King";
$d="Pretender to the Throne";
echo $c."\n"; // $c=="King"
echo $d."\n"; // $d=="Pretender to the Throne"
swapByValue($c, $d);
echo $c."\n"; // $c=="King"
echo $d."\n"; // $d=="Pretender to the Throne"
swapByRef($c, $d);
echo $c."\n"; // $c=="Pretender to the Throne"
echo $d."\n"; // $d=="King"

function swapByValue($x, $y){
$temp=$x;
$x=$y;
$y=$temp;
//All this beautiful work will disappear
//because it was done on COPIES of pointers.
//The originals pointers still point as they did.
}

function swapByRef(&$x, &$y){
$temp=$x;
$x=$y;
$y=$temp;
//Note the parameter list: now we switched 'em REAL good.
}

?>
查看评论

PHP面向对象编程详解:类和对象

PHP面向对象编程详解:类和对象 从OOP的视角看,不应区分语言。无论是C++、无论是Java、无论是.net还有更多面向对象的语言,只要你了解了OO的真谛,便可以跨越语言,让你的思...
  • hello_katty
  • hello_katty
  • 2015-06-17 07:40:24
  • 2847

php面向对象——类和对象

php面向对象——类和对象1.类和对象
  • GentleManStyle
  • GentleManStyle
  • 2016-04-20 20:43:07
  • 2154

PHP之有关类和对象的系统函数与运算符

系统函数class_exists() 判断某个类是否存在 interface_exists() 判断接口是否存在 get_class() 获取某个对象所处的类名 get_parent_class...
  • xuandaijian
  • xuandaijian
  • 2016-02-29 21:26:06
  • 658

【php手册:类与对象】对象继承

Note: 除非使用了自动加载,否则一个类必须在使用之前被定义。如果一个类扩展了另一个,则父类必须在子类之前被声明。此规则适用于类继承其它类与接口。 Example #1 继承示例 &amp;l...
  • qq_39251267
  • qq_39251267
  • 2018-03-19 14:40:08
  • 11

【php手册:类与对象】遍历对象

遍历对象 PHP 5 提供了一种定义对象的方法使其可以通过单元列表来遍历 默认情况下,所有可见属性都将被用于遍历。 Example #1 简单的对象遍历(foreach 遍历所有其能够访问的...
  • qq_39251267
  • qq_39251267
  • 2018-04-13 16:12:02
  • 12

C++_类与对象

一、概述 1.面向对象程序设计的基本特点:抽象、封装、继承、多态; 2.C++中类的概念,是进行面向对象程序设计的基础,在面向对象程序设计中占据着核心地位,它把数据和作用在这些数据上的操作组合在一起,...
  • GSH_Hello_World
  • GSH_Hello_World
  • 2016-10-24 11:28:28
  • 761

类与对象的概念

第4章 类 与 对 象4.1类与对象的概念4.2封装机制4.3数据成员4.4成员方法第4章 类 与 对 象4.1类与对象的概念程序设计所面对的问题域——客观世界,是由许多事物构成的,这些事物既可以是有...
  • luozhuang
  • luozhuang
  • 2008-04-27 19:29:00
  • 8288

PHP的类和对象(四)访问控制和继承

访问控制   对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问。被定义为...
  • L1837435964
  • L1837435964
  • 2016-09-29 14:45:16
  • 163

第五讲:类的成员、对象成员的引用

第五讲:类的成员、对象成员的引用     掌握:类成员函数的性质、定义及存贮方式。对象成员三种引用方式,。     理解:类函数、作用域运算符、inline成员函数的概念。     重点、难点:...
  • L_cpp
  • L_cpp
  • 2016-09-08 14:04:31
  • 539

C++中类与对象的讲解(通俗易懂)

概念 描述 类成员函数 类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。 类访问修饰符 类成员可以被定义为 public、private 或 pro...
  • songkai320
  • songkai320
  • 2016-07-14 20:09:45
  • 15669
    个人资料
    持之以恒
    等级:
    访问量: 7827
    积分: 1093
    排名: 4万+
    文章存档