当前位置: 首页 > 后端技术 > PHP

完成PHP面试-了解有关参考的更多信息

时间:2023-03-29 22:06:19 PHP

1。什么是引用在PHP中,引用是指以不同的名称访问相同的变量内容。PHP中的变量名和变量内容是不一样的,所以同样的内容可以有不同的名字。最接近的类比是Unix文件名和文件本身——变量名是目录条目,变量内容是文件本身。引用可以被认为是Unix文件系统中的硬链接。PHP中的引用与C中的指针不同:例如,您不能对它们进行指针运算。引用不是实际的内存地址,而是符号表的别名。2.引用特性PHP引用允许两个变量指向相同的内容。$a=&$b;这意味着$a和$b指向同一个变量。这里的$a和$b完全一样,并不是$a指向$b或者相反,而是$a和$b指向同一个地方。如果复制带有引用的数组,则不会取消引用其值。将数组传递给函数也是如此。$a='a';$arr1=['a'=>$a,'b'=>&$a,//$arr1['b']指向与$a相同的变量];//set$将arr1分配给$arr2$arr2=$arr1;print_r($arr2);//$arr2的值为['a'=>'a','b'=>'a']//修改$a的值为$a='b';print_r($arr2);//$arr2的值是['a'=>'a','b'=>'b']functionfoo($arr2){//改变$arr['b']的值为'c';$arr['b']='c';}echo$a;//将$a的值更改为'b'//更改$arr1传递给函数foo($arr1);回声$a;//$a的值为'c'如果一个未定义的变量被引用赋值、引用传递或引用返回,该变量将被自动创建。//定义函数foo(),通过引用传递参数functionfoo(&$var){}foo($a);//创建值为NULL的变量$avar_dump($a);//NULLfoo($b['b']);//创建数组$b=['b'=>NULL]var_dump(array_key_exists('b',$b));//bool(true)$c=newStdClass;foo($c->d);//创建对象属性$c->d=NULLvar_dump(property_exists($c,'d'));//bool(true)如果声明为全局的变量在函数内部被分配了一个引用,则该引用仅在函数内部可见。这可以通过使用$GLOBALS数组来避免。$var1='var1';$var2='var2';functionglobal_references($use_globals){global$var1,$var2;如果(!$use_globals){$var2=&$var1;//$var2仅在可见函数内部}else{$GLOBALS["var2"]=&$var1;//$GLOBALS["var2"]也是全局可见的}}global_references(false);echo"var2issetto'$var2'\n";//var2设置为'var2'global_references(true);echo"var2被设置为'$var2'\n";//var2设置为'var1'可以处理global$var;作为$var=&$GLOBALS['var']的简写;因此,将其他引用分配给$var只会更改局部变量的引用。在foreach语句中为具有引用的变量赋值时,引用的对象也会更改。$ref=0;$row=&$ref;foreach([1,2,3]as$row){//做某事}echo$ref;//3-遍历数组的最后一个元素3.通过引用传递可以通过引用传递变量给函数,这样函数就可以修改其参数的值。函数foo(&$var){$var++;}$a=5;foo($a);echo$a;//6请注意,函数调用中没有引号-仅在函数定义中。仅仅函数定义就足以使参数通过引用正确传递。可以通过引用传递的内容:变量从函数返回的引用通过引用传递变量functionfoo(&$var){$var++;}$a=5;foo($a);echo$a;//6通过引用传递一个函数返回的引用functionfoo(&$var){$var++;回声$var;//6}函数&bar(){$a=5;返回$a;}foo(bar());不通过引用传递函数、表达式、值等functionfoo(&$var){$var++;}functionbar()//注意这个函数不返回引用{$a=5;返回$a;}foo(bar());//自PHP5.0.5起致命错误,自PHP5.1.1起出现严格模式错误,自PHP7.0起通知消息foo($a=5);//表达式,不是变量。PHP注意:referencefoo(5)只能传递变量;//PHPFatalerror:Onlyvariablescanbepassedbyreference4.Referencereturns当你想用一个函数来寻找一个其引用应该被绑定的变量时,可以通过引用返回。不要使用返回引用来提高性能,引擎足够聪明,可以自己进行优化。仅在有充分的技术理由时才返回引用!Foo类{public$value=42;publicfunction&getValue(){返回$this->value;}}$foo=newFoo;//$myValue是对$obj->value的引用。$myValue=&$foo->getValue();//将$foo->value改为2$foo->value=2;回声$我的价值;//2不同于参数引用传递,引用返回必须在两处都使用&符号——指出返回的是一个引用,而不是通常的拷贝,同时也指出$myValue是作为引用绑定的,而不是平时的任务。引用返回只能返回变量。如果你试图从这样的函数返回一个引用:returnintval($this->value);,你会得到一个错误,因为函数试图返回一个表达式的结果而不是一个被引用的变量。只能从函数返回引用变量——没有其他方法。Foo类{public$value=42;publicfunction&getValue(){returnintval($this->value);//PHP注意:只有变量引用应该通过引用返回}}$foo=newFoo;//$myValue是对$obj->value的引用。$myValue=&$foo->getValue();5.解除引用当取消引用时,它只是打破了变量名和变量内容之间的绑定。这并不意味着变量内容被破坏。$a=1;$b=&$a;unset($a);echo$b;//16.发现很多PHP语法结构都是通过引用机制实现的,所以上面关于引用绑定的所有内容也适用于这些结构。全局引用当您使用global$var声明一个变量时,您实际上在函数内部创建了一个对全局变量的引用。也就是说,这样做的效果是一样的:global$var;$var=&$GLOBALS["var"];这意味着取消设置$var不会取消设置全局变量$GLOBALS["var"]。$this在对象的方法中,$this始终是对调用它的对象的引用。