当前位置: 首页 > news >正文

[PHP] 代码重用与函数

1. 代码重用


1.1 代码重用的好处

1) 成本

在软件生命周期中,相当的时间是用在维护、修改、测试和文档化记录上,而不是最初花在编码上的时间,所以应尽量限制所用到的代码行数,最常用的方法就是重新使用已有的代码。

2) 可靠性

如果一个模块代码已经使用了,可以认为它是已通过测试的。使用现存的成熟代码通常比新代码更可靠。

3) 一致性

系统的外部接口应该是一致的,包括用户接口和系统的外部接口。重复使用运行在系统其他部分的代码,所实现的功能就会达到一致。


1.2 包含文件

PHP提供了两个简单的函数require()和include(),允许重新使用任何类型的代码。通常这个文件可以包含任何希望在一个脚本中输入的内容,其中包括PHP、文本、HTML。

require()和include()几乎是相同的,只是在函数失败后,require()函数将给出一个致命错误,而include()只是给出一个警告。

require()函数和include()函数各有一个变体函数,分别是require_once()和include_once(),这两个函数的作用是确保一个包含的文件只能被引入一次。


1.3 页眉和页脚

如果希望在每个页面中都加入页眉和页脚,可以在配置文件php.ini中的auto_preprend_file和auto_append_file的选项设置。使用这些指令包含的文件可以像使用include()语句包含的文件一样,当文件不存在时,将产生一个警告。


2. 使用函数


2.1 函数调用

调用函数最简单和示例:

function_name();

以上代码将调用一个名为function_name的函数且不需要任何输入参数。然而,大多数函数都需要一个或更多的参数。我们通过将数据或变量名放在函数名称后面的括号内,从而以参数形式传给函数,例如:

function_name('param');

参数可以是任何数据类型,但特定的函数通常会要求特定的数据类型。

如果调用一个并不存在的函数,会得到一个错误信息。如果看到这个错误信息,需要检查函数名是否正确或这个函数是否存在于所用的PHP版本中。

函数调用将不区分大小写,所以调用function_name()、FUNCTION_NAME()都是有效的,而且都将返回相同的结果。


2.2 定义函数

一个函数声明将创建一个新的函数,声明是以关键字function开始的,接下去给出函数名称和必要的参数,然后再给出调用这个函数时要执行的代码,例如:

function my_function() {
  echo "Hello World!";
}


2.3 函数命名

函数命令具有如下几个限制:

1) 函数名称不能与现有函数重名。

2) 函数名称只能包含字母、数字、下划线。

3) 函数名称不能以数字开始。


2.4 使用参数

大部分函数需要一个或多个参数,参数允许将数据传给函数,例如:

function get_name($name) {
  echo "Hello $name";
}

用户定义函数可以有多个参数和可选参数,可选参数需要在函数中为它们定义默认值,例如:

function get_name($name, $prefix = 'Mr.') {
  echo "Hello $prefix $name";
}

通常,函数获取参数的方式是值传递,当传递一个参数时,一个新的并且包含该传入值的变量被创建,它是原来那个变量的副本。可以以任意方式修改它,但函数外部原来变量的值是不会改变的。

如果使用引用传递,在参数被传递给函数的时候,函数不会再创建一个新变量,而是函数获得一个原来变量的引用。可以通过在函数定义的参数名前加一个地址符'&'来指定参数的引用传递,例如:

function increment(&$value, $amount = 1) {
  $value = $value + $amount;
}


2.5 返回

关键字return将终止函数的执行,如果return语句被执行了,函数中后续的代码将被忽略,例如:

function larger($x, $y) {
  if ($x >= $y) {
    return $x;
  }
  else {
    return $y;
  }
}



相关文章:

  • Error处理: “非法字符: \65279”的解决办法
  • 使用vue构建一个自动建站项目
  • 各种内存分配器的对比测试
  • Java 8 - lambda
  • MySQL常用函数
  • 存储器
  • mycat主从读写分离范例
  • Android通过Socket与服务器进行通信
  • 写sql语句时将时间格式“20110725”转化为格式2012年07月25日
  • MySQL 简易序列
  • HASH的应用(负数下标用偏移量解决)
  • Python 反序列化安全问题(二)
  • collection和collections的区别
  • Eclipse自动补全增强
  • H264 RTP封包原理(转载)
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 2017 前端面试准备 - 收藏集 - 掘金
  • HTTP中的ETag在移动客户端的应用
  • Java比较器对数组,集合排序
  • MYSQL 的 IF 函数
  • Objective-C 中关联引用的概念
  • PhantomJS 安装
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Vue学习第二天
  • 编写高质量JavaScript代码之并发
  • - 概述 - 《设计模式(极简c++版)》
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 工作中总结前端开发流程--vue项目
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 基于webpack 的 vue 多页架构
  • 老板让我十分钟上手nx-admin
  • 事件委托的小应用
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 中文输入法与React文本输入框的问题与解决方案
  • 数据库巡检项
  • #ifdef 的技巧用法
  • #每日一题合集#牛客JZ23-JZ33
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (arch)linux 转换文件编码格式
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (二)学习JVM —— 垃圾回收机制
  • *2 echo、printf、mkdir命令的应用
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .CSS-hover 的解释
  • .NET CF命令行调试器MDbg入门(一)
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .net分布式压力测试工具(Beetle.DT)
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET是什么
  • .NET下ASPX编程的几个小问题
  • .NET中两种OCR方式对比
  • @Autowired标签与 @Resource标签 的区别