<?php
$instance = new StdClass;//自定义一个类
$assigned = $instance; //在php5中,这种写法作用和下面一样,而不用传&,但还是有区别滴。。。
$reference =& $instance; //作用是和上面相同,但本质还是不同的,$reference是个引用,他会跟着$instance共存亡
$instance->var = '$assigned will have this value';
var_dump($instance); //
var_dump($reference); //
var_dump($assigned); //以上三者都一样!不管赋值还是其他改变
$instance = null; // $instance and $reference become null
var_dump($instance); //他也不在了
var_dump($reference); //他已经不在了
var_dump($assigned); //他还在
?> |
在PHP5手册中:
类与对象一章里:
当把一个对象已经创建的实例赋给一个新变量时,新变量会访问同一个实例,就和用该对象赋值一样。此行为和给函数传递入实例时一样。
但是把该对象的引用,赋值给一个变量,确实是用的引用
————————————–
中文手册:
对象和引用
在php5 的对象编程经常提到的一个关键点是“默认情况下对象是通过引用传递的”。但其实这不是完全正确的。下面通过一些例子来说明。
php的引用是别名,就是两个不同的变量名字指向相同的内容。
在php5,一个对象变量已经不再保存整个对象的值。只是保存一个标识符来访问真正的对象内容。
当对象作为参数传递,作为结果返回,
或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个标识符指向同一个对象的真正内容。
自 PHP 5 起,new 自动返回引用,因此在此使用 =& 已经过时了并且会产生 E_STRICT 级别的消息。
这句话很别扭
—————————————
<?php
$a = 1;
$b =& $a;
unset($a); //如果把 $a=null ,下面的结果就不一样了
var_dump($a); //a 已经不在了
var_dump($b); //b还在
?> |
函数的引用返回:
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 |
$this self
$this
在一个对象的方法中,$this 永远是调用它的对象的引用。
self:
有点静态调用的意思:
class clsParent {
static public function say( $str ) {
self::do_print($str);//如果这里用$this->do_print($str); 会报没有这个实例的
}
static public function do_print( $str ) {
echo "parent says $str";
}
}
class clsChild extends clsParent{
static public function do_print( $str ) {
echo "child says $str";
}
}
clsChild::say('Hello');
?> |
其他:
//下面再来个小插曲
php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。
通俗的讲
1:如果有下面的代码
$a=”ABC”;
$b=$a;
其实此时$a与$b都是指向同一内存地址而并不是$a与$b占用不同的内存
2:如果在上面的代码基础上再加上如下代码
$a=”EFG”;
由于$a与$b所指向的内存的数据要重新写一次了,此时Zend核心会自动判断自动为$b生产一个$a的数据拷贝,重新申请一块内存进行存储
静态调用:
<?php
class A
{
function foo()
{
if (isset($this)) {
echo '$this is defined (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this is not defined.\n";
}
}
}
class B
{
function bar()
{
A::foo();
}
}
$a = new A();
$a->foo();
A::foo();//直接静态调用,而不用方法是不是静态方法 ,这样用有时是大有好处的
$b = new B();
$b->bar();
B::bar();
?> |
类静态调用的好处:http://heshun.org/?p=178