【理解与使用PHP的&引用符_PHP教程】教程文章相关的互联网学习教程文章

PHP中foreach循环中使用引用要注意的地方

代码如下:foreach ($array as &$row) { $row = explode(/, $row); } foreach ($array as $row) { //do something } 这么写,在第二个循环会出逻辑错误,加入第二个循环中do something的地方是输出$row,循环到最后一个的时候的输出是倒数第二个元素,而不是最后一个 要这么写 代码如下:foreach ($array as &$row) { $row = explode(/, $row); } unset($row); foreach ($array as $row) { //do something } 或者第一个循环这么写...

PHP错误抑制符(@)导致引用传参失败Bug的分析

看下面的例子: 代码如下:<?php $array = array(1,2,3); function add (&$arr) { $arr[] = 4; } add(@$array); print_r($array); /** 此时, $array没有改变, 输出: Array ( [0] => 1 [1] => 2 [2] => 3 ) */ add($array); print_r($array); /** 不使用错误抑制的情况下, 输出正常: Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 ) */ ?> 这个问题, 我之前没有遇到过, 所以首先去找找相关资料, 看看有没有现成的答案, Goolge了一...

使ecshop模板中可引用常量的实现方法

比如$smarty.const.'常量',这个就不能用。 其实模板引擎原理上并不复杂,只是把一些模板标签替换为php中的函数,变量,语法结构罢了。 这次要在ecshop模板中加入引用常量的功能,只需在函数make_var()中加入两行代码 代码如下:function make_var($val) { if (strrpos($val, .) === false) { if (isset($this->_var[$val]) && isset($this->_patchstack[$val])) { $val = $this->_patchstack[$val]; } $p = $this->_var[\ . $val ...

php地址引用(php地址引用的效率问题)

代码如下:<?php echo begin time:.$begin=microtime(false).<br/>;//begin to count time $array=array(); for ($i=1;$i<=10000;$i++) {//产生一个很大的数组 $array[$i]=$i; } /* $arr=$array;//拷贝 拷贝并打印总时间0.02 foreach ($arr as $ar) { echo $ar.<br/>; } */ /* $newarr=&$array;//地址引用 时间总是控制在0.01之内 地址引用的优势体现出来了 foreach ($newarr as $r) { echo $r.<br/>; } */ foreach ($array as $a) ...

php引用地址改变变量值的问题

代码如下:<?php $foo = Bob; // 将 Bob 赋给 $foo $bar = &$foo; // 通过 $bar 引用 $foo echo $foo.<br/>; $bar = "My name is $bar"; // 修改 $bar 变量 echo $bar.<br/>; echo $foo.<br/>; // $foo 的值也被修改 ?> 输出: Bob My name is Bob My name is Bob 我们看到原始值确实被修改了,发生在引用之后并被赋值之后,但被赋值之前则原始变量不会改变

奇怪的PHP引用效率问题分析

函数如下: 代码如下:function update_timelist(&$arr,$timestamp,$threshold){ $timequeue = &$arr[timequeue]; while(!empty($timequeue[0])&&($timestamp-$timequeue[0])>$threshold){ array_shift($timequeue); } array_push($timequeue, $timestamp); if($arr[count]<count($timequeue)){ $arr[count] = count($timequeue); } } 大家看出来这个函数有什么问题了没有?其实,有很大一个问题,就是函数中的: $timequeue = &$...

PHP中使用foreach和引用导致程序BUG的问题介绍

代码如下:$a = array(1, 2); $b = array(11, 12); foreach($a as &$r){ } foreach($b as $r){ } echo $a[1]; // 输出 12 两个的循环的本意可能是: 第一个循环需要在循环中修改元素的内容, 所以使用引用; 但第二个循环只是把 $r 当作一个临时变量. 可是, 为什么 $a[1] 的值发生了改变呢? 当对 $a 的迭代完成后, $r 是 $a[1] 的引用, 改变 $r 的值, 就是改变 $a[1]. 这时, 你可以会奇怪, 代码中并没有修改 $r, 也没有修改 $a[1] 呀?...

谨慎使用PHP的引用原因分析

引用类型(Reference)在许多计算机语言中都被使用,而且是作为一个非常强大而实用的特性存在。它有类似指针(Pointer)的实现,却又有不同于指针的表现。例如C++的引用,可以让不同变量指向同一个对象,同时又保有直接使用dot来获取对象成员,不用繁琐的使用dereference运算符(*)和Pointer to Member运算符(->)。Java和C#中就直接以引用为主要类型,尽量让开发人员避免使用指针。 PHP中也引入了引用类型,在对对象赋值传递上,基本可视...

PHP数组传递是值传递而非引用传递概念纠正

在调用函数时通过将PHP数组作为实参赋给形参,在函数中修改,并不会影响到数组本身。 说明此过程中的传递为值传递,数组变量并非是指向此数组本身的引用,PHP数组本身以值的形式存在,同时形参是对数组的拷贝。这点与其他一些语言不同(如c、Js等)很不相同,值得注意! 代码如下:$arr = array( name => corn, age => 24, ); test_arr($arr); function test_arr($arr){ $arr[name] = qqyumidi; } print_r($arr); //result: Array ...

php中将字符串转为HTML的实体引用的一个类

代码如下:class HtmlEncode { static $_convertToHtmlEntitiesSrcEncoding='UTF-8'; /** * 将非ASCII字符串转换成HTML实体 * * @example HtmlEncode::encode("我信了"); //输出: * @param string $s 要进行编码的字符串 * @return string 返回HTML实体引用 */ public static function encode($s,$srcEncoding='UTF-8') { self::$_convertToH...

php引用返回与取消引用的详解

一、引用返回引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。不要用返回引用来增加性能,引擎足够聪明来自己进行优化。仅在有合理的技术原因时才返回引用!要返回引用,使用此语法: 代码如下:<?phpclass foo { public $value = 42; public function &getValue() { return $this->value; }}$obj = new foo;$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42....

深入解析PHP的引用计数机制

PHP的变量声明并赋值后,变量名存在符号表中,而值和类信息存在zval中,zval中包含四个变量,is_ref,refcount,value,type,zval源码如下 代码如下:struct _zval_struct { /* Variable information */ zvalue_value value; /* value */ zend_uint refcount__gc; zend_uchar type; /* active type */ zend_uchar is_ref__gc; };refcount表示value地址与其相同的zval共有多少个,refcount=0时,zval被...

PHP垃圾回收机制引用计数器概念分析

如果你安装了xdebug,就可以用xdebug_debug_zval()显示“zval”的信息了。如下:代码如下:<?php$str = "jb51.net";xdebug_debug_zval(str); 结果: str:(refcount=1, is_ref=0),string jb51.net (length=10) 只有当变量容器在”refcount“变成0时就被销毁.当你unset()一个变量时,想要的“zval”中refcount就会减1,再来说说前几天遇到的unset引用问题:代码如下:<?php$a = "aaa";$b = & $a;unset($a);//echo $b; //这里依然会输出a...

php addslashes 利用递归实现使用反斜线引用字符串

实现代码: 代码如下:<?phpfunction addslashes_deep($value){//史上最经典的递归,一行搞定return is_array($value) ? array_map(addslashes_deep, $value) : addslashes($value);} //测试数据$_POST[STR] = "fanglor is \ a boy >";$_GET[STR1] = fanglor " is \ a boy >; echo 当前get_magic_quotes_gpc为 .get_magic_quotes_gpc();echo "<br/>"; //判断当前是否开启get_magic_quotes_gpcif (!get_magic_quotes_gpc()){$_...

php接口与接口引用的深入解析

1、接口的介绍与创建 关键字 :interface 2、接口的引用与规范 关键字 :implements 接口:一种成员属性全部为抽象的特殊抽象类,在程序中同为规范的作用 1、类中全部为抽象方法 2、抽象方法前不用加abstract 3、接口抽象方法属性为public 4、成员属性必须为常量 抽象: 1、类中至少有一个抽象方法 2、抽象方法前需加abstract 共同点: 1、本身都不能被实例化,必须被继承或者引用 2、继承或者引用后,需要把所有抽象方法重载方可...