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 相关文章推荐
php上的memcache和memcached两个pecl库
Mar 29 PHP
洪恩在线成语词典小偷程序php版
Apr 20 PHP
php模板函数 正则实现代码
Oct 15 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
Apr 08 PHP
php无限分类且支持输出树状图的详细介绍
Jun 19 PHP
php使用curl访问https示例分享
Jan 17 PHP
php程序员应具有的7种能力小结
Nov 27 PHP
Symfony2 session用法实例分析
Feb 04 PHP
PHP实现可自定义样式的分页类
Mar 29 PHP
Zend Framework入门教程之Zend_Config组件用法详解
Dec 09 PHP
PHP实现的登录页面信息提示功能示例
Jul 24 PHP
PHP常用正则表达式精选(推荐)
May 28 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
利用 window_onload 实现select默认选择
2006/10/09 PHP
PHP中call_user_func_array()函数的用法演示
2012/02/05 PHP
基于PHP array数组的教程详解
2013/06/05 PHP
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
在线编辑器的实现原理(兼容IE和FireFox)
2007/03/09 Javascript
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
腾讯的ip接口 方便获取当前用户的ip地理位置
2010/11/25 Javascript
Safari5中alert的无限循环BUG
2011/04/07 Javascript
JavaScript打印iframe内容示例代码
2013/08/20 Javascript
js中的布尔运算符使用介绍
2013/11/20 Javascript
javascript+canvas制作九宫格小程序
2014/12/28 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
jquery.qtip提示信息插件用法简单实例
2016/06/17 Javascript
深入理解JavaScript创建对象的多种方式以及优缺点
2017/06/01 Javascript
在vue项目中使用md5加密的方法
2018/09/14 Javascript
vue-cli 3.0 自定义vue.config.js文件,多页构建的方法
2018/09/19 Javascript
vue实现随机验证码功能的实例代码
2019/04/30 Javascript
详解Vue.js和layui日期控件冲突问题解决办法
2019/07/25 Javascript
vue 兄弟组件的信息传递的方法实例详解
2019/08/30 Javascript
javascript开发实现贪吃蛇游戏
2020/07/31 Javascript
微信小程序实现点击导航条切换页面
2020/11/19 Javascript
[01:31](回顾)杀出重围,决战TI之巅
2014/07/01 DOTA
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
python实现远程控制电脑
2019/05/23 Python
Python3 搭建Qt5 环境的方法示例
2020/07/16 Python
对Python 字典元素进行删除的方法
2020/07/31 Python
COSETTE官网:奢华,每天
2020/03/22 全球购物
Miller Harris官网:英国小众香水品牌
2020/09/24 全球购物
上海期货面试题
2014/01/31 面试题
Linux如何压缩可执行文件
2014/03/27 面试题
《影子》教学反思
2014/02/21 职场文书
英文推荐信格式范文
2014/05/09 职场文书
学校党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
基层干部个人对照检查及整改措施
2014/10/28 职场文书
写景作文评语集锦
2014/12/25 职场文书
客户答谢会致辞
2015/07/30 职场文书