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全排列递归算法代码
Oct 09 PHP
ThinkPHP模板中判断volist循环的最后一条记录的验证方法
Jul 01 PHP
PHP中使用虚代理实现延迟加载技术
Nov 05 PHP
9个实用的PHP代码片段分享
Jan 22 PHP
php生成圆角图片的方法
Apr 07 PHP
PHP内核探索:哈希表碰撞攻击原理
Jul 31 PHP
Yii实现单用户博客系统文章详情页插入评论表单的方法
Dec 28 PHP
Symfony控制层深入详解
Mar 17 PHP
Zend Framework实现自定义过滤器的方法
Dec 09 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
Aug 25 PHP
TP5框架实现一次选择多张图片并预览的方法示例
Apr 04 PHP
PHP高并发和大流量解决方案整理
Mar 09 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 木马攻击防御技巧
2009/06/13 PHP
php读取富文本的时p标签会出现红线是怎么回事
2014/05/13 PHP
PHP将字符串首字母大小写转换的实例
2017/01/21 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
PHP精确到毫秒秒杀倒计时实例详解
2019/03/14 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
jQuery学习7 操作JavaScript对象和集合的函数
2010/02/07 Javascript
基于JQuery制作的产品广告效果
2010/12/08 Javascript
javascript中onclick(this)用法介绍
2013/04/19 Javascript
jQuery实现仿Alipay支付宝首页全屏焦点图切换特效
2015/05/04 Javascript
servlet+jquery实现文件上传进度条示例代码
2017/01/25 Javascript
Angular利用trackBy提升性能的方法
2018/01/26 Javascript
vue.js做一个简单的编辑菜谱功能
2018/05/08 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
2018/10/12 Javascript
使用webpack4编译并压缩ES6代码的方法示例
2019/04/24 Javascript
nodejs搭建本地服务器并访问文件操作示例
2019/05/11 NodeJs
ES6的异步终极解决方案分享
2019/07/11 Javascript
linux 下以二进制的方式安装 nodejs
2020/02/12 NodeJs
vue实现移动端返回顶部
2020/10/12 Javascript
Python图像处理之识别图像中的文字(实例讲解)
2018/05/10 Python
python实现多张图片拼接成大图
2019/01/15 Python
Python基础教程之if判断,while循环,循环嵌套
2019/04/25 Python
python对文件目录的操作方法实例总结
2019/06/24 Python
python tkinter控件布局项目实例
2019/11/04 Python
使用python 计算百分位数实现数据分箱代码
2020/03/03 Python
基于Python数据分析之pandas统计分析
2020/03/03 Python
Python定时任务APScheduler安装及使用解析
2020/08/07 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
巴西最好的男鞋:Rafarillo
2018/05/25 全球购物
Java的五个基础面试题
2016/02/26 面试题
办公室主任职责范文
2013/11/08 职场文书
党员承诺践诺书
2014/05/20 职场文书
2014幼儿园大班工作总结
2014/11/10 职场文书
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
2022/04/14 Python
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python