函数的执行 全局变量

/** 
燕十八 公益PHP培训 
课堂地址:YY频道88354001 
学习社区:www.zixue.it 
**/

// 函数的执行权与执行权的交回.

function t() {
echo 'a<br />';
echo 'b<br />';
echo 'c<br />';
}


echo 'x','<br />';

echo 'z','<br />';

// 运行 x z
// 函数并没有发挥作用,因为没有调用.

 

/**
函数就像一台加工机,
如豆浆机,如洗衣机等,

豆浆机,洗衣机,人不去调用,会自动运行吗?


同理:函数写好后,并不会自动的发挥作用,得调用时,才能发挥.

**/


echo 'x','<br />';
t(); //
echo 'z','<br />'; // z是等到 t函数运行结束后,才运行的


function t3() {
echo 't3<br />';
}

function t2() {
echo 't2<br />';
t3();
}


function t1() {
t2();
echo 't1','<br />';
}


t1();

 


/***
总结:
当调用函数的时候,
程序的执行权 进入到 函数内部.

问:
程序的执行权,进入到函数内部之后
什么时候,交出来执行权呢?
***/

 

// 函数执行权的交回


function foo() {
echo 'a';
echo 'b';
echo 'c';
echo '<br />';
}


echo 'x','<br />';

foo();


echo 'z','<br />';

// x a b c z
/*

当函数语句运行完之后,执行权就交回.
或者是碰到 return 之后,函数也会交回执行权.

 

*/


function bar() {
echo 'a';
echo '<br />';

return;

echo 'b';
echo 'c';
}

 

echo '<hr />';

echo 'x','<br />';
bar();
echo 'z','<br />';

 


function test() {
return 'hello';
return 'wolrd';
}

echo '哈哈<br />';
echo test();
echo '呵呵<br />';


/***
上面的例子,体现了函数碰到return,就交回执行权.


一个函数如果在return 后面写一些语句-----没有意义的.
***/

 

/*
函数 既然比喻成 加工机

入口 -> 原料->传参数

函数体->加工

出口 -->加工结果


// 大学("有为青年")
// 返回: 码农,屌丝....

*/

 

// 求和函数
function sum($num1,$num2) {
return $num1 + $num2;
}


// 函数调用,返回一个结果的.
// 结果,就是return 的值
$s = sum(3,2); // sum(3,2)返回 5, 5赋给$s
echo $s,'<br />'; // 5

 


// 但是 我们知道,函数是可以没有"return 语句的",没有return 语句,返回 null
function t() {
$num = 9999;
}

$s = t();
var_dump($s);


// 或者有的时候,函数确实结束,但又没必要返回值,因此,只写一个return
function t2() {
$num = 666;
return;
echo 'aaaa';
}

echo '<hr />';
$s = t2();

var_dump($s);

 

/****

调用函数的返回值,
即是return 的值.

如果没有return语句,或者 "return;"
则返回值是 NULL

****/


/***
思考: 函数可不可以return回来2个值?

答: 不可能,函数的定义就决定了不能.
从数学上来,一组确定的参数,只能得到一个确定的函数结果.

从程序来说,return 值1; 之后,函数结束,也不可能再return第2个值.


有同学说:用数组
return array(1,2); // 数组是一个值,只不过是一个复合值.


有同学说: return $a,$b;
***/

/*
function t3() {
return 3,9; // 语法错误
}
*/

 

// 动态函数
// 即 函数的名字 可以用变量来表示.

function wel() {
echo '欢迎<br />';
}


function love() {
echo '斯密达<br />';
}

function cry() {
echo '55<br />';
}


// 执行哪一个呢? 不一定,
// 决定,用户输入哪个函数名,我就执行哪个函数


$func = $_GET['func']; // wel/love/cry

echo $func,'<br />';

$func(); // 加个小括号来调用,则会把$func的值,当成"函数名" ,来调用该函数.

// PHP的灵活之处,以后学面向对象时,类名字也可以是变量.
// 同样的操作在java里,就要用反射.

 

function t($num) {
$num += 5;
}

$age = 19;

t($age);


echo $age,'<br />'; // 19
/*
function t($num) 运行

{
$num = $age; //$age把值 赋给$num
$num += 5;
}
*/

 

// 函数参数的的引用赋值


function foo(&$num) { // 此处,即是指,传参,不再是传实参的值,而是传实参的地址
$num += 5;
}

foo($age);
/**/
function foo(&$num)
{
$num = &$age; // 此时,函数内部的$num,指向外部的一个全局变量的地址.
$num += 5; // 因此,num变,影响了外部了的$age变.
}


echo $age,'<br />'; // $age受到了foo函数的影响,


/***
同时,我们也可以看到:

函数局部内的变量 ,和全局的变量,
并不是水火不容,谁都不机会碰到谁的.

是有机会相互影响的, 比如上面的 引用传参.

以及: 超级全局变量.


***/

 

/*
一般情况下,页面内声明的"普通全局变量",
在函数内访问不到.

但是: 常量 在函数能访问到
而且,还有一类变量 ----- 超级变局变量.

超级全局变量,非常猛, 在页面的任意一处,
无论是多深层的函数内,还是以后的对象的方法体内.都可以直接访问到.

*/

/*
九大超级变局变量[注意,全大写]

$_GET // 地址栏的参数
$_POST // 接POST型的表单参数经(比如,用户注册时的内容,往往用$_POST来接)
$_REQUEST // 默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组,即$_REQUEST是前3者一个并集
// 比如不想区分 $_GET,$_POST,可以用$_REQUEST来代替

$_FILES // 文件上传时学

$_COOKIE //
$_SESSION // 用户登陆时学

$_ENV
$_SERVER // 服务器还有访客的一些信息

$GLOBALS // 所有变量的一个注册表

*/


function t2() {
echo '你想注册<br />';
echo '姓名是',$_POST['username'],'<br />';
echo 'email是',$_POST['email'],'<br />';
echo '性别是',$_POST['gender'];
}

 

function t() {
$id = $_GET['id'];
echo '如果我会mysql,将会取出',$id,'号帖子的内容给你,<br />';


echo '<hr />';

t2();
}


t();

// id, email等都能打印出来,
// 这就说明,超全局变量,即使在函数内,甚至深层调用的函数内,也一样能接收到.

//U' R U2 R' U' R U' R'
print_r($_REQUEST);

 

header('content-type: text/html; charset=utf-8;');


// $_SERVER,放置的是 运行脚本的当前服务器信息,和当前运行的环境信息


// 有一天,经理告诉你, 把来访者的IP 记录下来,便于分析,
// 国内,哪一个省的用户最多.
// 并且,分析分析,用户使用的是什么浏览器


echo '你来自于',$_SERVER['REMOTE_ADDR'],'<br />';

echo '你的浏览器信息是',$_SERVER['HTTP_USER_AGENT'];


/**
为什么有的论坛,有一种动态签名档
你去访问的时候显示:

你好,来自于北京电信的朋友,你使用的是firefox浏览器,windows操作系统.

**/

 

// $GLOBALS

// $GLOBALS是页面内 所有全局变量的一个"名单",在GLOBALS里,
// 你能找到你声明过的所有变量

 

$a = 3;
$b = 'hello';


print_r($GLOBALS);


$c = 'world';

print_r($GLOBALS);


// 而$GLOBALS又是超变局的,
// 这意味着: 我们通过$BLOBALS可以操作普通的全局变量.


?>

 

 

<?php
//写出如下程序的输出结果

echo '<br />';

$var1 = 5;
$var2 = 1; // 普通全局变量,在GLOBALS里注册

function get_value(){
$var1 = 0; // 局部的$var1
$GLOBALS['var2']++; // 影响全局的var2 ,变成2
}

get_value();

echo $var1,"<br />";
echo $var2;

 

$age = 5;

function t() {
global $age; // global关键字,用在变量名前,声明:这个变量用的是"变局范围"内的$age
// 而不要在局部内生成$age
$age++;
}


t();

echo $age; //

/****
函数 和 全局变量, 并不是水火不容,

1: 通过引用传参,能影响全局变量

2: 通过global声明, 也能直接使用外部的变量 (不推荐,好多公司明确禁止使用global,自己想想危害)

3: 直接操作超级变局变量.

****/

posted on 2012-09-28 16:04  besile  阅读(281)  评论(0)    收藏  举报