php全局变量和类配合使用深刻理解


Posted in PHP onJune 05, 2013

情况1:
father.php如下定义:

<?php 
$jack = 1000; 
?> 
children.php 如下定义: 
<?php 
require("father.php"); 
$jack=123; 
echo $jack."/n"; 
?>

php children.php
运行输出为123.
如果将$jack=123注释掉,运行为1000,如果将$jack=123放到require("father.php");之前,运行结果为1000.
比较好理解:php解释执行,解释到哪,执行到哪。。像$jack这种属于全局变量,如第一种情况的初始用它的时候是1000,是在require
的时候运行得到的,结果又被改成了123,所以运行结果输出123.
情况2:
children.php代码改为如下:
<?php 
require("father.php"); 
function testJack(){ 
if(!isset($jack)){ 
echo '$jack is null'."/n"; 
} 
}//testJack 
testJack(); 
?>

php children.php
运行结果为:$jack is null.也就是说在testJack()中引用的$jack是一个局部变量。
如果使用global关键字,声明这个$jack是一个全局变量,代码改为如下:
<?php 
require("father.php"); 
function testJack(){ 
global $jack; 
if(!isset($jack)){ 
echo '$jack is null'."/n"; 
}else{ 
echo '$jack is not null'."/n"; 
} 
}//testJack 
testJack(); 
?>

则运行结果为$jack is not null!
情况3:
children.php代码如下:
<?php 
require("father.php"); 
class JackTest{ 
public function testJack(){ 
if(!isset($jack)){ 
echo '$jack is null'."/n"; 
}else{ 
echo '$jack is not null'."/n"; 
} 
}//testJack 
} 
$jackTest = new JackTest(); 
$jackTest->testJack(); 
?>

运行结果输出:$jack is null
这是因为class中的这个函数的$jack这是一个局部变量啊。
如果在function testJack开头加 global $jack;那么就输出$jack is not null了。
比较容易理解。
情况4:
把文件名当做参数动态加载,代码如下:
<?php 
$casefile = $_SERVER['argv'][1]; 
echo $casefile."/n"; 
require($casefile); 
echo $jack."/n"; 
?>

运行php children.php father.php
结果如下:
father.php
1000
也就是说我们动态加载程序运行成功了。。
情况5:
要把动态加载和类的定义结合起来:
目录关系式这样的:
|- c.php
|- Bfold - b.php
|- Afold - a.class.php (里面的函数引用了../Bfold/b.php )
也就是说 在c.php 中new 了class a.class ,而a.class.php 的一个函数中require 了Bfold 文件夹下的b.php ,这个require(../Bfold/b.php )报错,Warning: ……
因为你让服务器当前执行的是c.php 文件,所以php 解析的时候是把路径相对于c.php 而言的,你试试把(../Bfold/b.php )改成(Bfold/b.php )看看,应该就不会报错了。
下面是程序例子,说明在函数内部使用require_once (A.php ).
对require_once 的理解:
假设B.php 中引用了require_once(A.php); 这条语句。。
那么其实是相当于调用了A.php 这个匿名的lambda 函数去执行。如下图:
C.php 在一个函数调用中 require 了 B.php------》
B.php 在普通语句中 require 了 A.php--------》
A.php
现在我们调用 php B.php ;因为 B.php 在普通语句中使用了 require 调用了 A.php ,那么 A.php 会把它的相对 A 来说是全局变量的变量,注册到 B.php 的环境中。因为 B.php 是根开始调用文件,他的运行环境就是全局环境。所以A.php 文件中的变量在 B.php 可以被正常使用。

现在我们调用 php C.php ;那么 C 是在函数使用 require 调用了 B.php 的,然后 B 又调用了 A ,感觉在这个调用的过程中,相对 B 和 A 根运行环境是 C 的调用函数的环境 ,但 C 的调用函数如果要使用 B 和 A 中的变量,就没有办法了。

如果用 global $a, 去引用,那么由于 $a 在这种情况下不属于全局变量,引用不到。
如果用 $a 去引用,那么由于 $a 会被当成局部变量也引用不到的。

PHP 相关文章推荐
在JavaScript中调用php程序
Mar 09 PHP
基于Linux调试工具strace与gdb的常用命令总结
Jun 03 PHP
IIS6.0中配置php服务全过程解析
Aug 07 PHP
PHP模拟post提交数据方法汇总
Feb 16 PHP
Zend Framework教程之Zend_Registry对象用法分析
Mar 22 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
Mar 23 PHP
PHP+HTML+JavaScript+Css实现简单爬虫开发
Mar 28 PHP
PHP编程之设置apache虚拟目录
Jul 08 PHP
PHP 信号管理知识整理汇总
Feb 19 PHP
PHP重定向与伪静态区别
Feb 19 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
May 27 PHP
PHP加MySQL消息队列深入理解
Feb 27 PHP
php数组声明、遍历、数组全局变量使用小结
Jun 05 #PHP
PHP Global变量定义当前页面的全局变量实现探讨
Jun 05 #PHP
PHP 常用数组内部函数(Array Functions)介绍
Jun 05 #PHP
php将gd生成的图片缓存到memcache的小例子
Jun 05 #PHP
深入理解require与require_once与include以及include_once的区别
Jun 05 #PHP
探讨各种PHP字符串函数的总结分析
Jun 05 #PHP
基于php split()函数的用法详解
Jun 05 #PHP
You might like
php桌面中心(三) 修改数据库
2007/03/11 PHP
thinkphp实现发送邮件密码找回功能实例
2014/12/01 PHP
PHP如何实现跨域
2016/05/30 PHP
yii2 RBAC使用DbManager实现后台权限判断的方法
2016/07/23 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
2017/03/15 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
2020/04/26 PHP
如何利用PHP实现上传图片功能详解
2020/09/24 PHP
jQuery 标题的自动翻转实现代码
2009/10/14 Javascript
javascript闭包的理解和实例
2010/08/12 Javascript
window.ActiveXObject使用说明
2010/11/08 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
2014/02/12 Javascript
常规表格多表头查询示例
2014/02/21 Javascript
原生JavaScript实现合并多个数组示例
2014/09/21 Javascript
Javascript解析URL方法详解
2014/12/05 Javascript
jQuery内容折叠效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
动态加载css方法实现和深入解析
2017/01/18 Javascript
BootStrap框架中的data-[ ]自定义属性理解(推荐)
2017/02/14 Javascript
jQuery实现简单复制json对象和json对象集合操作示例
2018/07/09 jQuery
Python多线程编程(一):threading模块综述
2015/04/05 Python
用python写扫雷游戏实例代码分享
2018/05/27 Python
Python动态赋值的陷阱知识点总结
2019/03/17 Python
Python 使用list和tuple+条件判断详解
2019/07/30 Python
python字典和json.dumps()的遇到的坑分析
2020/03/11 Python
详解tensorflow之过拟合问题实战
2020/11/01 Python
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
2021/03/17 Javascript
详解CSS3选择器的使用方法汇总
2015/11/24 HTML / CSS
html5指南-7.geolocation结合google maps开发一个小的应用
2013/01/07 HTML / CSS
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
2014/03/16 面试题
《老王》教学反思
2014/02/23 职场文书
禁止高声喧哗的标语
2014/06/11 职场文书
投标人法定代表人授权委托书格式
2014/09/28 职场文书
学生检讨书怎么写?
2014/10/10 职场文书
骨干教师个人总结
2015/02/11 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
走进毛泽东观后感
2015/06/04 职场文书
文艺委员竞选稿
2015/11/19 职场文书