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 会被当成局部变量也引用不到的。

(0)

相关推荐

  • php数组声明、遍历、数组全局变量使用小结

    php教程:数组声明,遍历,数组全局变量 复制代码 代码如下: <? /* * 一.数组的概述 * 1.数组的本质:管理和操作一组变量,成批处理 * 2.数组时复合类型(可以存储多个) * 3.数组中可以存储任意长度的数据,也可以存储任意类型的数据 * 4.数组可以完成其他语言数据结构的功能(链表,队列,栈,集合类) * * * * 二.数组的分类 * 数组中有多个单元,(单元称为元素) * 每个元素(下标[键]和值) * 单访问元素的时候,都是通过下标(键)来访问元素 * 1.一维数组,二维数

  • php unset全局变量运用问题的深入解析

    PHP unset全局变量在实际使用中只能销毁局部变量,并不能实现全局变量的目的.下面我们就来具体解决这一问题.希望对大家有所帮助. PHP中语言中有些函数对于初学者来说在字面上是很难理解的,需要在实际编码中总结经验,来掌握这些知识.我们今天要为大家介绍的是PHP unset全局变量在使用中遇到的一些问题. PHP 中有个释放变量的语句叫做unset(从PHP4开始unset已经不再是一个函数了,而是一个语句),前几天用unset的时候出了点问题,于是把 unset问题总结如下.如果您仔细阅读过

  • PHP Global变量定义当前页面的全局变量实现探讨

    PHP Global变量在实际应用中会发现许多问题需要我们不断的去完善处理.我们在这篇文章中就针对PHP Global变量出现的问题给出了一些具体的解决办法. 1:PHP Global变量的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件 复制代码 代码如下: $a=123; function aa() { Global $a; //如果不把$a定义为global变量 ,函数体内是不能访问$a的 echo $a; } aa(

  • PHP超级全局变量数组小结

    php超级全局变量列表 $_GET[] 获得以GET方法提交的变量数组 $_POST[] 获得以POST方法提交的变量数组 $_COOKIE[] 获取和设置当前网站的Cookie标识 $_SESSION[] 取得当前用户访问的唯一标识,以数组形式体现,如sessionid以及自定义session数据 $_ENV[] 当前php环境变量数组 $_SERVER[] 当前php服务器变量数组 $_FILES[] 上传文件时提交到当前脚本的参数值,以数组形式体现 $_REQUEST[] 包含当前脚本提交

  • php中全局变量global的使用演示代码

    我来给处入行的人讲解一下全局变量global的使用,"全局变量",这个名词中的全局两个字已经告诉我们这个变量在各个地方都能用,先看一个实例: 复制代码 代码如下: <?php $a = 1; $b = 2; function Sum() { global $a, $b; //在里面声明为全局变量 $b = $a + $b; } Sum(); echo $b; ?> 结果: 3 如果没有全局变量global在方法内是不能获得$a,$b值的,所以在方法里面想用外面的变量就需要先

  • php 获取全局变量的代码

    复制代码 代码如下: function cleanGlobal($global_array, $arg, $specialchars = true, $default = null) {         if(key_exists($arg, $global_array) && $global_array[$arg] != null && $global_array[$arg] != "") {                 if($specialch

  • PHP中的超全局变量

    PHP中的超全局变量 从PHP 4.2.0 开始,register_globals 的默认值为 off,这样一来,以前的很多可以直接使用的变量,如 $PHP_SELF 或者你设定的SESSION变量都不能用 "$变量名"的形式访问了,这可能会给你带来很多不变,但却有助于安全性的提高.访问这些变量,你需要使用PHP 超全局变量,如下: $_SERVER 变量由 Web 服务器设定或者直接与当前脚本的执行环境相关联.类似于旧数组 $HTTP_SERVER_VARS 数组.以前的$PHP_S

  • 认识并使用PHP超级全局变量

    认识并使用PHP超级全局变量 超级全局变量也叫做预定义变量,是PHP系统中自带的变量,它可让你的程序设计更加的方便快捷.它的类型包括: $GLOBALS 包含一个引用指向每个当前脚本的全局范围内有效的变量.该数组的键名为全局变量的名称.从 PHP 3 开始存在 $GLOBALS 数组. $_SERVER 变量由 web 服务器设定或者直接与当前脚本的执行环境相关联.类似于旧数组 $_GET 经由 URL 请求提交至脚本的变量. $_POST 经由 HTTP POST 方法提交至脚本的变量. $_

  • php 全局变量范围分析

    复制代码 代码如下: <?php $a = 1 ; include 'b.inc' ; ?> 这里变量 $a 将会在包含文件 b.inc 中生效.但是,在用户自定义函数中,一个局部函数范围将被引入.任何用于函数内部的变量按缺省情况将被限制在局部函数范围内. 复制代码 代码如下: <?php $a = 1 ; /* global scope */ function Test () { echo $a ; /* reference to local scope variable */ } T

  • PHP中全局变量global和$GLOBALS[]的区别分析

    一.举例比较 例一: 复制代码 代码如下: <?php $var1 = 1; function test(){ unset($GLOBALS['var1']); } test(); echo $var1; ?> 因为$var1被删除了,所以什么东西都没有打印. 例二: 复制代码 代码如下: <?php $var1 = 1; function test(){ global $var1; unset($var1); } test(); echo $var1; ?> 意外的打印了1.证明

  • PHP中函数内引用全局变量的方法

    先看下面的代码: 复制代码 代码如下: <?php $var1 = "#####"; $var2 = "&&&&&"; function global_references($use_globals) { global $var1, $var2; if (!$use_globals) { $var2 =&$var1; //1 } else { $GLOBALS["var2"] =&$v

随机推荐