首页 > 编程技术 > php

移动网站开发教程一,PHP环境搭建及配置

发布时间:2016-11-25 14:57

从本教程开始我们来学习讲解用php开发移动端互联网技术,移动互联网已经进入百花齐放,开发移动互联网也进入高潮,本本是php移动网站开发教程一,PHP环境搭建及配置。

一、PHP5.4环境搭配基本流程

Apache:Web服务提供者。官网:www.apache.org

PHP: 官网:www.php.net

Mysql: 官网:www.mysql.com

 

移动网站开发教程一,PHP环境搭建及配置

 

二、软件下载

Apache下载地址:http://download.csdn.net/detail/lxq_xsyu/7057423

PHP下载地址:http://download.csdn.net/detail/lxq_xsyu/7057401

Mysql下载地址:http://download.csdn.net/detail/lxq_xsyu/6468461

三、环境搭建

(1)Apache安装

 

移动网站开发教程一,PHP环境搭建及配置

 

安装成功

 

移动网站开发教程一,PHP环境搭建及配置

 

(2)解压PHP5.4

 

移动网站开发教程一,PHP环境搭建及配置

 

(3)配置Apache的httpd.conf文件

 

移动网站开发教程一,PHP环境搭建及配置

 

Apache安装目录

ServerRoot "D:/Apache Software Foundation"

监听端口

#Listen 12.34.56.78:80

Listen 80

载入PHP组件

LoadModule php5_module "D:/php54/php5apache2_2.dll"

服务器名称

#ServerName www.meritit.com:80

文件根目录

DocumentRoot "D:/Apache Software Foundation/htdocs"

权限文件夹

索引(默认访问主页)

DirectoryIndex index.html

 

错误日志

ErrorLog "logs/error.log"

访问日志

CustomLog "logs/access.log" common

配置解析php

AddType application/x-compress .Z

AddType application/x-gzip .gz .tgz

AddType application/x-httpd-php .php

错误类型

#ErrorDocument 500 "The server made a boo boo."

#ErrorDocument 404 /missing.html

#ErrorDocument 404 "/cgi-bin/missing_handler.pl"

#ErrorDocument 402 http://www.meritit.com/subscription_

四、测试是否搭建成功

新建a.php

<?php

phpinfo();

?>

 

移动网站开发教程一,PHP环境搭建及配置

 

可以看到找不到php的配置文件,我们在apache配置文件中指定一下php的配置文件目录

PHPIniDir "D:/php54"

 

移动网站开发教程一,PHP环境搭建及配置

 

五、配置多站点访问

# Virtual hosts

Include conf/extra/httpd-vhosts.conf

去掉上面注释(打开虚拟主机配置文件)

在httpd-vhosts.conf中配置了两个站点如下

DocumentRoot "D:/Apache Software Foundation/a_com"

ServerName 127.0.0.2

ServerAlias www.dummy-host.meritit.com

ErrorLog "logs/dummy-host.meritit.com-error.log"

CustomLog "logs/dummy-host.meritit.com-access.log" common

 

DocumentRoot "D:/Apache Software Foundation/b_com"

ServerName 127.0.0.3

ErrorLog "logs/dummy-host2.meritit.com-error.log"

CustomLog "logs/dummy-host2.meritit.com-access.log" common

 

注意:一旦配置了虚拟主机,前面配置的DocumentRoot就无效了。

D:Apache Software Foundationa_coma.php

<?php

echo "aaaaaa";

?>

D:Apache Software Foundationb_comb.php

<?php

echo "bbbbbb";

?>

注意:要修改权限文件夹目录

访问结果:

 

移动网站开发教程一,PHP环境搭建及配置

 

 

移动网站开发教程一,PHP环境搭建及配置

 

 

移动网站开发教程一,PHP环境搭建及配置

 

移动网站开发教程一我们讲了PHP环境搭建及配置,本教程我们来学习一下php的变量与常量。

一、PHP5.4的基本语法格式

1、PHP的分割符

 代码如下 复制代码
print?
$php=true;  //分号结束语句
if($php){
echo "真";    //分号结束语句
}             //大括号结束语句
?>



2、PHP注释与语法标识

(1)、单行注释    //    来源于C++的注释        # 来源于C语言的注释
(2)、多行注释    /*  */  来源于C语言的注释

3、函数的使用格式

(1) 返回值 函数名()
(2) 返回值 函数名(参数, 参数)
(3) 函数名(参数, 参数, 返回变量)
(4) 返回值 函数名(..   ..)通用符      // PHP5.4的用法

二、PHP5.4的变量与变量的数据类型

变量是由一个美元符“$"开头,”$"后是一个标识符。标识字符串只字母、数字、下划线组成且不可以数字开头。

 代码如下 复制代码

$php=true;  //分号结束语句
if($php){
echo "真";    //分号结束语句
}             //大括号结束语句

$url="blog.csdn.net/dawanganban";  //定义变量
echo $url; 
unset($url);   //删除一个变量url
echo $url;
?>


变量命名的方式

(1)单词之间直接连接

$titlekeyword

(2)单词之间用下划线连接

$title_keyword

(3)单词之间首字母大写(驼峰)

$titleKeyword

PHP的数据类型如下:

(1)字符串(String):单引号(简单引号)或双引号(功能引号)内的内容

(2)整型(integer):   -2^32 < n < 2^32-1

(3)浮点符(float或double)  1.8E+308  (1.8 x 10^308)

(4)布尔型(boolean)     true或false

(5)数组(Array)

(6)对象(Object)

 代码如下 复制代码

class Person{
public $userName="阳光小强";
public function getMsg(){
echo "姓名为:".$this->userName;
}
}
$p=new Person();
$p->getMsg();

?>


(7)资源类型(Resouce)  系统数据资源

资源是一个特殊的数据类型,无法直接获得变量,需要通过专门的函数来访问:

数据库访问必须通过Mysql函数库、Mysqli函数库或PDO函数库实现。

文件访问必须通过FileSystem函数库实现。

目录操作必须通过Directory函数库实现。

图像操作必须通过GD函数库实现。

(8)空值(NULL)

三、PHP5.4的系统常量与自定义常量


常量在程序执行期间无法改变数据,常量的作用域是全局的。常量的命名与变量相似,只是不带“$"符号。一个有效的常量由字母或者下划线开头,一般在PHP中常量都为大写字母而且又分为系统常量和自定义常量。

系统常量范例:

__FILE__ 默认常量,是指PHP程序文件名及路径

__LINE__ 默认常量,是指PHP程序的行数

__CLASS__ 类的名称

在PHP中通过define()函数来定义一个常量,其语法格式为:

bool define(string $name, mixed $value [, bool case_$insensitive])

name:常量的名称

value:常量的值

insensitive:指定常量名称是否区分大小写。如果设置为true则不区分大小写;如果设置为false则区分大小写,默认值为false。

print?
define("COLOR", "red");  //定义一个常量COLOR,值为red
echo COLOR."
";       //输出常量COLOR的值

可变变量

$a="b"       
$$a="123"  //可变变量
echo $b;
输出结果为:123

在字符串中输出变量要使用双引号

$a=50;
//echo '我有$a元人民币";    单引号
echo "我有$a元人民币";
在双引号中可以执行的转意字符更多,比如 n  t  r

判断数据类型

$a="-5";
//$a=-5;
var_dump($a);

下文整理了一些在php 应用开发中常用到的一些函数了,这些函数有字符操作,文件操作及其它的一些操作了,下面给各位整理一下。

1、PHP加密解密

PHP加密和解密函数可以用来加密一些有用的字符串存放在数据库里,并且通过可逆解密字符串,该函数使用了base64和MD5加密和解密。
 

 代码如下 复制代码
function encryptDecrypt($key, $string, $decrypt){
    if($decrypt){
        $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "12");
        return $decrypted;
    }else{
        $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));
        return $encrypted;
    }
}

使用方法如下:
 
//以下是将字符串“Helloweba欢迎您”分别加密和解密
//加密:
echo encryptDecrypt('password', 'Helloweba欢迎您',0);
//解密:
echo encryptDecrypt('password', 'z0JAx4qMwcF+db5TNbp/xwdUM84snRsXvvpXuaCa4Bk=',1);

2、PHP生成随机字符串

当我们需要生成一个随机名字,临时密码等字符串时可以用到下面的函数:
 

 代码如下 复制代码
function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, strlen($characters) - 1)];
    }
    return $randomString;
}
使用方法如下:
 
echo generateRandomString(20);

3、PHP获取文件扩展名(后缀)

以下函数可以快速获取文件的扩展名即后缀。
 

 代码如下 复制代码
function getExtension($filename){
  $myext = substr($filename, strrpos($filename, '.'));
  return str_replace('.','',$myext);
}
使用方法如下:
 
$filename = '我的文档.doc';
echo getExtension($filename);

4、PHP获取文件大小并格式化

以下使用的函数可以获取文件的大小,并且转换成便于阅读的KB,MB等格式。
 

 代码如下 复制代码
function formatSize($size) {
    $sizes = array(" Bytes", " KB", " MB", " GB", " TB", " PB", " EB", " ZB", " YB");
    if ($size == 0) { 
        return('n/a'); 
    } else {
      return (round($size/pow(1024, ($i = floor(log($size, 1024)))), 2) . $sizes[$i]); 
    }
}
使用方法如下:
 
$thefile = filesize('test_file.mp3');
echo formatSize($thefile);

5、PHP替换标签字符

有时我们需要将字符串、模板标签替换成指定的内容,可以用到下面的函数:

 代码如下 复制代码
 
function stringParser($string,$replacer){
    $result = str_replace(array_keys($replacer), array_values($replacer),$string);
    return $result;
}
使用方法如下:
 
$string = 'The {b}anchor text{/b} is the {b}actual word{/b} or words used {br}to describe the link {br}itself';
$replace_array = array('{b}' => '<b>','{/b}' => '</b>','{br}' => '<br />');
 
echo stringParser($string,$replace_array);

6、PHP列出目录下的文件名

如果你想列出目录下的所有文件,使用以下代码即可:
 

 代码如下 复制代码
function listDirFiles($DirPath){
    if($dir = opendir($DirPath)){
         while(($file = readdir($dir))!== false){
                if(!is_dir($DirPath.$file))
                {
                    echo "filename: $file<br />";
                }
         }
    }
}
使用方法如下:
 
listDirFiles('home/some_folder/');

7、PHP获取当前页面URL

以下函数可以获取当前页面的URL,不管是http还是https。
 

 代码如下 复制代码
function curPageURL() {
    $pageURL = 'http';
    if (!empty($_SERVER['HTTPS'])) {$pageURL .= "s";}
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
    }
    return $pageURL;
}
使用方法如下:
 
echo curPageURL();

8、PHP强制下载文件

有时我们不想让浏览器直接打开文件,如PDF文件,而是要直接下载文件,那么以下函数可以强制下载文件,函数中使用了application/octet-stream头类型。
 

 代码如下 复制代码
function download($filename){
    if ((isset($filename))&&(file_exists($filename))){
       header("Content-length: ".filesize($filename));
       header('Content-Type: application/octet-stream');
       header('Content-Disposition: attachment; filename="' . $filename . '"');
       readfile("$filename");
    } else {
       echo "Looks like file does not exist!";
    }
}
使用方法如下:
 
download('/down/test_45f73e852.zip');

9、PHP截取字符串长度

我们经常会遇到需要截取字符串(含中文汉字)长度的情况,比如标题显示不能超过多少字符,超出的长度用...表示,以下函数可以满足你的需求。
 

 代码如下 复制代码
/*
 Utf-8、gb2312都支持的汉字截取函数
 cut_str(字符串, 截取长度, 开始长度, 编码);
 编码默认为 utf-8
 开始长度默认为 0
*/
function cutStr($string, $sublen, $start = 0, $code = 'UTF-8'){
    if($code == 'UTF-8'){
        $pa = "/[x01-x7f]|[xc2-xdf][x80-xbf]|xe0[xa0-xbf][x80-xbf]|[xe1-xef][x80-xbf][x80-xbf]|xf0[x90-xbf][x80-xbf][x80-xbf]|[xf1-xf7][x80-xbf][x80-xbf][x80-xbf]/";
        preg_match_all($pa, $string, $t_string);
 
        if(count($t_string[0]) - $start > $sublen) return join('', array_slice($t_string[0], $start, $sublen))."...";
        return join('', array_slice($t_string[0], $start, $sublen));
    }else{
        $start = $start*2;
        $sublen = $sublen*2;
        $strlen = strlen($string);
        $tmpstr = '';
 
        for($i=0; $i<$strlen; $i++){
            if($i>=$start && $i<($start+$sublen)){
                if(ord(substr($string, $i, 1))>129){
                    $tmpstr.= substr($string, $i, 2);
                }else{
                    $tmpstr.= substr($string, $i, 1);
                }
            }
            if(ord(substr($string, $i, 1))>129) $i++;
        }
        if(strlen($tmpstr)<$strlen ) $tmpstr.= "...";
        return $tmpstr;
    }
}
使用方法如下:
 
$str = "jQuery插件实现的加载图片和页面效果";
echo cutStr($str,16);

10、PHP获取客户端真实IP

我们经常要用数据库记录用户的IP,以下代码可以获取客户端真实的IP:
 

 代码如下 复制代码
//获取用户真实IP
function getIp() {
    if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
        $ip = getenv("HTTP_CLIENT_IP");
    else
        if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
            $ip = getenv("HTTP_X_FORWARDED_FOR");
        else
            if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
                $ip = getenv("REMOTE_ADDR");
            else
                if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
                    $ip = $_SERVER['REMOTE_ADDR'];
                else
                    $ip = "unknown";
    return ($ip);
}
使用方法如下:
 
echo getIp();

11、PHP防止SQL注入

我们在查询数据库时,出于安全考虑,需要过滤一些非法字符防止SQL恶意注入,请看一下函数:
 

 代码如下 复制代码
function injCheck($sql_str) { 
    $check = preg_match('/select|insert|update|delete|'|/*|*|../|./|union|into|load_file|outfile/', $sql_str);
    if ($check) {
        echo '非法字符!!';
        exit;
    } else {
        return $sql_str;
    }
}

使用方法如下:
 
echo injCheck('1 or 1=1');

12、PHP页面提示与跳转

我们在进行表单操作时,有时为了友好需要提示用户操作结果,并跳转到相关页面,请看以下函数:
 

 代码如下 复制代码
function message($msgTitle,$message,$jumpUrl){
    $str = '<!DOCTYPE HTML>';
    $str .= '<html>';
    $str .= '<head>';
    $str .= '<meta charset="utf-8">';
    $str .= '<title>页面提示</title>';
    $str .= '<style type="text/css">';
    $str .= '*{margin:0; padding:0}a{color:#369; text-decoration:none;}a:hover{text-decoration:underline}body{height:100%; font:12px/18px Tahoma, Arial,  sans-serif; color:#424242; background:#fff}.message{width:450px; height:120px; margin:16% auto; border:1px solid #99b1c4; background:#ecf7fb}.message h3{height:28px; line-height:28px; background:#2c91c6; text-align:center; color:#fff; font-size:14px}.msg_txt{padding:10px; margin-top:8px}.msg_txt h4{line-height:26px; font-size:14px}.msg_txt h4.red{color:#f30}.msg_txt p{line-height:22px}';
    $str .= '</style>';
    $str .= '</head>';
    $str .= '<body>';
    $str .= '<div class="message">';
    $str .= '<h3>'.$msgTitle.'</h3>';
    $str .= '<div class="msg_txt">';
    $str .= '<h4 class="red">'.$message.'</h4>';
    $str .= '<p>系统将在 <span style="color:blue;font-weight:bold">3</span> 秒后自动跳转,如果不想等待,直接点击 <a href="{$jumpUrl}">这里</a> 跳转</p>';
    $str .= "<script>setTimeout('location.replace('".$jumpUrl."')',2000)</script>";
    $str .= '</div>';
    $str .= '</div>';
    $str .= '</body>';
    $str .= '</html>';
    echo $str;
}
使用方法如下:
 
message('操作提示','操作成功!','http://www.111cn.net/');

13、PHP计算时长

我们在处理时间时,需要计算当前时间距离某个时间点的时长,如计算客户端运行时长,通常用hh:mm:ss表示。
 

 代码如下 复制代码
function changeTimeType($seconds) {
    if ($seconds > 3600) {
        $hours = intval($seconds / 3600);
        $minutes = $seconds % 3600;
        $time = $hours . ":" . gmstrftime('%M:%S', $minutes);
    } else {
        $time = gmstrftime('%H:%M:%S', $seconds);
    }
    return $time;
}
使用方法如下:
 
$seconds = 3712;
echo changeTimeType($seconds);
在很多的程序员眼中php中的isset(Null)与is_null() empty()三个函数用法不太清楚了,下面小编就为各位介绍一下吧,希望可以给大家带来帮助。

但有时候会发现在php中没有达到想要实现的目的。
具体原因我就不讨论了,php实际应用中一般都是用isset()函数来做判断的。
示例如下:

 代码如下 复制代码

if( isset($_GET[’name’]) )//判断传来的值是否为空。 

    echo "值为空"; 
}


例子

 代码如下 复制代码

<?php
//预定义变量数组:空字符,字符0,数组0,null,布尔false,空数组
$arr_var = array('', '0', 0, null, false, array());

foreach ($arr_var as $value) {
    echo '<br>传入值为:' . $value . '<br>';
    if (!isset($value)) {
        echo 'isset()==false<br>';
    }
    if (empty($value)) {
        echo 'empty()==true<br>';
    }
    if (!$value) {
        echo 'self==false<br>';
    }
    if (is_null($value)) {
        echo 'is_null()==true<br>';
    }
}
?>
输出结果:

传入值为:
empty()==true
self==false

传入值为:0
empty()==true
self==false

传入值为:0
empty()==true
self==false

传入值为:
isset()==false
empty()==true
self==false
is_null()==true

传入值为:
empty()==true
self==false

传入值为:Array
empty()==true
self==false

总结一:从结果中可以看出,""、0、"0"、NULL、FALSE、array()这几个中,empty()和“变量本身作为参数”结果一致,均作为“空”来处理,而isset()和is_null ()仅当是null时,才作为“空”来处理(值得注意的是false并不会被认为是空)


isset和is_null对比

is_null是函数, 所以它可以通过如下方式调用:

 代码如下 复制代码
<?php
$var  = NULL;
$func = "is_null";
$func($var);
?>

而, isset因为是语句, 所以不能这样调用.

因为is_null是函数, 所以它可以接受函数返回值做为参数, 而isset不行(当然, 如果PHP想支持, 其实也是可以的, 只不过就要增加编译阶段的复杂度了):

 代码如下 复制代码
<?php
is_null(intval("0x45"));
//OK
isset(intval("0x45"));
//PHP Fatal error:  Can't use function return value in write context
is_null(NULL);
//OK
isset(NULL);
//PHP Parse error:  syntax error
?>

说了这么多isset的缺点了, 说点它的优点吧:

因为isset是语句, 所以它快!

在一千万次的简单检测语句循环中, 对比结果如下:

 代码如下 复制代码
<?php
$a="laruence":
isset($a);   //用时: 1.15s
is_null($a); //用时: 3.89s
?>

因为isset叫做isset, 所以它在检测未定义变量的时候, 不会产生NOTICE:

 代码如下 复制代码
<?php
isset($laruence);
//OK
is_null($laruence);
//PHP Notice:  Undefined variable: laruence
?>

那么, 对于什么时候用isset什么时候用is_null, 我有什么建议呢?

诶, 我的建议是, 用函数做函数应该做的事情~, 听起来象废话?

isset => is set? => 变量有没有被赋值(声明)

is_null => is null? => 变量为NULL么?

另外, 如果要用is_null, 我建议使用 “=== NULL” 来代替, 它不仅语义和is_null一致, 结果一致, 速度还和isset差不多:

在一千万次的简单检测语句循环中, 对比结果如下:

 代码如下 复制代码

<?php
$a="laruence":
isset($a);      //用时: 1.15s
is_null($a);    //用时: 3.88s
$a===NULL;     //用时: 1.22s
?>


使用说明:

1、空值、0、false的赋值结果均被isset判为 TRUE
2、NULL将被isset判为 FALSE 
3、isset()同样适用于数组元素和对象元素的检查。若数组或对象实例未被定义,则检测其中的数组元素/对象元素将被返回false。

附:

PHP的isset()函数
格式:bool isset ( mixed var [, mixed var [, ...]] ) 
功能:检测变量是否设置 
返回值: 
若变量不存在则返回 FALSE 
若变量存在且其值为NULL,也返回 FALSE 
若变量存在且值不为NULL,则返回 TURE 
同时检查多个变量时,每个单项都符合上一条要求时才返回 TRUE,否则结果为 FALSE 

版本:PHP 3, PHP 4, PHP 5 

更多说明: 
使用 unset() 释放变量之后,它将不再是 isset()。 
isset() 只能用于变量,传递任何其它参数都将造成解析错误。 
检测常量是否已设置可使用 defined() 函数。

PHP引用符&是一个用来传值或传地址的方法了,下面为了让大家更清楚PHP引用符&的用法我们整理了一些例子各位可进入参考。

关于php的引用(就是在变量或者函数、对象等前面加上&符号)的作用,我们先看下面这个程序。

 代码如下 复制代码

<?php
$a = 100; //声明变量a
$b = &$a; //声明变量b,引用自变量a
echo "$a <br />"; 
echo "$b <br />";
$a++; //变量a自增1
echo "$a <br />";
echo "$b <br />";//查看变量b,也增加了1,说明使用的是同一存储单元
?>
程序运行结果:

100
100
101
101

很多人误解php中的引用跟C当中的指针一样,事实上并非如此,而且很大差别。C语言中的指针除了在数组传递过程中不用显式申明外,其他都需要使用*进行定义,而php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。

php默认为传值传递:

 代码如下 复制代码

<?php   
$a = 20;
$b = $a;
$a = $a + 10;
echo $a.' and '.$b;
?>
程序运行结果:

30 and 20

要是想变为地址传递需要加&,既:

 代码如下 复制代码

<?php
$a = 20;
$b = &$a;
$a = $a + 10;
echo $a.' and '.$b;
?>
程序运行结果:

30 and 30

也就是说,&把$a的地址传给了$b,这样的话这两个变量现在共享一个内存的存储区域,就是说它们的值是一样的。

同样的语法可以用在函数中,它返回引用,以及用在 new 运算符中:

 代码如下 复制代码
<?php
$bar =& new fooclass();
$foo =& find_var($bar);
?>

引用做的第二件事是用引用传递变量。这是通过在函数内建立一个本地变量,并且该变量在呼叫范围内引用了同一个内容来实现的。说的通俗点就是一个函数的参数是一个本地变量的引用。下面再举例说明一下:

 代码如下 复制代码
<?php
function foo(&$val1, $val2) {
 $val1 += 1;
 $val2 += 1;
}
$a=5;
$b=10;
foo($a,$b);
echo $a;
echo $b;
?>

运行这段代码是给函数传递两个参数,一个是引用$a的内容,一个是$b的值,在执行此函数后,发现$a的内容改变了,而$b的内容则没有变化。

PHP引用的第三个用法是引用返回,这个用法理解起来有点难度,引用返回用在当你想用函数找到引用应该被绑定在哪一个变量上面时。当返回引用时,使用此语法:说的简单点,就还是引用函数的返回。但和参数传递不同,必须在函数定义和函数引用这两个地方都用 & 符号。下面举个例子:

 代码如下 复制代码
<?php
function &find_var ($param)
{
    /* ...code... */
    return $found_var;
}
$foo =& find_var ($bar);
$foo->x = 2;
?>

这个例子给$foo 赋值是函数find_var的返回引用,所以在给$foo->x赋值时就是给find_var的返回引用赋值,而不是简单的赋值。

函数的传址调用

传址调用我就不多说了,下面直接给出代码:

 代码如下 复制代码
function test(&$a)
{
$a=$a+100;
}
$b=1;
echo $b;//输出1
test($b);   //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了
echo "<br />";
echo $b;//输出101

要注意的是,在这里test(1);的话就会出错,原因自己去想。
函数的引用返回
先看代码:

 代码如下 复制代码

function &test()
{
static $b=0;//申明一个静态变量
$b=$b+1;
echo $b;
return $b;
}

$a=test();//这条语句会输出 $b的值 为1
$a=5;
$a=test();//这条语句会输出 $b的值 为2

$a=&test();//这条语句会输出 $b的值 为3
$a=5;
$a=test();//这条语句会输出 $b的值 为6

通过这种方式$a=test();得到的其实不是函数的引用返回,这跟普通的函数调用没有区别。至于原因:这是PHP的规定。PHP规定通过$a=&test(); 方式得到的才是函数的引用返回。至于什么是引用返回呢(PHP手册上说:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。)
用上面的例子来解释就是:
$a=test()方式调用函数,只是将函数的值赋给$a而已,而$a做任何改变都不会影响到函数中的$b。而通过$a=&test()方式调用函数呢,他的作用是将return $b中的 $b变量的内存地址与$a变量的内存地址 指向了同一个地方即产生了相当于这样的效果($a=&b;) 所以改变$a的值也同时改变了$b的值,所以在执行了

 代码如下 复制代码
$a=&test();
$a=5;

以后,$b的值变为了5。
这里是为了让大家理解函数的引用返回才使用静态变量的,其实函数的引用返回多用在对象中。
对象的引用

 代码如下 复制代码
<?
class a{
var $abc="ABC";
}
$b=new a;
$c=$b;
echo $b->abc;//这里输出ABC
echo $c->abc;//这里输出ABC
$b->abc="DEF";
echo $c->abc;//这里输出DEF
?>

在PHP5中对象的复制是通过引用来实现的。上列中$b=new a; $c=$b; 其实等效于$b=new a; $c=&$b;PHP5中默认就是通过引用来调用对象,但有时你可能想建立一个对象的副本,并希望原来的对象的改变不影响到副本。为了这样的目的,PHP定义了一个特殊的方法,称为__clone.
引用的作用:如果程序比较大,引用同一个对象的变量比较多,并且希望用完该对象后手工清除它,个人建议用 "&" 方式,然后用$var=null的方式清除。其它时候还是用php5的默认方式吧。另外,php5中对于大数组的传递,建议用 "&" 方式,毕竟节省内存空间使用。
当你 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:

 代码如下 复制代码
<?php
$a = 1;
$b =& $a;
unset ($a);
?> 

不会 unset $b,只是 $a。
当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是说和这样做是相同的:

 代码如下 复制代码
<?php
$var =& $GLOBALS["var"];
?> 

这意味着,例如,unset $var 不会 unset 全局变量。
$this 在一个对象的方法中,$this 永远是调用它的对象的引用。
php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是"写时拷贝"的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。
通俗的讲,如果有下面的代码:
$a="ABC";
$b=$a;
其实此时$a与$b都是指向同一内存地址,而并不是$a与$b占用不同的内存。
如果在上面的代码基础上再加上如下代码:
$a="EFG";
由于$a与$b所指向的内存的数据要重新写一次了,此时Zend核心会自动判断 自动为$b生产一个$a的数据拷贝,重新申请一块内存进行存储。

标签:[!--infotagslink--]

您可能感兴趣的文章: