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 构造函数construct的前下划线是双的_
Dec 08 PHP
PHP仿盗链代码
Jun 03 PHP
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
Nov 11 PHP
php生成shtml类用法实例
Dec 09 PHP
php将图片保存入mysql数据库失败的解决方法
Dec 27 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
Feb 15 PHP
php插入mysql数据返回id的方法
May 31 PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
Jul 30 PHP
PHP登录验证功能示例【用户名、密码、验证码、数据库、已登陆验证、自动登录和注销登录等】
Feb 25 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
May 08 PHP
java解析json方法总结
May 16 PHP
PHP使用Redis队列执行定时任务实例讲解
Mar 24 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
一个目录遍历函数
2006/10/09 PHP
php的大小写敏感问题整理
2011/12/29 PHP
如何用PHP来实现一个动态Web服务器
2015/07/29 PHP
laravel ORM关联关系中的 with和whereHas用法
2019/10/16 PHP
tp5 实现列表数据根据状态排序
2019/10/18 PHP
使用TextRange获取输入框中光标的位置的代码
2007/03/08 Javascript
JS getAttribute和setAttribute(取得和设置属性)的使用介绍
2013/07/10 Javascript
用javascript读取xml文件读取节点数据
2014/08/12 Javascript
js实现div弹出层的方法
2014/11/20 Javascript
javascript创建cookie、读取cookie
2016/03/31 Javascript
Javascript 实现微信分享(QQ、朋友圈、分享给朋友)
2016/10/21 Javascript
Javascript 引擎工作机制详解
2016/11/30 Javascript
nodejs后台集成ueditor富文本编辑器的实例
2017/07/11 NodeJs
jQuery 禁止表单用户名、密码自动填充功能
2017/10/30 jQuery
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
2017/11/19 Javascript
nodejs搭建本地服务器轻松解决跨域问题
2018/03/21 NodeJs
在小程序中使用canvas的方法示例
2018/09/17 Javascript
Vue 后台管理类项目兼容IE9+的方法示例
2019/02/20 Javascript
使用js和canvas实现时钟效果
2020/09/08 Javascript
[01:04:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第二场 1月31日
2021/03/11 DOTA
python django集成cas验证系统
2014/07/14 Python
Python实现数据库编程方法详解
2015/06/09 Python
Python+django实现文件下载
2016/01/17 Python
浅析python中numpy包中的argsort函数的使用
2018/08/30 Python
Python3.0 实现决策树算法的流程
2019/08/08 Python
Pytorch 数据加载与数据预处理方式
2019/12/31 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
浅析css3中matrix函数的使用
2016/06/06 HTML / CSS
SQL Server里面什么样的视图才能创建索引
2015/04/17 面试题
入党自我鉴定范文
2013/10/04 职场文书
空乘英文求职信
2014/04/13 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
贷款承诺书
2015/01/20 职场文书
项目经理岗位职责
2015/01/31 职场文书
Python基础之pandas数据合并
2021/04/27 Python
python机器学习创建基于规则聊天机器人过程示例详解
2021/11/02 Python