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环境配置 php5 mysql5 apache2 phpmyadmin安装与配置
Nov 17 PHP
介绍几个array库的新函数 php
Dec 29 PHP
php 分页原理详解
Aug 21 PHP
用PHP实现读取和编写XML DOM代码
Apr 07 PHP
php和js如何通过json互相传递数据相关问题探讨
Feb 26 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
Aug 06 PHP
php提取字符串中网站url地址的方法
Dec 03 PHP
PHP多线程类及用法实例
Dec 03 PHP
thinkphp3.0输出重复两次的解决方法
Dec 19 PHP
PHP使用mkdir创建多级目录的方法
Dec 22 PHP
PHP的PDO预处理语句与存储过程
Jan 27 PHP
PHP下用Swoole实现Actor并发模型的方法
Jun 12 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调用mysql存储过程
2007/02/14 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
2016/03/22 PHP
解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题
2020/08/24 PHP
javascript 学习之旅 (1)
2009/02/05 Javascript
Jquery异步请求数据实例代码
2011/12/28 Javascript
重构Javascript代码示例(重构前后对比)
2013/01/23 Javascript
css结合js制作下拉菜单示例代码
2014/02/27 Javascript
函数式 JavaScript(一)简介
2014/07/07 Javascript
AngularJS中比较两个数组是否相同
2016/08/24 Javascript
jquery仿ps颜色拾取功能
2017/03/08 Javascript
AngularJS集合数据遍历显示的实例
2017/12/27 Javascript
OkHttp踩坑随笔为何 response.body().string() 只能调用一次
2018/01/08 Javascript
jQuery实现的下雪动画效果示例【附源码下载】
2018/02/02 jQuery
jQuery实现适用于移动端的跑马灯抽奖特效示例
2019/01/18 jQuery
Nuxt使用Vuex的方法示例
2019/09/06 Javascript
layui 监听select选择 获取当前select的ID名称方法
2019/09/24 Javascript
jQuery模仿ToDoList实现简单的待办事项列表
2019/12/30 jQuery
[41:21]夜魇凡尔赛茶话会 第三期02:看图识人
2021/03/11 DOTA
详解用Python处理HTML转义字符的5种方式
2017/12/27 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
2018/05/28 Python
python 2.7.13 安装配置方法图文教程
2018/09/18 Python
python3 unicode列表转换为中文的实例
2018/10/26 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
Python 操作 ElasticSearch的完整代码
2019/08/04 Python
Python多线程及其基本使用方法实例分析
2019/10/29 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
Python collections.defaultdict模块用法详解
2020/06/18 Python
Python GUI库Tkiner使用方法代码示例
2020/11/27 Python
实例教程 一款纯css3实现的数字统计游戏
2014/11/10 HTML / CSS
蔻驰法国官网:COACH法国
2018/11/14 全球购物
英国100%防污和防水的靴子:Muck Boot Company
2020/09/08 全球购物
旷课检讨书3000字
2014/02/04 职场文书
学生会竞聘书范文
2014/03/31 职场文书
政府会议通知范文
2015/04/15 职场文书
Redis三种集群模式详解
2021/10/05 Redis
V Rising 服务器搭建图文教程
2022/06/16 Servers