0

0

PHP一种友好的函数传参模式设计

php中文网

php中文网

发布时间:2016-07-25 08:46:18

|

1170人浏览过

|

来源于php中文网

原创

php一种友好的函数传参模式设计,有需要的朋友可以参考下。


当一个类的构造函数函数中,需要传入的参数较多时,程序员在编码时由于传参的顺序和写法难记忆,容易出现编译错误,或者出现值传给错误参数(弱类型语言)的情况.


友好的功能设计

程序员在实例化一个class时,传入的参数应该满足以下 友好性目标:
1. 能够只传入部分参数
2. 能够不按顺序传入参数
3. 能够不区分参数的大小写
4. 能够及时准确的提示传参时产生的错误


改进流程 例1-在成员变量中赋默认值 请看以下代码,函数的默认值在成员变量中赋予,这样在只传入部分参数时,系统会产生notice,即不满足"友好性目标"中的第一条.
  1. class FileUpload
  2. {
  3. private $filepath; //指定文件保存的路径
  4. private $allowtype = array("gif", "jpg", "jpeg", "png"); //允许的类型
  5. private $maxsize = 1000000; //允许上传的文件大小 1M
  6. private $israndname = true; //是否重命名文件
  7. function __construct($filepath, $allowtype, $maxsize, $israndname)
  8. {
  9. $this->filepath = $filepath;
  10. $this->allowtype = $allowtype;
  11. $this->maxsize = $maxsize;
  12. $this->israndname = $israndname;
  13. var_dump($this);
  14. }
复制代码
例2-在构造函数中赋默认值

这一次,为了消除上例的notice,实现可以传入任意数量的参数,没有传入的参数使用默认值,将程序改为:在构造函数中设定默认值.

又一个问题出现:当程序员传入参数为(“/upload”,array(“jpg”,”gif”),false)时,即程序员忘记传入了maxsize参数,这时系统会错误的将false赋值给maxsize而不是israndname,系统没有任何错误输出,为后续工作留下隐患!

  1. class FileUpload
  2. {
  3. private $filepath;
  4. private $allowtype;
  5. private $maxsize;
  6. private $israndname;
  7. function __construct(
  8. $filepath = "/upload",
  9. $allowtype = array("gif", "jpg", "jpeg", "png"),
  10. $maxsize = 1000000,
  11. $israndname = true)
  12. {
  13. $this->filepath = $filepath;
  14. $this->allowtype = $allowtype;
  15. $this->maxsize = $maxsize;
  16. $this->israndname = $israndname;
  17. var_dump($this);
  18. }
复制代码
例3-使用数组封装参数

为解决例2的问题,我们可以对传入的值进行检查来防止赋值错位的情况发生(反正一般情况下我们都会对传入的值进行检查).然而这并不是解决问题的方法,因为我们要实现的功能还有使程序员可以不按顺序传值.

立即学习PHP免费学习笔记(深入)”;

在弱类型语言中,解决这个问题可以使用 数组 的特殊性,将所有传递的参数封装到数组中,以key=>value键值对的形式保存.请看如下代码:

  1. class FileUpload
  2. {
  3. private $filepath;
  4. private $allowtype;
  5. private $maxsize;
  6. private $israndname;
  7. function __construct($options=array([默认值]))
  8. {
  9. //解析传入的数组
  10. foreach($options as $key=>$value){
  11. $this->$key = $value;
  12. }
  13. }
复制代码

这样就解决了传入参数的顺序问题,同时也解决了只传部分参数的问题.

SuperCms在线订餐系统
SuperCms在线订餐系统

模板采用响应式设计,自动适应手机,电脑及平板显示;满足单一店铺外卖需求。功能:1.菜单分类管理2.菜品管理:菜品增加,删除,修改3.订单管理4.友情链接管理5.数据库备份6.文章模块:如:促销活动,帮助中心7.单页模块:如:企业信息,关于我们更强大的功能在开发中……安装方法:上传到网站根目录,运行http://www.***.com/install 自动

下载

然而新的问题出现了,这时程序员需要输入一个数组作为参数,如下:

  1. $up = new $FileUpload(array(
  2. "filepath" => "/upload",
  3. "israndname" => false,
  4. "maxsize" => 2000000
  5. ));
复制代码
例4-解决参数的大小写

在使用数组封装参数之后,这时需要程序员手动输入变量的名字,这就会因风格不同导致MaxSize, maxSize, maxsize 这样的写法问题,解决这个问题只需要在声明成员变量时都统一用小写,然后在构造函数里加一行:

  1. foreach($options as $key=>$value){
  2. $key = strtolower($key);
  3. ...
  4. }
复制代码

到这里,我们的设计已经满足了 友好性目标 中的前三点,整体代码如下:

  1. class FileUpload {
  2. private $filepath;
  3. private $allowtype;
  4. private $maxsize;
  5. private $israndname;
  6. function __construct($options=array(
  7. "$filepath" => "./",
  8. "$allowtype" => array("txt","jpg"),
  9. "$maxsize" => 1000000,
  10. "$israndname" => true
  11. )){
  12. //解析传入的数组
  13. foreach($options as $key=>$value){
  14. $key = strtolower($key);
  15. $this->$key = $value;
  16. }
  17. }
  18. }
复制代码
例5-处理传入key的错误

在上例中,如果程序员传入了一个类中根本没有的参数,系统会报错,这里我们有两种处理方案:
1. 忽略无效参数,仅执行有效参数
2. 友好的提示出你传入的某个参数无效

个人认为为了程序的健壮性,不能轻易容许错误的代码存在,故选择第二者,我们将这个错误友好的提示给调用者.

  1. foreach($options as $key=>$value){
  2. $key = strtolower($key);
  3. //判断类中是否有这个变量
  4. if(in_array($key, get_class_vars(get_class($this)))) {
  5. $this->$key = $value;
  6. }else{ //提示错误位置和参数
  7. echo "Error when init class ".get_class($this)." with key: ".$key." in array !";
  8. exit;
  9. }
  10. }
复制代码
例6-检查传入value是否合法

至此,预期的4个目标均已实现,且为了使__construct()函数具有复用性,使用时可以直接paste,我们将对value的检查抽象成一个函数,请看修改后的代码:

  1. class FileUpload {
  2. //变量名均使用小写
  3. private $filepath;
  4. private $allowtype;
  5. private $maxsize;
  6. private $israndname;
  7. //在构造函数中赋予默认值
  8. function __construct($options=array(
  9. "$filepath" => "./",
  10. "$allowtype" => array("txt","jpg"),
  11. "$maxsize" => 1000000,
  12. "$israndname" => true
  13. )){
  14. //解析传入的数组
  15. foreach($options as $key=>$value){
  16. $key = strtolower($key);
  17. //判断key是否在类中声明
  18. if(in_array($key, get_class_vars(get_class($this)))) {
  19. //检查value是否符合要求
  20. if(checkValue($key,$value)) {
  21. $this->$key = $value;
  22. } else {
  23. //提示错误位置和参数
  24. echo "Invalid value".$value."found when init class ".get_class($this)." with key: ".$key." in array !";
  25. exit;
  26. }
  27. }else{
  28. //提示错误位置和参数
  29. echo "Error when init class ".get_class($this)." with key: ".$key." in array !";
  30. exit;
  31. }
  32. }
  33. }
  34. function checkValue{
  35. if(){
  36. ...
  37. return true;
  38. }
  39. return false;
  40. }
  41. }
复制代码
PHP


相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

150

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

88

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

90

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

61

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

493

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

16

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

12

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

5

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP基础入门课程
PHP基础入门课程

共33课时 | 1.9万人学习

Python进阶视频教程
Python进阶视频教程

共30课时 | 7.8万人学习

尚学堂javascript视频教程第一季
尚学堂javascript视频教程第一季

共60课时 | 11万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号