php全局变量和类配合使用深刻理解
程序员文章站
2022-07-11 08:40:19
情况1: father.php如下定义: 复制代码 代码如下: children.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 会被当成局部变量也引用不到的。
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 会被当成局部变量也引用不到的。
上一篇: 张居正做了什么?大明真的是亡于张居正吗?
下一篇: C# 实体转为json字符串