函数的执行 全局变量
/**
燕十八 公益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: 直接操作超级变局变量.
****/
浙公网安备 33010602011771号