频道栏目
首页 > 资讯 > 全局变量 > 正文

php全局变量和类配合使用深刻理解

16-01-08        来源:[db:作者]  
收藏   我要投稿
本文详细介绍下php全局变量和类在多种情况下的配合使用,感兴趣的朋友可以参考下哈,希望对大家有所帮助。
情况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 会被当成局部变量也引用不到的。
相关TAG标签
上一篇:去掉CodeIgniter URL中的index.php
下一篇:Codeigniter实现处理用户登录验证后的URL跳转
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站