长沙网站开发_基于PHP编程注意事项的小结(二)

发布日期:2016-09-28 07:54

1. 引用注意事项

PHP中引用意味着用不同的名字访问同一个变量内容,引用不是C的指针(C语言中的指针里面存储的是变量的内容,在内存中存放的地址),是变量的另外一个别名或者映射。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身――变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的紧密连接或者wins的快捷方式。

1)unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。

例如:不会 unset $b,只是 $a。

代码如下:

    <?php    

         $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

代码如下:

<?php  

    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指针字符串一样

复制代码 代码如下:

 

    <?php  

    $s = '12345';  

    $s[$s[0]] = 0;  

    echo $s;  

    ?>  

 

结果是10345。

以上信息由长沙网站建设--长沙蒲公英网络收集与整理,禁止用于任何商业行为