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 相关文章推荐
论坛头像随机变换代码
Oct 09 PHP
PHP分页显示制作详细讲解
Nov 19 PHP
php expects parameter 1 to be resource, array given 错误
Mar 23 PHP
ubuntu10.04配置 nginx+php-fpm模式的详解
Jun 03 PHP
解析PHP正则提取或替换img标记属性
Jun 26 PHP
php中的动态调用实例分析
Jan 07 PHP
php使用ob_flush不能每隔一秒输出原理分析
Jun 02 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
Sep 23 PHP
PHP简单读取PDF页数的实现方法
Jul 21 PHP
Yii2汉字转拼音类的实例代码
Apr 18 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
Apr 20 PHP
php语言注释,单行注释和多行注释
Jan 21 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下载远程文件类(支持断点续传)
2008/11/14 PHP
PHP表单提交表单名称含有点号(.)则会被转化为下划线(_)
2011/12/14 PHP
PHP中new static() 和 new self() 的区别介绍
2015/01/09 PHP
php实现的递归提成方案实例
2015/11/14 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
PHP如何防止用户重复提交表单
2020/12/09 PHP
js 编程笔记 无名函数
2011/06/28 Javascript
jquery实现倒计时代码分享
2014/06/13 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
2014/06/20 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
JavaScript Ajax编程 应用篇
2016/07/02 Javascript
让DIV的滚动条自动滚动到最底部的3种方法(推荐)
2016/09/24 Javascript
原生JS实现的放大镜效果实例代码
2016/10/15 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
2016/10/24 Javascript
用jQuery的AJax实现异步访问、异步加载
2016/11/02 Javascript
jQuery select自动选中功能实现方法分析
2016/11/28 Javascript
JS常用正则表达式总结【经典】
2017/05/12 Javascript
JS实现点击Radio动态更新table数据
2017/07/18 Javascript
bootstrap 通过加减按钮实现输入框组功能
2017/11/15 Javascript
Vue兼容ie9的问题全面解决方案
2018/06/19 Javascript
Vuex入门到上手教程
2018/06/20 Javascript
JavaScript执行环境及作用域链实例分析
2018/08/01 Javascript
JQuery特殊效果和链式调用操作示例
2019/05/13 jQuery
bootstrap+spring boot实现面包屑导航功能(前端代码)
2019/10/09 Javascript
微信小程序修改数组长度的问题的解决
2019/12/17 Javascript
Python设计模式编程中Adapter适配器模式的使用实例
2016/03/02 Python
Python基于回溯法子集树模板解决最佳作业调度问题示例
2017/09/08 Python
python文本数据相似度的度量
2018/03/12 Python
对dataframe进行列相加,行相加的实例
2018/06/08 Python
使用Python在Windows下获取USB PID&amp;VID的方法
2019/07/02 Python
德国黑胶唱片、街头服装及运动鞋网上商店:HHV
2018/08/24 全球购物
国际贸易专业个人求职信范文分享
2013/12/14 职场文书
2014年应届大学生毕业自我鉴定
2014/01/31 职场文书
离婚协议书范本及离婚须知
2014/10/15 职场文书
jQuery ajax - getScript() 方法和getJSON方法
2021/05/14 jQuery
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js