流程控制与函数应用--php基础最详细教程
流程控制
顺序结构
分支结构/选择结构/条件结构
单路分支 格式:
if(条件){
循环体; //循环体可以是一条或者多条语句。
}
注:if语句条件执行后的结果只有两种真即是成立,执行循环体语句,假即是不成立,退出不执行。
双路分支 格式:
if(条件){
循环体; //循环体可以是一条或者多条语句。
}else{
循环体; //循环体可以是一条或者多条语句。
}
注:if语句条件执行后的结果只有两种真即是成立,执行循环体语句,假即是不成立,执行else大括号中的语句。
多路分支
一种:
格式:
if(条件){
循环体; //循环体可以是一条或者多条语句。
}elseif{
循环体; //循环体可以是一条或者多条语句。
}elseif{
循环体; //循环体可以是一条或者多条语句。
}else if{ //else if 分开写也可以
循环体; //循环体可以是一条或者多条语句。
}else{
循环体; //循环体可以是一条或者多条语句。
}
注:if语句条件执行后的结果只有两种真即是成立,执行循环体语句,
假即是不成立,执行else大括号中的语句。语句间是互斥的,进入一个,
就不会进入其他。 匹配一个范围。
<?php
date_default_timezone_set("PRC");
header("content-type:text/html;charset=utf-8");
$hour = date("H");
if($hour <= 6){
echo "现在是凌晨".$hour;
}elseif($hour <= 9) {
echo "现在是早上".$hour;
}elseif($hour <= 11){
echo "现在是上午".$hour;
}elseif($hour <= 13){
echo "现在是中午".$hour;
}elseif($hour <= 16){
echo "现在是下午".$hour;
}else if($hour <= 19){
echo "现在是傍晚".$hour;
}else if($hour <= 23){
echo "现在是晚上".$hour;
}else{
echo "午夜好".$hour;
}
二种:
格式:
<?php
$louceng = 1;
// 多向分支
switch($louceng){
case 0:
case 1:
echo "沙发";
break;
case 2:
echo "椅子";
break;
case 3:
echo "板凳";
break;
case 4:
echo "地板";
break;
default:
echo "第".$louceng."层";
break;
}
注:主要用于匹配单个值。
<?php
date_default_timezone_set("PRC");
header("content-type:text/html;charset=utf-8");
$week = date("D");
switch($week){
case "Mon":
echo "今天是星期一";
break;
case "Tue":
echo "今天是星期二";
break;
case "Wed":
echo "今天是星期三";
break;
case "Thu":
echo "今天是星期四";
break;
case "Fri":
echo "今天是星期五";
break;
default:
echo "今天是周末";
break;
}
注:字符串类型的值要加引号。
巢状分支/嵌套分支 格式:
if(条件){
循环体;
if(条件){
循环体;
}else{
循环体;
}
}else{
循环体;
if(条件){
循环体;
}else{
循环体;
}
}
注:嵌套尽量不要超过三层。
<?php
date_default_timezone_set("PRC");
header("content-type:text/html;charset=utf-8");
$sex = $_GET["sex"];
$age = $_GET["age"];
//男 60岁退休,女55岁退休。
if($sex == "男"){
echo "这位男同志";
if($age >= 60){
echo "你已经退休了".($age-60)."年";
}else{
echo "你还需要".(60-$age)."年退休";
}
}elseif($sex == "女"){
echo "这位女同志";
if($age >= 55){
echo "你已经退休了".($age-55)."年";
}else{
echo "你还需要".(55-$age)."年退休";
}
}else{
echo "人妖你滚开";
}
注:此实例包含巢状结构和多路分支。
循环结构
条件循环
do while语句格式:
<?php
header("content-type:text/html;charset=utf-8");
echo "<table border="1">";
$i = 0;
do{
echo "<tr>";
$j = 0;
do{
echo "<td>单元格</td>";
$j++;
}while($j<10);
$i++;
echo "</tr>";
}while($i < 10);
echo "</table>";
while语句格式:
<?php
echo "<table border="1">";
//初始值
$i = 0;
//条件
while($i < 10){
echo "<tr>";
$n = 0;
while($n < 10){
echo "<td>".$n."</td>";
$n++;
}
echo "</tr>";
//增量
$i++;
}
echo "</table>";
总结:do while、while语句更适合做条件型循环
do while特点:无论条件成立与否,先执行一次。
while 特点:条件成立,才开始执行。
(do while语句格式:
<?php
header("content-type:text/html;charset=utf-8");
echo "<table border="1">";
$i = 0;
do{
echo "<tr>";
$j = 0;
do{
echo "<td>单元格</td>";
$j++;
}while($j<10);
$i++;
echo "</tr>";
}while($i < 10);
echo "</table>";, while语句格式:
<?php
echo "<table border="1">";
//初始值
$i = 0;
//条件
while($i < 10){
echo "<tr>";
$n = 0;
while($n < 10){
echo "<td>".$n."</td>";
$n++;
}
echo "</tr>";
//增量
$i++;
}
echo "</table>";)
计数循环
for 语句格式:
<?php
for($i = 0; $i < 10; $i++){
echo "<hr/><br />";
}
echo "<table border="1">";
for($i = 0; $i < 10; $i++){
echo "<tr>";
for($n = 0; $n < 10; $n++){
echo "<td>".$n."</td>";
}
echo "</tr>";
}
echo "</table>";
for 语句更适合做计数循环。
(for 语句格式:
<?php
for($i = 0; $i < 10; $i++){
echo "<hr/><br />";
}
echo "<table border="1">";
for($i = 0; $i < 10; $i++){
echo "<tr>";
for($n = 0; $n < 10; $n++){
echo "<td>".$n."</td>";
}
echo "</tr>";
}
echo "</table>";)
特殊流程控制语句
break :可以结束当前for、foreach、switch、 while、do-while结构的执行
实例:
echo "<table border="1" align="center">";
for($i = 0; $i <= 9; $i++){
if($i >= 5){
break;
}
echo "<tr>";
for($j = 0; $j <= 9; $j++){
if($j >= 5){
break; //默认不写就是break 1 退出本层,如果 break 2 将退出外层。
}
echo "<td>".($i*10+$j)."</td>";
}
echo "</tr>";
}
echo "</table>";
continue: 语句只能使用在循环语句内部,功能是跳过该次循环,继续执行下一次循环结构。
在while和do-while语句中continue语句跳转到循环条件处开始继续执行,对于
for循环随后的动作是变量更新
实例:
$sum = 0 ;
for($i = 0; $i <= 10; $i++){
if($i % 2 ==3)
continue;
echo "<br>";
$sum += $i;
}
echo $sum; //55
exit 语句:当前脚本只要执行到exit语句,不管它在那种结构中,都会直接跳出当前脚本。
exit()是一个函数,前面用过的die()函数是它的别名。
$conn = @mysql_connect("localhost", "root", "123456") or exit("连接数据库失败!");
echo $conn; //抑制mysql的错误提示信息 用 @
PHP函数应用
函数的定义
定义: 就是一个被命名的、独立的代码段,它执行特定的任务,并可能给调用它的程序返回一个值。
函数是被命名的:每个函数都有唯一的名称,在程序的其他部分使用该名称,可以执行函数中的语句,称为调用函数。
函数是独立的: 无须程序其他部分的干预,函数便能够单独执行其任务。
函数执行特定的任务: 任务是程序运行时所执行的具体工作,如将一行文本输出浏览器、对数组进行排序、计算立方根等。
函数可以将一个返回值返回给调用它的程序:程序调用函数时,将执行该函数中的语句,而这些语句可以将信息返回给调用它们的程序。
函数的优越性
提高程序的重用性
提高软件的可维护性
提高软件的开发效率
提高软件的可靠性
控制程序设计复杂性
自定义函数
函数的声明
语法格式
function 函数名([参数1, 参数2, ... 参数n])
{
函数体; //可以是多个条代码
return 返回值;
}
说明:参数可以没有,也可以是多个,但小括号要保留。
return 返回值,可以没有 但没有返回值的函数是不完整的。
return 语句结束后,不要在写代码了,因为不会被执行。
函数的命名
命名规范
1.函数命名规则遵循变量命名规则。
2.函数名不区分大小写。
3.不能重复声明函数名一样的函数。
函数的调用
调用格式
函数名();
说明:如 table();
function_exists("table"); 判断函数是否被声明。
函数的参数
形参
就是声明函数声明的参数,参数就是变量,多个变量用逗号分隔。
实参
调用函数时传给形参的数值(数据,也可以是变量或函数等)
注意:函数参数有默认值的形参,放在参数列表的后面。没有默认值的放在前面。
函数的返回值
return 语句在函数体中使用时,有一下两个作用:
return 语句可以向函数调用者返回函数体中任意确定的值。
将程序控制权返回到调用者的作用域,即退出函数。在函数中如果执行了return语句,它后面的语句就不会被执行。
说明:如果函数没有返回值,就只能算是一个执行过程,只依靠函数做一些事情还不够,有时更需要在程序脚本中
使用函数执行后的结果。由于变量的作用域的差异,调用函数的脚本程序不能直接使用函数体里面的信息,但可以
通过关键字return向调用者传递数据。
系统函数
常规参数的函数
就是实参和形参应该个数相等、类型一致。
伪类型参数的函数
mixed 在参数类别出现类型使用mixed 描述的参数,表示可以传入任何类型的值
number 在参数类别出现类型使用 number 描述的参数,表示可以传入整型和浮点型的值。
callback 在参数类别出现类型使用 callback 描述的参数,表示可以传入回调类型的函数。
引用参数的函数
void funName(array &$arg) 在参数类别出现类型使用 &描述的参数,表示可以传入引用参数类型的函数。
默认参数的函数
[ ] 在参数列表中出现使用[]描述的参数 表示该参数有默认值,在调用函数时如果没有指定参数的值,
在函数中会使用参数的默认值。注意:默认值必须是常量表达式,不能是变量、类成员或者函数调用。
但默认值也允许是数组和特殊类型NULL做为默认参数。
可变个数参数的函数
实参(任意)个数大于形参个数的函数。
<?php
//可变长度参数函数:参数长度不是固定的
function show()
{
//获取所有可变参数变量
$params = func_get_args();
print_r($params);
//获取可变参数的个数
//echo func_num_args();
//获取指定的参数值
//echo func_get_arg(1);
echo func_get_arg(0) + func_get_arg(1);
}
show(1,3,4,5);
回调函数
变量函数:如果一个变量后面有括号$var = hello $var(); 就会寻找与变量值同名的函数。
回调函数
$arr = [98,12,1,99,102,898];
//回调函数: 有一个参数值是另外一个函数的函数名,并且会自动调用该函数。
usort($arr,"mysort");
function mysort($a,$b)
{
return $a-$b;
}
print_r($arr);
匿名函数
声明格式:
$user = function($a,$b){ };
//匿名函数 变量赋值形式
$b = 12;
//use 会自动把外部同名变量引入到内部使用
$show = function ($a)use($b)
{
echo 111;
echo $a;
echo $b;
};
$show(1);
递归函数
function total($dirname, &$dirnum, &$filenum){
$dir=opendir($dirname);
readdir($dir)."<br>";
readdir($dir)."<br>";
while($filename=readdir($dir)){
$newfile=$dirname."/".$filename;
if(is_dir($newfile)){
total($newfile, $dirnum, $filenum);
$dirnum++;
}else{
$filenum++;
}
}
closedir($dir);
}
$dirnum=0;
$filenum=0;
total("C:/AppServ/www/phpMyAdmin", $dirnum, $filenum);
echo "目录总数:".$dirnum."<br>";
echo "文件总数:".$filenum."<br>";
function demo($num){
echo $num."<br>";
if($num>0)
demo($num-1);
else
echo "--------------------<br>";
echo $num."<br>";
}
demo(10);
使用自定义函数库
include: 写法:include "other.php"或include ("other.php")
if($className=="Action"){
include "action/".$className.".php";
}elseif($className=="Model"){
include "model/".$className.".php";
}else{
include "public/".$className.".php";
}
require: 写法:require "other.php"或require ("other.php")
include_once: 写法:include_once "other.php"或include_once("other.php")
require_once:写法:require_once "other.php"或require_once("other.php")
如果该文件中的代码已经被包括了,则不会再次
包含否者在进行包含,以确保文件只被包含一次。
(比include、require更耗内存)
(include_once: 写法:include_once "other.php"或include_once("other.php"), require_once:写法:require_once "other.php"或require_once("other.php"))
区别:include 弹出错误也会继续执行。
require 弹出错误不执行。
(include: 写法:include "other.php"或include ("other.php"), require: 写法:require "other.php"或require ("other.php"))
PHP变量的范围
局部变量
局部变量:从存储方式上可分为动态存储和静态存储类型
静态变量
static $变量名 = 变量值
声明的静态变量会在第一次运行函数时,就存储到
内存中不会释放,没调用一次都会直接在内存中取出。
function su(){
static $intt = 1;
$intt++;
echo $intt;
}
su(); //2
su(); //3
su(); //4 声明一次累加一次
普通变量
$变量名 = 变量值
函数中声明变量调用一次,释放一次。
function su(){
$intt = 1;
$intt++;
echo $intt;
}
su(); //2
su(); //2
su(); //2
全局变量
全局变量定义和作用范围
概念:在函数外声明,在变量声明以后直到整个脚本结束前可以使用,包括函数中和{} 中都可以使用。
全局变量传入函数中的方法
传参
$n = 10 ;
$m = 15 ;
function sum($a,$b)
{
$sum = $a + $b;
return $sum;
}
echo sum($n, $m); //25
说明:把全局变量通过函数实参
传入函数中。
$n = 4 ;
function sum($a)
{
echo $a;
$a =10;
echo $a;
}
echo sum($n);
echo "<br>";
echo $n ;
说明:传参,只是把外部变量的值
传进来,改变内部变量值,不会
改变 外部变量。
global
$name = "vilin";
function user()
{
global $name;
echo $name ; //vilin
$name = "pan";
echo $name; //pan
}
user(); //vilin pan
echo "<br>";
echo $name; //pan
echo "<br>";
$name = "helin";
echo "<br>";
user(); //helin pan
说明:global 必须加在变量前才有用。
无论改变函数内部变量还是外部
变量,相对应的变量也会改变。
$name = "vilin";
function user()
{
global $name;
echo $name ; //vilin
$name = "pan";
echo $name; //pan
unset($name);
echo @$name; // 无值
}
user(); //vilin pan
echo "<br>";
echo $name; // 不影响还是 pan
说明: 销毁内部或者外部的值,不影响对方。
$intt = 5;
function su(){
global $intt;
$intt++;
echo $intt;
}
su(); //6
su(); //7
su(); //8 声明一次累加一次
$GLOBALS
$name = "vilin";
function user()
{
$GLOBALS["name"];
echo $GLOBALS["name"];
unset($GLOBALS["name"]);
@var_dump($GLOBALS["name"]);
}
user();
@var_dump($name);
说明:无论改变函数内部还是外部的变量值,
相应的变量值也会改变。销毁内部或者外部,
将都会被消除。
引用传参
$n = 2;
$m = 3;
function sum(&$a,&$b)
{
$a++;
$b++;
return $a + $b;
}
echo sum($n,$m);
echo "<tr>";
echo $n;
说明:sum的参数必须是变量,
无论改变函数内部还是外部的变量值,
相对应的变量值也会改变。
$n = 2;
$m = 3;
function sum(&$a,&$b)
{
$a++;
$b++;
return $a + $b;
}
echo sum($n,$m);
echo "<tr>";
echo $n;
说明:sum的参数必须是变量,
无论改变函数内部还是外部的变量值,
相对应的变量值也会改变。
数组和数组结构
数组的概念
概念:
数组的本质是存储、管理和操作一组变量。属于复合类型的一种。
关于键值对的概念:
$arr = array("id" => 1,"name" => "vilin", "age" => 18, "sex" =>"男");
每个数组可以有多个值,多个值之间用逗号隔开,每个逗号内的数据称为一个单元,每个
单元都是由 键(下标) => 值 也就是键值对组成的。如果不写下标(键),默认会使用
整数作为下标,每个单元的值都必须有下标,通过下标来定位每个值在数组中的位置。
每个单元有且只有一种类型的下标,索引(整数)或者关联(字符串)。
数组的分类
按下标(键)不同分
索引数组
使用整数作为下标(键)。
实例1:
$arr[] = 1;
$arr[] = "vilin";
$arr[] = 26;
$arr[] = "男";
echo "<pre>";
print_r($arr);
echo "</pre>";
关联数组
使用字符串作为下标(键)。
实例2:
$arr["id"] = 1;
$arr["name"] = "vilin";
$arr["age"] = 26;
$arr["sex"] = "男";
$arr["email"] = "ww@qq.com";
echo "<pre>";
print_r($arr);
echo "</pre>";
混合数组
即使用整数又使用字符串作为下标(键).
实例3:
$arr[] = 1;
$arr[10] = "vilin";
$arr["age"] = 26;
$arr[5] = "男";
$arr[] = "ww@qq.com";
echo "<pre>";
print_r($arr);
echo "</pre>";
说明:下标(键)是用来定位值在数组中的位置。每个值只能使用一种类型的下标。 下标也称为键。
按维度不同分
一维数组 :数组内在也没有数组元素。$arr = array(1, vilin, 28, "男");
二维数组:数组内还有数组。
二维数组声明:
$arr[][] = 1; //0 0
$arr[][] = 2; //1 0
$arr[][] = 3; //2 0
$arr[][] = 4; //3 0
直接赋值法声明二维数组。
二维数组声明:
$arr[0][] = 1; //0 0
$arr[0][] = 2; //0 1
$arr[][] = 3; //1 0
$arr[][] = 4; //2 0
直接赋值法声明二维数组。
$arr = [1, "name" => ["vilin","jack","halin"], 24, "男"];
//定位到某个值:
echo $arr["name"][0]; //vilin
多维数组:数组内还有数组,数组内还有数组,各种嵌套。
多维数组实例:
$arr = array(
"user" => array(
array("id" => 1, "name" => "vilin", "age" => 20, "sex" => "男"),
array("id" => 2, "name" => "jack", "age" => 23, "sex" => "女"),
array("id "=> 3, "name" => "halin", "age" => 27, "sex" => "女"),
array("id" => 4, "name" => "ailin", "age" => 23, "sex" => "男")
),
"score" => array(
array("语文" => 89, "数学" => 88, "英语" => 90, "物理" => 84),
array("语文" => 89, "数学" => 88, "英语" => 90, "物理" => 84),
array("语文" => 89, "数学" => 88, "英语" => 90, "物理" => 84),
array("语文" => 89, "数学" => 88, "英语" => 90, "物理" => 84)
),
"地址" => array(
array("电话" => 1345789789, "QQ" => 243507689, "email" => "234@qq.com"),
array("电话" => 1345780467, "QQ" => 243787689, "email" => "ddf@qq.com"),
array("电话" => 1345789876, "QQ" => 249547689, "email" => "2dfd@qq.com"),
array("电话" => 1345780456, "QQ" => 243509087, "email" => "234fjh@qq.com")
)
);
多维数组遍历到表格:
foreach($arr as $tablename => $tables){
echo "<table border="1" align="center">";
echo "<caption><h3>".$tablename."</h3></caption>";
foreach($tables as $rows){
echo "<tr>";
foreach($rows as $colsname => $cols){
echo "<td>".$colsname."=>".$cols."</td>";
}
echo "</tr>";
}
echo "</table>";
}
说明:一维数组、二维数组、多维数组,声明方法都是都是一样的。三种。
数组的定义(声明)方法
1.直接赋值的方式
实例1:索引数组
$arr[] = 1;
$arr[] = "vilin";
$arr[] = 26;
$arr[] = "男";
echo "<pre>";
print_r($arr);
echo "</pre>";
总结:直接赋值法,
如果声明时不指定下标,
默认就从 0 分配索引做下标。
实例2:索引数组
$arr[2] = 1;
$arr[10] = "vilin";
$arr[2] = 26;
$arr[5] = "男";
$arr[] = "ww@qq.com";
echo "<pre>";
print_r($arr);
echo "</pre>";
总结:如果给出索引下标,下一
下标就会从最大的开始每次增一。
如果后面出现前面的下标,就会
覆盖前面的的赋值。
实例3:关联数组
$arr["id"] = 1;
$arr["name"] = "vilin";
$arr["age"] = 26;
$arr["sex"] = "男";
$arr["email"] = "ww@qq.com";
echo "<pre>";
print_r($arr);
echo "</pre>";
实例4:混合数组
$arr[] = 1; //0
$arr[10] = "vilin";
$arr["age"] = 26;
$arr[5] = "男";
$arr[] = "ww@qq.com"; //11
echo "<pre>";
print_r($arr);
echo "</pre>";
总结:混合数组中,索引序列不会被
关联下标影响。
2.使用array( )函数的方式
实例1:关联数组
$brr = array("id" => 1, "name" => "vilin", "age" => 28);
echo "<pre>";
print_r($brr);
echo "</pre>";
实例2:索引数组
$brr = array(1, "vilin", 28);
echo "<pre>";
print_r($brr);
echo "</pre>";
总结:不给出下标,默认索引下标。
3.使用[ ]方式声明数组。
注:php5.3.60以后版本支持此方式 。
实例1:关联数组
$brr = ["id" => 1, "name" => "vilin", "age" => 28];
echo "<pre>";
print_r($brr);
echo "</pre>";
数组的遍历方法
数组的遍历概念
使用一种特定规则来逐个读取数组中的键和值。
for语句
实例:
$brr = array(1, "vilin",28, "qww@qq.com");
for($i=0; $i < count($brr);$i++){
echo "$brr[$i]=>".$brr[$i]."<br>";
}
总结:for语句只能遍历下标,并且下标是连续的。注意$i的值。
foreach 语句
只遍历值
$brr = array("id" => 1,"name" => "vilin","age" => 28, "email" => "qww@qq.com");
foreach($brr as $value){
echo $value."<br>";
}
遍历键和值
$brr = array("id" => 1,"name" => "vilin","age" => 28, "email" => "qww@qq.com");
foreach($brr as $key => $value ){
echo $key."=>".$value."<br>";
}
说明:$key 与 $value 变量名不是固定的。可以任意命名。
list 与 each 语句
list语句实例:
$arr = array(=>"username","sex","age","y");
//$a = $arr[0];$b = $arr[1];
//list可以将一组索引数组单元逐个赋值给一组变量
//把每个值赋给list内的变量
@list($a,$b,$c,$d) = $arr;
echo $a;
echo "<hr/>";
echo $b;
echo "<hr/>";
echo $c;
echo "<hr/>";
echo $d;
$arr = array("user","age"=>10);
/*
0 => 0;//key
1 => "user";//value
"key" =>0
"value" => "user"
执行一次只会解析数组的一个单元,解析出四种类型。
*/
$brr = each($arr); //Array ([1] => user [value] => user [0] => 0 [key] => 0)
$brr = each($arr); //Array([1] => 10 [value] => 10 [0] => age [key] => age)
list($k,$v) = $brr; //$k = $brr[0] $v = $brr[1]
echo $k;
echo "<hr />";
echo $v;
//each() 每次访问一个数组单元,并将指针向下移动一位。将访问的数据单元的键和值,以一个混合数组形式返回。
$brr = each($arr);
var_dump($brr);
$arr = array("vilin","sex","age","y");
while(list($k,$v) = each($arr)){
echo $k."=>".$v."<br>";
总结和foreach一样可以遍历三种的类型的数组。
数组指针
//返回当前指针指向数组单元的值
echo current($arr);
//返回当前指针指向数组单元的键
echo key($arr);
echo "<hr />";
//返回下一个指针位置指向的单元的值
echo next($arr);
echo key($arr);
echo "<hr />";
echo next($arr);
echo key($arr);
echo "<hr />";
//返回上一个指针位置指向的单元的值
echo prev($arr);
echo "<hr />";
////返回最后一个单元的值
echo end($arr);
var_dump(next($arr));
//重置指针到初始状态
reset($arr);
echo current($arr);
预定义数组(超全局数据)
1 服务器变量: $_SERVER
2 环境变量:$_ENV
3 HTTP GET变量:$_GET
4 HHTP POST变量:$_POST
5 request变量:$_REQUEST 可以接收: $_GET,$_POST,$_COOKIE
6 HTTP文件上传变量:$_FILES
7 HTTP Cookies:$_COOKIE
8 Session变量:$_SESSION
9 Global变量:$GLOBALS
echo "<pre>";
print_r($_SERVER);
echo "</pre>";
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: PHP数组函数和字符串函数
- 下一篇: php常用函数之-字符串函数