在接触面向对象(OOP)编程之前,最基础的编程就是面向过程式编程。就我而言,可以将面向过程编程看作生活的问题处理,按照发现问题-探索问题-解决问题流水线方式解决问题。
这里描述几个面向过程的关键问题:
- 开发函数
- 提示数据类型
- 设置函数返回值的数据类型
- 迭代器
- 生成器构造迭代器
开发函数
- 首先介绍函数的基本结构
function关键字+函数名+参数+代码体+返回值
function 函数名($参数){
/*
*执行代码
*/
return $result; //返回结果
}
-
针对函数的类型又可以分成几种:可选参数、必须设置参数
- 可选参数和必须设置参数:通过给参数设置默认值标识为可选参数,其余为必须设置的参数。
function func1($param1, $param2=null){
//$param1为在调用函数时必须参数,$param2为可选参数
//函数体
}
- 针对函数的数量又分为固定参数和不定参数
-不定参数使用…$参数名表示:在程序调用函数时,函数的形参值为实参组成的数组。
function func2(...$param){
//$param为实参组成的数组
//函数体
}
- 函数的递归调用:函数不断调用自身的机制
从下面的代码就可以看错递归的两大要素:终止条件+递归代码
(补充,在递归函数中,static静态变量的使用几率大大增加)
//统计1到$num的和
function recursionFunc($num){
if($num == 1){
return 1;}
else{
return $num+recursion($num-1);
}
}
- 在同一命名空间中的函数不能重名,命名空间在后面博客中会提及。
//在1.php中
namespace 1;
function func(){
}
namespace 2;
function func(){
}
//在2.php中调用
//需要使用use方可进行调用
include "1.php";
use 1;
1\func();
use 2;
2\func();
实例:遍历某个文件夹下的文件
思想:面向过程式编程,使用glob函数和函数递归来得到相应文件
//4.函数的递归调用
function someDirScan($dir){
//扫描网站
static $list = array(); //static同一请求,不同HTTP请求session变量
//获取当前路径的文件和列表
$list = glob($dir.DIRECTORY_SEPARATOR.'*'); //glob获取文件列表
foreach ($list as $item){
if(is_dir($item)){
$list = array_merge($list, someDirScan($item)); //合并两个数组
}
}
return $list;
}
echo '<pre>';
print_r(someDirScan(__DIR__.'/../'));
结果:
提示数据类型
php为什么需要这点呢?因为php是一门弱类型语言,针对于开发函数,在团队合作中相互使用函数库的话显示的提示数据类型有助于团队开发。php的提示数据类型与其它强类型语言一致,在函数的参数列表中表名参数类型。
php提供的参数类型一般分为标量和非标量两大类。
- 非标量主要又分为Array、Class和Callable。
注:无需强制为参数设置类型,只有当参数类型对程序会产生影响时需要设置参数类型。
//统计数组的个数,显示时间,调用函数
function someTypeHint(Array $a, DateTime $d, Callable $c){
$message = '';
$message .= 'ArrayCount'.count($a).'<br />';
$message .= 'Date'.$d->format('Y-m-d H:i:s').'<br />';
$message .= 'Callable Return:'.$c().'<br />';
return $message;
}
- 标量类型提示
注:nl2br()函数将字符串中\n替换为br,因为\n在html界面中无法输出换行
//输出参数
function someScalarHint(bool $b, int $i, float $f, string $s){
$result = sprintf("\n%20s : %5s\n%20s : %5d\n%20s : %5f\n%20s : %20s",
'Bool', $b, 'Int', $i, 'Float', $f, 'String', $s
); //sprintf最后会返回一个输出的字符串,而printf直接输出
echo nl2br($result).'<br />'; //nl2br将字符串中\n替换成br
}
- 错误异常,在参数类型错误的情况下报TypeError异常。补充,标量类型中如果在php程序首行没有严格区分类型,int、float、string会隐式转换为bool类型。
//declare(strict_types=1);严格区分类型
//其它三种标量会隐式转换为bool类型
function someBoolHint(bool $b){
var_dump($b);
echo '<br />';
}
try{
//try语句中发生的异常后面的代码不会执行
someBoolHint(true);
someBoolHint(1);
someBoolHint(1.1);
someBoolHint('你好');
someBoolHint(new ArrayObject([1,2,3]