正常访问状态! 设为首页 | 加入收藏夹 | 浏览历史  
  http://www.guosp.com
 碧海澜涛居
  海纳百川,有容乃大。壁立千刃,无欲则刚!
 
 
关键词:
  网站首页 | 关于本站 | 技术资料 | 美文日志 | 读书收藏 | 影视收藏 | 软件收藏 | 摄影相册| 留言板 
  技术资料 >> PHP资料库 关闭(快捷键alt+C)
搜索标签: 全局变量 局部变量
php全局变量与局部变量
[阅读次数:1146次]  [发布时间:2011年4月26日]

所谓的全局变量与局部变量,php 在这方面也是有相同的处理方式。
在 php 的程序执行时,系统会在内存中保留一块全局变量的区域。实际运用时,可以透过 $globals["变量名称"] 将需要的变量取出。在用户自定的函数或程序中,就可以用 $globals 数组取出需要的变量。当然别忘了 php 的变量有分大小写,搞错了大小写可是叫一百年,变量也不会出来。

$globals 数组是 php 程序中比较特殊的变量,不必定义,系统会自动匹配相关的变量在里面。在函数中,也不必管 $globals 数组是否已经做全局定义,就可以直接使用了。

和 $globals 变量类似的还有 $php_errormsg 字符串变量。若 php 的配置文件 (php.ini/php3.ini) 中的 track_errors 选项打开的话,会有全局变量 $php_errormsg 可以看到错误的信息。

在 php 中,全局变量的有效范围 (scope) 仅限于主要程序中,不会影响到函数中同名的变量,也就是全局变量与局部变量互不侵犯。若要变量能通透到函数中,就要用到 $globals 数组或是使用 global 定义。

例如,在自行开发的函数中,要取得目前执行 php 程序页面的文件名,就可以用 $globals["php_self"] 取出 $php_self 的值。

<?php
// 本程序使用 $globals 数组
function myfunc() {
echo $globals["php_self"];
}
myfunc();
?>

下面是错误的示范,请勿模仿,上面的才是正确的示范。

<?php
// 这是错误的示范
function errfunc() {
echo $php_self;
}
errfunc();
?>

但是这个错误的示范要是改成下例就没问题了

<?php
// 本程序使用全局定义
function myfunc() {
global $php_self;
echo $php_self;
}
myfunc();
?>

在变量前面加上 global 的名称,就是定义该变量为全局变量。用这种方式,就不需使用 $globals 数组,也能让变量进入自行开发的函数中。

接下来先看静态变量的例子

<?php
// 静态变量的例子
function myfunc() {
static $mystr;
$mystr.="哈";
echo $mystr."<br>\n";
}
myfunc();  // 哈
myfunc();  // 哈哈
myfunc();  // 哈哈哈
?>

函数在执行时所产生的变量,在函数结束时就消失了,有时因为程序的需要,函数在循环中,当不希望变量在每次执行完函数就消失的话,静态变量 (static variable) 就派上用场了。上例中,使用 $mystr 变量之前,先在变量前面加上 static,即表示变量 $mystr 是静态变量,当每次执行 myfunc() 函数时,$mystr 的值会一直增加,每执行一次就多一个哈字。若将 static 的静态变量定义拿掉,就没办法累加哈字了。

<?php
// 不是静态变量的例子 (错误的)
function myfunc() {
$mystr.="哈";
echo $mystr."<br>\n";
}
myfunc();  // 哈
myfunc();  // 哈
myfunc();  // 哈
?>

再看一个比较实际的例子,它是处理表格的颜色,让隔行的颜色不同。

<?php
function tdbackcolor() {
static $colorstr;
if ($colorstr=="808080") {
$colorstr="c0c0c0";
} else {
$colorstr="808080";
}
return($colorstr);
}
echo "<table border=1>\n";
for ($i=0; $i<10; $i++) {
$colorstr=tdbackcolor();
echo "<tr><td bgcolor=".$colorstr.">这是第".$i."行</td></tr>\n";
}
echo "</table>";
?>


php 的变量使用技巧上,最令人觉得不可思议的则是变量的变量 (variable variable)。这是充分利用 php 特性玩出的特殊技巧

<?php
$a = "hello";
$$a = "world";
echo "$a, $hello";  // hello, world
echo "$a, {$a}"; // 也是 hello, world
?>

侠客站长站举出一个更绝的例子 (24-apr-1999),他称为变量的函数 (variable function)

<?php
function mycallbackfunction()
{
print("hello from callback");
}
function myfunction($callback)
{
$callback();
}
// call to myfunction passing callback
// function as parameter
myfunction("mycallbackfunction");
?>

至于用户在 form 中输入的资料,要怎么处理呢?要是在 php 的配置文件中,track_vars 设为 on 时,直接使用变量名字就好了。如下例,next.php 在执行时,系统会自动产生两个变量 $username 及 $sex,直接使用就好了,比起传统的 cgi 要自己解析,php 实在是太神奇了。

<form action=next.php method=post>
姓名: <input type=text name="username"><br>
性别: <input type=text name="sex"><br>
<input type=submit>
</form>

由于 php 许多语法都是 c 语言的翻版,故 php 在使用变量时,随时都可以使用新的变量,只要在使用前将变量初始化就好了,不必像 pascal 语言那样严谨,所有要使用的变量都要事先定义。这当然有好处与坏处:好处是使用方便、自由;坏处就是常常因这些自由而付出相当大的代价调试。在程序码短的 php 程序当然不成问题,当程序在数百数千行,甚至 include 或 require 好几层之后,问题就浮现出来了。无论如何,保持良好的写作习惯才是避免浪费青春的方法。





本页地址: [复制地址]
该页内容非本站原创 收藏自:http://www.xkzzz.com/zz/netbc/php/200902/11-8790.html
返回顶部 关闭(快捷键alt+C)
评论统计(0条)| 我要评论
暂无评论内容!
我要评论 
我要评论: 带*部分需要填写
 姓名称呼: * 请填写您的姓名或呢称
联系方式: QQ,MSN,Email都可以,方便交流 (仅管理员可见)
 评论内容: * 不超过100字符,50汉字
验证码:
    
  推荐链接
  最近更新  
·Host 'XXX' is not allowed...
·Win2008或IIS7的文件上传大...
·IIS7.0上传文件限制的解决方...
·测试信息2015-03-11
·asp.net中处理图片
·ASP.NET之Web打印-终极解决...
·Asp.net下C#调用Word模版实...
·asp.net下将页面内容导入到...
·asp.net导出为pdf文件
·asp.net生成pdf文件
·FCKeditor 文本编辑器的使用...
·ASP.NET 将数据生成PDF
·asp.net2.0导出pdf文件完美...
·AspJpeg的安装与测试
·JS验证浏览器版本对IE11的支...
  热门浏览  
·IE8和IE9出现“此网页上的问...
·无线路由器密码破解,教你断...
·js替换所有回车换行符
·QQ/MSN在线交流代码
·如何取消键盘上的一些快捷键...
·IE弹出“中国工商银行防钓鱼...
·win7声音小的解决方法
·webdav漏洞的利用
·强制两端对齐的函数或者CSS...
·win7下成功安装sql server ...
·显示器分辨率调的过高导致电...
·天诺时空技术技术论坛
·js验证手机号码格式
·JS展开和收缩效果(二)
·本地计算机上的 MSSQLSERVE...
  碧海澜涛居
网站首页关于本站站长简介开发案例技术资料美文日志摄影相册读书收藏影视收藏留言板
版权所有:碧海澜涛 QQ:410436434 Email:shaopo_guo@163.com 苏ICP备15000526号
免责声明:本站为个人网站,站内所有文字、图片等各类资料均为个人兴趣爱好所收集,不用作任何商业用途,亦不保证资料的真实性,若有因浏览本站内容而导致的各类纠纷,本站也不承担任何责任。本站部分内容来自互联网,如有涉及到您的权益或隐私请联系站长解决。