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 08 PHP
mysql 全文搜索 技巧
Apr 27 PHP
php cookie 作用范围?不要在当前页面使用你的cookie
Mar 24 PHP
PHP程序员面试 切忌急功近利(更需要注重以后的发展)
Sep 01 PHP
第七章 php自定义函数实现代码
Dec 30 PHP
php+ajax做仿百度搜索下拉自动提示框(有实例)
Aug 21 PHP
php中利用explode函数分割字符串到数组
Feb 08 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
Jun 30 PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
Mar 18 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
Aug 25 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
Dec 05 PHP
php弹出提示框的是实例写法
Sep 26 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中var_dump,var_export,print_r三个函数的区别
2013/06/21 PHP
PHP实现的简易版图片相似度比较
2015/01/07 PHP
CodeIgniter配置之config.php用法实例分析
2016/01/19 PHP
php与python实现的线程池多线程爬虫功能示例
2016/10/12 PHP
laravel执行php artisan migrate报错的解决方法
2019/10/09 PHP
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
javascript实现的弹出层背景置灰-模拟(easyui dialog)
2013/12/27 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
让IE8浏览器支持function.bind()方法
2014/10/16 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
JavaScript中逗号运算符介绍及使用示例
2015/03/13 Javascript
JS+CSS实现精美的二级导航效果代码
2015/09/17 Javascript
Node.js的Mongodb使用实例
2016/12/30 Javascript
jQuery阻止事件冒泡实例分析
2018/07/03 jQuery
AngularJS实现与后台服务器进行交互的示例讲解
2018/08/13 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
2020/09/04 Javascript
[01:43]深扒TI7聊天轮盘语音出处4
2017/05/11 DOTA
Python操作json的方法实例分析
2018/12/06 Python
对python 多线程中的守护线程与join的用法详解
2019/02/18 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
css3.0 图形构成实例练习二
2013/03/19 HTML / CSS
瑞典首都斯德哥尔摩的多元奢侈时尚品牌:Acne Studios
2017/07/09 全球购物
尤妮佳moony海外旗舰店:日本殿堂级纸尿裤品牌
2018/02/23 全球购物
某公司Java工程师面试题笔试题
2016/03/27 面试题
酒店保洁主管岗位职责
2013/11/28 职场文书
医校毕业生自我鉴定
2014/01/25 职场文书
女子职高个人自荐书
2014/02/01 职场文书
工程师岗位职责规定
2014/02/26 职场文书
清明节扫墓活动方案
2014/03/02 职场文书
《长城和运河》教学反思
2014/04/14 职场文书
超市开业庆典策划方案
2014/05/14 职场文书
销售提升方案
2014/06/07 职场文书
离婚协议书怎么写
2014/09/12 职场文书
计划生育证明书写要求
2014/09/17 职场文书
车间统计员岗位职责
2015/04/14 职场文书
如何设计高效合理的MySQL查询语句
2021/05/26 MySQL