php引用(&)实例教程

 更新时间:2016年11月25日 15:14  点击:1541
在很多编程语言中引用(&)是少不了的,下面我们来看看php引用(&)实例教程

php的引用(就是在变量或者函数、对象等前面加上&符号)

在PHP 中引用的意思是:不同的名字访问同一个变量内容.
与C语言中的指针是有差别的.C语言中的指针里面存储的是变量的内容在内存中存放的地址

变量的引用

PHP 的引用允许你用两个变量来指向同一个内容
复制PHP内容到剪贴板
PHP代码:

<?
$a="ABC";
$b =&$a;
echo $a;//这里输出:ABC
echo $b;//这里输出:ABC
$b="EFG";
echo $a;//这里$a的值变为EFG 所以输出EFG
echo $b;//这里输出EFG
?>


函数的传址调用
传址调用我就不多说了 下面直接给出代码
复制PHP内容到剪贴板
PHP代码:
function test(&$a)
{
$a=$a+100;
}
$b=1;
echo $b;//输出1
test($b);  //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了
echo "<br>";
echo $b;//输出101


要注意的是,在这里test(1);的话就会出错,原因自己去想

函数的引用返回
先看代码
复制PHP内容到剪贴板
PHP代码:
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

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

对象的引用
复制PHP内容到剪贴板
PHP代码:

<?
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中的运行效果
在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 引用
当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是说和这样做是相同的:

<?php
$var =& $GLOBALS["var"];
?> 

这意味着,例如,unset $var 不会 unset 全局变量。

$this
在一个对象的方法中,$this 永远是调用它的对象的引用。


//下面再来个小插曲
php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。

通俗的讲
1:如果有下面的代码
复制PHP内容到剪贴板
PHP代码:
$a="ABC";
$b=$a;


其实此时 $a与$b都是指向同一内存地址 而并不是$a与$b占用不同的内存

2:如果在上面的代码基础上再加上如下代码
复制PHP内容到剪贴板
PHP代码:
$a="EFG";


由于$a与$b所指向的内存的数据要重新写一次了,此时Zend核心会自动判断 自动为$b生产一个$a的数据拷贝,重新申请一块内存进行存储

下面来看一下吧,这款php表单验证类用来判断过滤form来的值哦。

class post_get{
private $array; #提交表单检测字段和检测要求
# $type;  缺省为更新 或$type ="Into";  
public function _post_get($array,$type=""){
  if(!$array) die(" Error!! ");
   foreach ($array as $v)
   {
   $KK = $this->ck_split($v);
   $KKarray = split("_", $KK);
   if(preg_match("/Yes|No/is",$KKarray[1]))
    {
    $escape_filter = ($KKarray[2])? 'ck_'.$KKarray[2]:"";#需要转义和过滤
    $data = ($escape_filter)? $this->$escape_filter($_POST[$KKarray[0]]):$_POST[$KKarray[0]]; #输出合法数据
       if($data)
     {
     if(is_array($data))$data = implode(",",$data);
     $Into_data  .=",'$data'";
     $Into_Field.=",`$KKarray[0]`";
     $Updat_array[] ="`$KKarray[0]` = '$data'";
     }
    }
    else $error .= ($KK)? "[".$KK."],":"";
   }
   $_data=(!$type)? $Updat_array:array("$Into_Field","$Into_data");
   return (!$error)? $_data:$this->ck_script($error); # 数组为合法表单验证结果,字符串为错误信息提示
  }
public function ck_split($str){
  $strarray = explode(",",$str);
  foreach ($strarray as $i=> $var)
   if(0 ===$i)
   $name = trim($var);
  elseif(1===$i)
   {
   if(eregi("No",trim($var))&&!$_POST[$name])break;     #缺省忽略,否则...
   else $_type = (trim($var))? $name.'_'.trim($var):""; #检测后动作
   }
   elseif(2===$i)
   {
    $error = trim($var);
    if(!$_POST[$name])
    {
     $_error = $error;
     break;
    }
   }
   else # 检测部分
   {
    if(!trim($var))break;
    if(is_array($_POST[$name]))
    {
     foreach ($_POST[$name] as $_var)
      {
      $_error= ($this->ck_open($_var,trim($var)))?"":$error;
      if($_error)break;
      }
    }
    else
     {
     $_error= ($this->ck_open($_POST[$name],trim($var)))?"":$error;
     if($_error)break;
     }
   }
   return ($_error)? """.$name."","".$_error.""":$_type;
   }
# 窗口js提示
public function ck_script($str){
$str= trim($str,",");
  $str =  "
  <script>
  var str = new Array( $str );
  for (i=0; i < str.length; i++)
  {
  document.getElementById('J'+str[0]+'').innerHTML= str[1];
  }
  </script>
  ";
return $str;
}
# 类型判断
public function ck_detected($str){
  return (eregi("^[a-zA-Z]*$",$str))? 'ck_'.$str:'ck_Length';
}
# 函数调用
public function ck_open($string,$str){
  $functi = $this->ck_detected($str);
  return ($this->$functi($string,$str))? true:false;
}
#-------------------------------------以下为检测函数  
# 长度
public function ck_Length($string,$str){
  $len = split('-',trim($str));
  return (strlen($string) > ($len[0]-1) && strlen($string) < ($len[1]+1))? true:false;
}
# 价格
public function ck_money($str){
  return preg_match("/^(-|+)?d+(.d+)?$/",$str);
}
# 邮件
public function ck_email($str){
  return preg_match("/^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/", $str);
}
# 网址
public function ck_url($str){
  return preg_match("/^http://[A-Za-z0-9]+.[A-Za-z0-9]+[/=?%-&_~`@[]':+!]*([^<>"])*$/", $str);
}
# 数字型
public function ck_num($str){
  return is_numeric($str);
}
# 中文
public function ck_cn($str){
  return preg_match("/^[x7f-xff]+$/", $str);
}
# 字母
public function ck_en($str){
  return preg_match("/^[A-Za-z]+$/", $str);
}
# 数字字母混合
public function ck_numen($str){
  return preg_match("/^([a-zA-Z0-9_-])+$/",$str);
}
# 电话号码
public function ck_tel($str){
  return ereg("^[+]?[0-9]+([xX-][0-9]+)*$", $str);
}
# 敏感词
public function ck_key($str){
  Global $badkey;
  return (!preg_match("/$badkey/i",$str));
}
#-----------------------------------------------------输出
# 字符替换
public function ck_filter($str){
  $str=(is_array($str))? implode(",",$str):$str;
  $str=HTMLSpecialChars($str); //将特殊字元转成 HTML 格式。
  $str=nl2br($str); //将回车替换为<br>
  $str=str_replace(array(" ",'<? '),array(" ",'< ?'),$str); //替换空格替换为
  return $str;
}
# MD5加密
public function ck_md($str){
  return  MD5($str);
}
# 转义
public function ck_escape($str){
  return  (is_array($str))? implode(",",$str):$str;
}
# 有条件注销(数字)
public function ck_cancel($str){
  return (!is_numeric($str))? $str:"";
}
# 无条件注销(数字)
public function ck_delete(){
  return null;
  }
}

php在文件上传方面比起asp来说方便了很多,记得用asp文件上传时那麻烦了,现在我们下看看php 文件上传入门教程吧。

一.表单提交:
接收普通表单信息的数组有: $_GET    $_POST    $_REQUEST<不能确定表单的接收方式>
接收文件上传信息的函数有: $_FILES
同时做多个上传文件的表单的时候,表单不能同名.
如果要做文件上传<form>表单必须要改加的:
1.method="post"
2.enctype="multipart/form-data"
3.要加的:<input type="hidden" name="MAX_FILE_SIZE" value="100000">
二.对文件的操作:
text 文件类型:
text/html    .html    .htm
text/plain    .txt    .log
image 图片类型:
image/gif    .gif
image/jpeg    .jpeg    .jpg
image/png    .png
audio 声音类型:
audio/x-midi  mid    .midi    ,mid
audio/x-wav    .wav
video/quicktime    .qt    .mov
video/mpeg    .mpeg
application 文件类型:
application/pdf    .pdf
application/msword    .doc    dot
application/vnd.ms-excel    .xls
application/vnd.ms-powerpoint    .ppt
application/zip    .zip
application/rar    .rar
application/xml    .xml    .xsl
application/mshelp    .hlp    .chm
application/octet-stream    .ext    .bin    .com    .dll    .class
is_uploaded_file(目标文件名称) 判断是否是上传文件的函数.
move_uploaded_file(1.目标文件名称 2.移动到的位置名称) 将上传的文件移动到新的位置的函数.

转载注明:www.111cn.net/phper/php.html

在php在上传文件简单到了极点哦,我们只要用php自带的函数move_uploaded_file就可以快速的开发出文件上传功能哦。

第十章(1)文件上传(一)
一.表单提交:
接收普通表单信息的数组有: $_GET    $_POST    $_REQUEST<不能确定表单的接收方式>
接收文件上传信息的函数有: $_FILES
同时做多个上传文件的表单的时候,表单不能同名.
如果要做文件上传<form>表单必须要改加的:
1.method="post"
2.enctype="multipart/form-data"
3.要加的:<input type="hidden" name="MAX_FILE_SIZE" value="100000">
二.对文件的操作:
text 文件类型:
text/html    .html    .htm
text/plain    .txt    .log
image 图片类型:
image/gif    .gif
image/jpeg    .jpeg    .jpg
image/png    .png
audio 声音类型:
audio/x-midi  mid    .midi    ,mid
audio/x-wav    .wav
video/quicktime    .qt    .mov
video/mpeg    .mpeg
application 文件类型:
application/pdf    .pdf
application/msword    .doc    dot
application/vnd.ms-excel    .xls
application/vnd.ms-powerpoint    .ppt
application/zip    .zip
application/rar    .rar
application/xml    .xml    .xsl
application/mshelp    .hlp    .chm
application/octet-stream    .ext    .bin    .com    .dll    .class
is_uploaded_file(目标文件名称) 判断是否是上传文件的函数.
move_uploaded_file(1.目标文件名称 2.移动到的位置名称) 将上传的文件移动到新的位置的函数.

在php中保存的方式有两种:1.写入文件. 2.写入数据库. php对文件系统的操作是基于Unix或Linux系统的. fopen(1.目标文件名称 2.文件打开方式) 打开文件的函数

第九章(1)文件系统处理
在php中保存的方式有两种:1.写入文件. 2.写入数据库.
php对文件系统的操作是基于Unix或Linux系统的.
fopen(1.目标文件名称 2.文件打开方式) 打开文件的函数.
目标文件名称:
windows : C:\test\test.txt C:\test/test.txt
linux :  /root/test/test.txt
文件打开方式:
r :以读的方式打开文件.
r+ :以读和写的方式打开文件,并将文件指针指向文件开始.
w :以写的方式打开文件,如果该文件包含任何数据,则数据将丢失,如果文件不存在,则创建文件.
w+ :以读和写的方式打开文件,如果该文件包含任何数据,则数据将丢失,如果该文件不存在,则创建文件.
a :以写的方式打开文件,将文件指针指向末尾,如果该文件不存在,则创建文件.
a+ :以读和写的方式打开文件,将文件指针指向文件末尾,如果该文件不存在,则创建文件.
x :创建并以写入方式打开,将文件见指针指向文件头,如果文件已存在,则fopen()调用失败返回FALSE,并 生成一条E_WARNING级别的错误信息,如果文件不存在则尝试创建文件,这个参数仅能用于本地文件.
x+ :创建并以写入方式打开,其它与x的功能完全相同.
fwrite(1.目标文件名称 2.要写入的内容 3.写入的长度) 写入文件的函数.
fclose(目标文件名称) 关闭文件的函数.
fread(1.目标文件名称 2.读取长度) 读取文件的函数.<如果要读取全文,可以使用filesize(目标文件名称) 获取全文的长度>
fgets(1.目标文件名称 2.可选参数,读取一行里面的长度) 读取文件里面一行的函数.
fgetc(目标文件名称) 读取文件里面一个字符的函数.
file(目标文件名称) 不用打开和关闭就可以直接读取文件的函数,但返回的是以换行为单位的数组.
readfile(目标文件名称) 不用打开和关闭文件,直接输出目标文件里面的所有内容的函数.
用文件写入和文件读取做计数器的实例:
$jishu="jishu.txt";
if(!file_exists($jishu))
{
 $kjs = fopen($jishu,"w");
 fwrite($kjs,0);
 fclose($kjs);
}
function kaishi($jishu)
{
 $js = fopen($jishu,"r");
 $du = fread($js,8);
 fclose($js);
 $du += 1;
 echo "你是本站的第".$du."位访客!!!";
 $xie = fopen($jishu,"w");
 fwrite($xie,$du);
 fclose($xie);
}
    kaishi($jishu);
输出结果:打开的计数器被访问了几次就会输出几.
file_get_contents(目标文件名称) 不用打开和关闭文件就可以直接读取文件的函数,但将整个文件返回一个字符串.
file_put_contents(1.目标文件名称 2.要写入的内容) 不用打开和关闭文件就可以直接写入文件的函数.
flock(1.目标文件名称 2.选择以下参数) 文件锁定的函数.
锁定文件的参数可选:
LOCK_SH :共享锁定,读取文件的时候使用.
LOCK_EX :独占锁定,写入文件的时候使用.
LOCK_UN :释放锁定.
LOCK_NB :附加锁定,避免文件同时被多人锁定的时候使用.
ftell(目标文件名称) 返回文件指针当前位置的函数.
fseek(1.目标文件名称 2.移动的字节数 3.起始位置选择参数) 移动文件指针到指定位置的函数.
起始可选择参数有:
SEEK_SET :起点位置    SEEK_CUR :当前位置    SEEK_END :末尾位置
rewind(目标文件名称) 移动文件指针到文件开头的函数.
cpoy(1.目标文件名称 2.拷贝到的文件名称) 拷贝文件的函数.
unkink(目标文件名称) 删除文件的函数.
rename(1.目标文件名称 2.新文件名称) 文件的重命名函数.
ftruncate(1.目标文件名称 2.要截取的长度) 截取文件内容的函数.
filectime(目标文件名称) 获取文件创建时间的函数.
filemtime(目标文件名称) 获取文件更改时间的函数.
fileatime(目标文件名称) 获取文件上一次访问时间的函数.
file_exists(目标文件名称) 判断文件或目录是否存在的函数.
filesize(目标文件名称) 获取文件大小的函数.
filetype(目标文件名称) 获取文件类型的函数.
is_dir(目标文件名称) 判断文件是否是目录的函数.
is_file(目标文件名称) 判断文件是否是正常文件的函数.
is_link(目标文件名称) 判断文件是否是符号连接文件的函数.
is_executable(目标文件名称) 判断文件是否是可以执行的文件的函数.
is_readable(目标文件名称) 判断文件是否是可读文件的函数.
is_writable(目标文件名称) 判断文件是否是可写文件的函数.
chmod(1.目标文件名称 2.权限长度) 修改文件权限的函数.
chown(1.目标文件名称 2.要拥有者的ID) 修改文件拥有者的函数.
chgrp(1.目标文件名称 2.要拥有组的ID) 修改文件拥有组的函数.
fileowner(目标文件名称) 获取文件拥有者的函数.
filegroup(目标文件名称) 获取文件拥有组的函数.

[!--infotagslink--]

相关文章

  • Painter绘制红衣喝酒男水粉画效果教程

    今天小编在这里就来给Painter的这一款软件的使用者们来说一说绘制红衣喝酒男水粉画效果的教程,各位想知道具体绘制步骤的使用者,那么下面就快来跟着小编一起看一看教程...2016-09-14
  • iPhone6怎么激活?两种苹果iPhone6激活教程图文详解

    iPhone6新机需要激活后才可以正常使用,那么对于小白用户来说,iPhone6如何激活使用呢?针对此问题,本文就为大家分别介绍Wifi无线网络激活以及iPhone6连接电脑激活这两种有效的方法,希望本文能够帮助到大家...2022-09-14
  • Photoshop制作雨中野外孤独行走的一头牛海报教程

    今天小编在这里就来给各位photoshop的这一款软件的使用者们来说下制作雨中野外孤独行走的一头牛海报的教程,各位想知道具体制作方法的使用者们,大家就快来看一看小编给...2016-09-14
  • Painter绘制帅气卡通魔法王子漫画教程

    今天小编在这里就来给Painter的这一款软件的使用者们来说一下绘制帅气卡通魔法王子漫画的具体教程,各位想知道绘制步骤的使用者,那么下面就快来跟着小编一起看一看教程...2016-09-14
  • Illustrator鼠绘堆雪人的孩童矢量插画教程

    今天小编在这里就来给各位Illustrator的这一款软件的使用者们来说说鼠绘堆雪人的孩童矢量插画的教程,各位想知道具体绘制方法的使用者们,那么各位就快来跟着小编来看看...2016-09-14
  • 安卓手机app添加支付宝支付开发教程

    支付宝支付在国内算是大家了,我们到处都可以使用支付宝了,下文整理介绍的是在安卓app应用中使用支付宝进行支付的开发例子。 之前讲了一篇博客关与支付宝集成获取...2016-09-20
  • 美图秀秀给照片天空加蓝天白云教程一览

    今天小编在这里就来给美图秀秀的这一款软件的使用者们来说下究竟该怎么给照片天空加蓝天白云的教程,各位想知道具体制作步骤的,那么下面就来跟着小编一起看看吧。 ...2016-09-14
  • llustrator绘制扁平化风格卡通警察护士空姐肖像教程

    今天小编在这里就来给llustrator的这一款软件的使用者们来说一说绘制扁平化风格卡通警察护士空姐肖像的教程,各位想知道具体绘制步骤的使用者们,那么下面就快来跟着小编...2016-09-14
  • Illustrator绘制一个方形的录音机图标教程

    今天小编在这里就来给Illustrator的这一款软件的使用者们来说一下绘制一个方形的录音机图标的教程,各位想知道具体绘制方法的使用者们,那么下面就来看一下小编给大家分...2016-09-14
  • photoshop简单制作一个搞笑的换脸表情包教程

    今天小编在这里就来给photoshop的这一款软件的使用者们来说一说简单制作一个搞笑的换脸表情包的教程,各位想知道具体制作方法的使用者们,那么大家就快来看一看教程吧。...2016-09-14
  • photoshop给手绘画调色变换场景后期教程

    今天小编在这里就来给各位photoshop的这一款软件的使用者们来说说给手绘画调色变换场景的后期教程,各位想知道具体后期处理步骤的使用者们,那么大家就快来跟着小编来看...2016-10-02
  • 美图秀秀让你胸丰满起来处理教程

    今天小编在这里就来给美图秀秀的这一款软件的使用者们来说一下让你胸丰满起来的处理教程,各位想知道具体处理步骤的,那么下面就快来跟着小编一起看一下教程吧。 给...2016-09-14
  • Painter绘制雷神传插画教程

    今天小编在这里就来给Painter的这一款软件的使用者们来说一下绘制雷神传插画的教程,各位想知道具体绘制步骤的使用者,那么下面就快来跟着小编一起看看绘制方法吧。 ...2016-09-14
  • 美图秀秀制作隔离区聊天背景教程

    今天小编在这里就来给美图秀秀的这一款软件的使用者们来说下制作隔离区聊天背景的教程,各位想知道具体方法的,那么下面就快来跟着小编一起看一看吧。 给各位美图秀...2016-09-14
  • MySQL中的联合索引学习教程

    联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进...2015-11-24
  • Lua语言新手简单入门教程

    这篇文章主要给大家介绍的是关于Lua语言新手入门的简单教程,文中通过示例代码一步步介绍的非常详细,对各位新手们的入门提供了一个很方便的教程,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。...2020-06-30
  • MySQL日志分析软件mysqlsla的安装和使用教程

    一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24
  • photoshop素材合成古典园林场景制作教程

    今天小编在这里就来给photoshop的这一款软件的使用者们来说说用素材合成古典园林场景教程,各位想知道到底该怎么制作的,那么就快来一起看一下吧。 给各位photoshop...2016-09-14
  • php类的使用实例教程

    php类的使用实例教程 <?php /** * Class program for yinghua05-2 * designer :songsong */ class Template { var $tpl_vars; var $tpl_path; var $_deb...2016-11-25
  • PHP扩展开发教程(总结)

    PHP是一种解释型的语言,对于用户而言,我们精心的控制内存意味着easier prototyping和更少的崩溃!当我们深入到内核之后,所有的安全防线都已经被越过,最终还是要依赖于真正有责任心的软件工程师来保证系统的稳定运行。1、线...2015-11-08