php全局变量和类配合使用全解析

来源:互联网 发布:linux c和windows c 编辑:程序博客网 时间:2024/05/16 14:18
 

情况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.phpnewclass a.class ,而a.class.php的一个函数中requireBfold文件夹下的b.php,这个require../Bfold/b.php)报错,Warning: ……


因为你让服务器当前执行的是c.php文件,所以php解析的时候是把路径相对于c.php而言的,你试试把(../Bfold/b.php)改成(Bfold/b.php)看看,应该就不会报错了。

 

 

 

 

下面是程序例子,说明在函数内部使用require_onceA.php.

 

require_once的理解:

假设B.php中引用了require_once(A.php);这条语句。。

那么其实是相当于调用了A.php这个匿名的lambda函数去执行。如下图:


 本地图片,请重新上传

 

C.php在一个函数调用中requireB.php------》

 

B.php在普通语句中requireA.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,感觉在这个调用的过程中,相对BA根运行环境是C的调用函数的环境,但C的调用函数如果要使用BA中的变量,就没有办法了。。

 

如果用global $a,去引用,那么由于$a在这种情况下不属于全局变量,引用不到。

如果用$a去引用,那么由于$a会被当成局部变量也引用不到的。。。


0 0
原创粉丝点击