PHP参考()各种使用方法的详细解决方案
1的参考文献。变量
PHP的引用允许您指向具有两个变量的相同内容。
复制代码代码如下:<
$ =abc;
美元=美元;
$;
$
$ =EFG;
回声$ / /;这里的价值为一个输出EFG EFG
echo $ B; / / EFG输出在这里
>
参考转让2。函数(地址调用)
关于下面的代码,我没怎么说。
复制代码代码如下:< PHP
功能测试(a)
{
$ = $ A + 100;
}
B = 1美元;
1
测试(b);在这里传递给函数的B是变量B内容的内存地址,您可以通过改变函数中的$值来改变b的值。
;
101
>
重要的是要注意,在这里的测试(1);单词会出错,为什么你认为。
注:以上测试($)和$ B在前面不加符号,但在功能call_user_func_array,如果你想引用的参考,你需要的符号。
复制代码代码如下:< PHP
函数A($ b){
美元+;
}
$=0;
call_user_func_array('a',阵列($ C));
回声$;
1 输出
>
3个参考文献。函数返回
先看代码
复制代码代码如下:< PHP
功能测试()
{
静态$ = 0;声明静态变量
美元= $ + 1;
回声$;
返回$;
}
($ = test);此语句将输出$为1的值。
$ = 5;
($ = test);此语句将输出$为2的值。
($ = test);此语句将输出$为3的值。
$ = 5;
($ = test);此语句将输出$为6的值。
>
在下面的解释下:
通过这种方式,从函数中返回的$()=测试()与普通函数调用不同。原因是:这是PHP的规则。
PHP指定对函数的引用是通过$ =测试()返回的;
引用的返回值是什么(PHP手册说:当你想使用一个函数来寻找一个应该绑定到变量的引用时,引用返回)。
上面的例子解释了这一点。
函数的作用是:将函数的值赋值给$,而$中的任何更改不影响函数中的$ B。
函数通过$ =测试()调用。它的功能是将$ B变量的内存地址放在返回$ B中,并将$变量的内存地址放在同一位置。
这相当于这个效果($ A = $ B),因此更改$的值也会更改$的值,以便执行它。
$ =测试();
$ = 5;
在此之后,B的值被更改为5。
这是让每个人理解函数的引用返回静态变量,并且函数的引用实际返回到对象。
PHP官方的另一个例子:
复制代码如下:这是我们如何使用指针访问内部变量的方式。
< PHP
类人{
私人$data = '嗨';
公共函数获取(){
返回$ >数据;
}
公共函数输出(){
回波数据;
}
}
元=新的健谈者();
$ $ =;
();
美元D =;
();
美元D =;
();
美元D =;
();
>
hihowareyou / / 输出
参考4。物体
复制代码代码如下:< PHP
类{
var;
}
美元=新的;
美元=美元;
在这里输入输出
在这里输入输出
$;
在这里输出
>
上面的代码是在PHP5中的运行效果
在PHP5的对象分配是一个过程的参考。以上$ =新;$c = $;事实上,它相当于$ =新;$c = $;
在PHP5中,默认的是调用对象的引用,但有时你可能需要创建一个对象的副本,并希望原始对象的变化不影响副本。为此,PHP5定义了一种特殊的方法称为__clone。
在PHP 5中,新的自动返回引用,所以我们使用=过时,会有一个水平的e_strict新闻。
在PHP4中,一个对象的分配是一个复制的过程。
例如:$ =新一,新一产生一个匿名的一个对象实例,而$此时是一份匿名对象。同为C = $ B也是一份$ B的内容。所以在PHP4,为了节省内存空间,为B =新的一般改为参考,这是模式,B =新的美元
这是另一个官方例子:
在PHP5中,你不需要添加任何额外的对象引用的函数:
复制代码代码如下:< PHP
类Foo {
受保护的$名称;
功能__construct($str){
此$ = name;
}
功能__tostring(){
return'my叫。这个名字,我住在。__class__。。。;
}
功能集名称($str){
此$ = name;
}
}
类masterone {
保护$;
功能__construct($){
$;
}
功能__tostring(){
返回主控:__class__ Foo:'。|。$。;
}
功能setfooname($str){
美元-> foo -> setName($str);
}
}
类mastertwo {
保护$;
功能__construct($){
$;
}
功能__tostring(){
返回主控:__class__ Foo:'。|。$。;
}
功能setfooname($str){
美元-> foo -> setName($str);
}
}
酒吧= foo('bar美元新的);
打印();
打印()仅创建$条和打印条;
打印($ bar);
打印();
打印(现在 $巴兹是参照 $酒吧和印刷 美元美元栏和巴兹;
巴兹=美元美元吧;
打印($ bar);
打印();
打印(现在创建masterone两通 $条建设者;
M1 =新masterone美元(美元吧);
M2 =新mastertwo美元(美元吧);
印刷(M1);
印刷(M2);
打印();
打印(现在变化值 $酒吧和印刷 美元美元栏和巴兹;
$吧-> setName('baz);
打印($ bar);
打印($ Baz);
打印();
打印(现在打印一次MasterOne和两;
印刷(M1);
印刷(M2);
打印();
打印(现在改变MasterTwo Foo名称和打印一次MasterOne和两;
$ M2 -> setfooname('mastertwo 的foo);
印刷(M1);
印刷(M2);
打印(印刷 美元美元栏和巴兹;
打印($ bar);
打印($ Baz);
>
输出:
复制代码如下:只创建$ bar和打印$ bar
我的名字是酒吧,我住在。
现在售价巴兹是参照美元美元美元的酒吧和酒吧巴兹印刷
我的名字是酒吧,我住在。
现在Creating MasterOne和两美元及格栏的建设者
师父:masterone foo:我的名字|是酒吧和我生活foo。
师父:mastertwo foo:我的名字|是酒吧和我生活foo。
现在改变酒吧,酒吧和印刷美元美元美元巴兹价值
我的名字是巴兹和我住在foo。
我的名字是巴兹和我住在foo。
现在打印一次MasterOne和两
师父:masterone foo:我的名字|是foo 巴兹和我生活。
师父:mastertwo foo:我的名字|是foo 巴兹和我生活。
现在改变MasterTwo的名字和打印一次MasterOne和foo两
师父:masterone foo:我的名字是|mastertwo的Foo和我住在foo。
师父:mastertwo foo:我的名字是|mastertwo的Foo和我住在foo。
印刷美元美元栏和巴兹
我的名字是mastertwo的Foo和我住在foo。
我的名字是mastertwo的Foo和我住在foo。
最后一个例子是解析。
复制代码代码如下:$吧=新foo('bar);
M1 =新masterone美元(美元吧);
M2 =新mastertwo美元(美元吧);
实例对象为M1和M2美元美元美元的酒吧是酒吧而不是复制实例的引用,这是在PHP5中,对象引用,是特色,说
在1。M1或m2中,$ bar上的任何操作都会影响外部对象实例$ bar的相关值。
2中的变化。外部对象实例$ bar还会影响$ $和m2中的$ bar的引用相关值。
在PHP4中,等效的代码(即参考调用)是类似的:当一个对象实例作为另一个对象的上述属性,相应的代码(参考电话)如下:
复制代码代码如下:类{ {
值栏;
功能setbar($ newbar){
美元->吧= newbar;
}
}
5。参考作用
如果程序比较大,参考相同的对象变量越多,希望把对象用完后手动删除它,
6。消除基准
当你设置一个参考,你断开的变量名和变量的内容之间的结合。这并不意味着该变量的内容被破坏。例如:
复制代码代码如下所示:
< PHP
$ = 1;
美元=美元;
unset(美元);
>
没有设置$,$ A.
7.global参考
当一个变量用全局var声明时,实际上建立了一个对全局变量的引用,也就是说,做同样的事情:
< PHP
美元美元= { =VAR VAR};
>
这意味着,例如,设置变量没有设置为全局变量。
如果你给一个引用全局变量在函数声明中,在引用函数是唯一可见的里面。你可以使用全局数组避免美元。
示例引用函数中的全局变量。
复制代码代码如下:< PHP
$ var1 =实例变量;
= $var2;
功能global_references($ use_globals)
{
全球美元美元var1,var2;
如果(!use_globals美元){
美元美元var2 = / /可见var1;只有在函数
{人}
$全局{VAR2} var1 = $ / /;也可见全球语境
}
}
global_references(假);
回声VAR2设置为' $ VAR2设置为; / / VAR2
global_references(真的);
回声VAR2设置为' $ VAR2设置to'example VAR2; / /变量
>
美元作为全球风险;var = = {美元美元'var};所以,其他参考文献中给出的美元VaR只是改变局部变量的引用。
8美元这个
在一个对象的方法中,$始终是调用它的对象的引用。
在一个小插曲下面再次出现
指向PHP地址(类似指针)功能不是由用户自己来实现的,是Zend核心实现,PHP参考使用原则写时复制,除非有一个写操作,指向同一个地址的变量和对象不会被复制。
一个通俗的讲
1:如果有以下代码
{代码< <
$ =abc;
美元=美元;
>
事实上,a $和b都指向同一内存地址,而不是$ A和$ B。
2:如果在代码顶部添加以下代码
复制代码代码如下:< PHP
$ =EFG;
>
因为美元美元和B点需要再写的内存数据,Zend芯自动确定它自动产生一份数据美元$,并恢复一段记忆存储。
PHP的引入是一个高层次的话题,它是向变量、函数和对象添加符号。新手应该多加注意。正确理解PHP引用是非常重要的,对性能有很大的影响。此外,理解错误可能导致程序错误。
许多人错误地认为在PHP中的引用作为指针在C不是一样其实很不同。C语言中数组除在转移过程中没有显式声明的指针,则需要使用*的定义,并指出PHP地址(类似指针)功能不用户自己来实现的,是Zend核心实现,PHP参考使用原则写时拷贝。除非有一个写操作,指的是同一个对象或一个变量的地址不被复制,例如,下面的代码:
复制代码代码如下:$ a数组(A,C…n);
美元=美元;
如果程序只执行这里,$和$是相同的,但不喜欢C,美元和$占用不同的内存空间,而是指向相同的内存,这是PHP和C之间的区别,B =美元美元美元说,B不需要写至内存,Zend有助你实现参考,Zend将帮助你确定什么处理不处理什么时间的方式很聪明。
如果继续在后面写以下代码,添加一个函数,以引用的方式传递参数,并打印输出数组大小。
复制代码如下:功能printarray($ ARR) /参考
{
打印(计数($ ARR));
}
printarray(美元);
在上面的代码中,我们进口的美元到printarray阵列()函数的引用,和Zend引擎会认为printarray()可能会导致改变至当时,我们会自动生成一份$为B,和申请的内存来存储一次。这是书面的时间复制概念提到。
如果我们将上述代码更改为以下代码:
复制代码如下:功能printarray($ ARR) /价值转移
{
打印(计数($ ARR));
}
printarray(美元);
上面的代码通过美元价值直接printarray(),并没有在这个时候引用传递,所以没有写时复制。
您可以测试上述两行代码的执行效率,例如,在外部添加1000次循环以查看运行时间,结果将使您知道引用错误的使用将导致性能下降超过30%。
自理解:根据传递的值,它独立于函数中的参数,相当于局部变量的函数。根据地址(参考),它与函数中的参数有关,相当于全局变量的函数。从性能上看,上述分析已经足够了。