所属栏目:发布日期:2016-09-28 08:10浏览量:2612作者:admin
1. 引用注意事项
PHP中引用意味着用不同的名字访问同一个变量内容,引用不是C的指针(C语言中的指针里面存储的是变量的内容,在内存中存放的地址),是变量的另外一个别名或者映射。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身――变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的紧密连接或者wins的快捷方式。
1)unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。
例如:不会 unset $b,只是 $a。
代码如下:
$a = 1 ;
$b =& $a ;
unset ( $a );
echo $b; //输出:1:
使用unset($a)与$a=null的结果是不一样的。如果该块内存只有$a一个映射,那么unset($a)与$a=null等价,该内存的引用计数变为0,被自动回收;如果该块内存有$a和$b两个映射,那么unset($a)将导致$a=null且$b不变的情况,而$a=null会导致$a=$b=null的情况。
原因:某变量赋值为null,将导致该变量对应的内存块的引用计数直接置为0,被自动回收。
2)PHP引用是采用引用计数、写时拷贝
很多人误解Php中的引用跟C当中的指针一样,事实上并非如此,而且很大差别。C语言中的指针除了在数组传递过程中不用显式申明外,其他都需要使用*进行定义,而php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“引用计数、写时拷贝”的原理,(写时复制(Copy-on-Write,也缩写为COW),顾名思义,就是在写入时才真正复制一份内存进行修改。)
就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的,比如下面的代码:
$a = array('a','c'...'n');
$b = $a;
如果程序仅执行到这里,$b和$b是相同的,但是并没有像C那样,$a和$b占用不同的内存空间,而是指向了同一块内存,这就是php和c的差别,并不需要写成$b=&$a才表示$b指向$a的内存,zend就已经帮你实现了引用,并且zend会非常智能的帮你去判断什么时候该这样处理,什么时候不该这样处理。
如果在后面继续写如下代码,增加一个函数,通过引用的方式传递参数,并打印输出数组大小。
代码如下:
function printArray(&$arr) //引用传递
{
print(count($arr));
}
printArray($a);
上面的代码中,我们通过引用把$a数组传入printArray()函数,zend引擎会认为printArray()可能会导致对$a的改变,此时就会自动为$b生产一个$a的数据拷贝,重新申请一块内存进行存储。这就是前面提到的“引用计数、写时拷贝”概念。
直观的理解:$a将使用自己原始的内存空间,而$b,则会使用新开辟的内存空间,而这个空间将使用$a的原始($a或者$b改变之前)内容空间的内容的拷贝,然后做对应的改变。
如果我们把上面的代码改成下面这样:
代码如下:
function printArray($arr) //值传递
{
print(count($arr));
}
printArray($a);
上面的代码直接传递$a值到printArray()中,此时并不存在引用传递,所以没有出现写时拷贝。
2. 编码的问题
程序代码使用utf-8码,而strlen函数是计算字符串的字节数而不是字符数?
$str = “您好hello”;
echo strlen($str);
结果:ANSI=9 而utf-8=11,utf-8中文字符编码是3个字节。要获取字符数,使用mb_strlen()。
3. PHP获取参数的三种方法
方法一 使用$argc $argv
代码如下:
if ($argc > 1){
print_r($argv);
}
在命令行下运行 /usr/local/php/bin/php ./getopt.php -f 123 -g 456
运行结果:
# /usr/local/php/bin/php ./getopt.php -f 123 -g 456
Array
(
[0] => ./getopt.php
[1] => -f
[2] => 123
[3] => -g
[4] => 456
)
方法二 使用getopt函数()
复制代码 代码如下:
$options = "f:g:";
$opts = getopt( $options );
print_r($opts);
在命令行下运行 /usr/local/php/bin/php ./getopt.php -f 123 -g 456
运行结果:
Array
(
[f] => 123
[g] => 456
)
方法三 提示用户输入,然后获取输入的参数。有点像C语言
复制代码 代码如下:
fwrite(STDOUT, "Enter your name: ");
$name = trim(fgets(STDIN));
fwrite(STDOUT, "Hello, $name!");
在命令行下运行 /usr/local/php/bin/php ./getopt.php
运行结果
Enter your name: francis
Hello, francis!
4. php的字符串即可以当做数组,和c指针字符串一样
复制代码 代码如下:
$s = '12345';
$s[$s[0]] = 0;
echo $s;
?>
结果是10345。