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正则
Jul 07 PHP
PHP下几种删除目录的方法总结
Aug 19 PHP
PHP中header和session_start前不能有输出原因分析
Jan 11 PHP
浅析php中jsonp的跨域实例
Jun 21 PHP
Yii调试SQL的常用方法
Jul 09 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
Sep 06 PHP
Laravel 5框架学习之模型、控制器、视图基础流程
Apr 08 PHP
php中smarty区域循环的方法
Jun 11 PHP
一个PHP实现的轻量级简单爬虫
Jul 08 PHP
PHP中str_split()函数的用法讲解
Apr 11 PHP
Codeigniter里的无刷新上传的实现代码
Apr 14 PHP
php策略模式简单示例分析【区别于工厂模式】
Sep 25 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
phpmail类发送邮件函数代码
2012/02/20 PHP
php遍历数组的方法分享
2012/03/22 PHP
PHP操作Memcache实例介绍
2013/06/14 PHP
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
使用PHPMailer实现邮件发送代码分享
2014/10/23 PHP
php计划任务之ignore_user_abort函数实现方法
2015/01/08 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
2020/03/16 PHP
javascript 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
2009/04/07 Javascript
jQuery验证Checkbox是否选中的代码 推荐
2011/09/04 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
2014/06/07 Javascript
JS实现模拟风力的雪花飘落效果
2015/05/13 Javascript
简单实现兼容各大浏览器的js复制内容到剪切板
2015/09/09 Javascript
学习 NodeJS 第八天:Socket 通讯实例
2016/12/21 NodeJs
Vue.js列表渲染绑定jQuery插件的正确姿势
2017/06/29 jQuery
NodeJS 实现多语言的示例代码
2018/09/11 NodeJs
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
2020/12/19 Vue.js
[01:24]DOTA2上海特锦赛OG战队抵达 专车接机入驻总统套房
2016/02/23 DOTA
使用python获取CPU和内存信息的思路与实现(linux系统)
2014/01/03 Python
理解python多线程(python多线程简明教程)
2014/06/09 Python
Python构建网页爬虫原理分析
2017/12/19 Python
pyqt5 从本地选择图片 并显示在label上的实例
2019/06/13 Python
pygame实现成语填空游戏
2019/10/29 Python
python集合的新增元素方法整理
2020/12/07 Python
html5中为audio标签增加停止按钮动作实现方法
2013/01/04 HTML / CSS
英国时尚家具、家居饰品及礼品商店:Graham & Green
2016/09/15 全球购物
俄罗斯护发和专业化妆品购物网站:Hihair
2019/09/28 全球购物
早晨薰衣草在线女性精品店:Morning Lavender
2021/01/04 全球购物
南京迈特望C/C++面试题
2012/07/09 面试题
老同学聚会感言
2014/02/23 职场文书
感恩母亲节演讲稿
2014/05/07 职场文书
检察院对照“四风”认真查找问题落实整改措施
2014/09/26 职场文书
2015小学教师年度考核工作总结
2015/05/12 职场文书
美丽心灵观后感
2015/06/01 职场文书
《鲸》教学反思
2016/02/23 职场文书