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的FTP学习(一)[转自奥索]
Oct 09 PHP
php中设置index.php文件为只读的方法
Feb 06 PHP
php GUID生成函数和类
Mar 10 PHP
PHP实现163邮箱自动发送邮件
Mar 29 PHP
深入分析PHP优化及注意事项
Jul 04 PHP
PHP加密技术的简单实现
Sep 04 PHP
PHP中字符串长度的截取用法示例
Jan 12 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
Feb 18 PHP
yii框架redis结合php实现秒杀效果(实例代码)
Oct 26 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 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
自己在做项目过程中学到的PHP知识收集
2012/08/20 PHP
实例讲解通过​PHP创建数据库
2019/01/20 PHP
最新28个很棒的jQuery 教程
2011/05/28 Javascript
Query中click(),bind(),live(),delegate()的区别
2013/11/19 Javascript
js清空表单数据的两种方式(遍历+reset)
2014/07/18 Javascript
学习JavaScript设计模式(策略模式)
2015/11/26 Javascript
JavaScript中windows.open()、windows.close()方法详解
2016/07/28 Javascript
Bootstrop实现多级下拉菜单功能
2016/11/24 Javascript
走进javascript——不起眼的基础,值和分号
2017/02/24 Javascript
jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解
2017/05/01 jQuery
Angular 2父子组件数据传递之@Input和@Output详解 (上)
2017/07/05 Javascript
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
2017/11/06 Javascript
js判断浏览器的环境(pc端,移动端,还是微信浏览器)
2020/12/24 Javascript
vue实现购物车选择功能
2020/01/10 Javascript
24个解决实际问题的ES6代码片段(小结)
2020/02/02 Javascript
uni-app从安装到卸载的入门教程
2020/05/15 Javascript
[01:56]《DOTA2》中文配音CG
2013/04/22 DOTA
Python中使用bidict模块双向字典结构的奇技淫巧
2016/07/12 Python
Python高级用法总结
2018/05/26 Python
python利用pandas将excel文件转换为txt文件的方法
2018/10/23 Python
Python Django2.0集成Celery4.1教程
2019/11/19 Python
使用opencv将视频帧转成图片输出
2019/12/10 Python
Python networkx包的实现
2020/02/14 Python
python画图常规设置方式
2020/03/05 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
通过代码实例解析Pytest运行流程
2020/08/20 Python
python实现简单贪吃蛇游戏
2020/09/29 Python
浅谈css3中的渐进增强和优雅降级
2017/12/01 HTML / CSS
YSL圣罗兰美妆官方旗舰店:购买YSL口红
2018/04/16 全球购物
企业厂务公开实施方案
2014/03/26 职场文书
民族团结先进个人事迹材料
2014/06/02 职场文书
落实八项规定专题民主生活会对照检查材料
2014/09/15 职场文书
村主任“四风”问题个人整改措施
2014/10/04 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
大学三好学生主要事迹范文
2015/11/03 职场文书
Python基础详解之描述符
2021/04/28 Python