函数 - PHP手册笔记

原文:函数 - PHP手册笔记

用户自定义函数

函数无需在调用前被定义,除非是有条件定义的。

PHP中的所有函数和类都具有全局作用域。PHP不支持函数重载,也不可能取消定义或者重定义已声明的函数。

特意试了下,我的电脑上的PHP递归栈的最大深度为100。

函数参数

PHP支持按值传递参数(默认)、通过引用传递参数以及默认参数。也支持可变长度参数列表。PHP允许使用数组和特殊类型NULL作为默认参数。如果希望允许函数修改参数值,必须通过引用传递参数。

注意!当使用默认参数时,任何默认参数必须放在任何非默认参数的右侧,否则函数将不按照预期工作。

PHP在用户自定义函数中支持可变数量的参数列表。在PHP 5.6及以上的版本中,有...语法实现,可以这样写,由于没有合适的环境也无法测试。

<?php
function sum(...$numbers) {
	$acc = 0;
	foreach($numbers as $n) {
		$acc += $n;
	}
	return $acc;
}
echo sum(1, 2, 3, 4);

当然在PHP 5.5等低版本中也可以使用可变数量的参数列表。通过函数func_num_args()func_get_arg()gunc_get_args()获得参数数目、某一参数内容、参数数组。

<?php
function sum() {
	$acc = 0;
	foreach(func_get_args() as $n) {
		$acc += $n;
	}
	return $acc;
}
echo sum(1, 2, 3, 4);

返回值

函数不能返回多个值,但可以通过返回一个数组来得到类似的效果。

<?php
function small_numbers() {
	return array(0, 1, 2);
}
list($zero, $one, $two) = small_numbers();
echo "$zero  $one  $two";

从函数返回一个引用,必须在函数声明指派返回值给一个变量时都使用引用运算符&

<?php
function & return_reference() {
	return $someref;
}
$newref = & return_reference();

可变函数

PHP支持可变函数,也就是说,如果一个变量名后有圆括号,PHP将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现回调函数、函数表等,虽然这些我都没用过。

当调用静态方法时,函数调用要比静态属性优先。

内部函数

PHP有很多标准的函数和结构,还有一些函数需要和特定的PHP扩展模块一起编译。

如果传递给函数的参数类型与实际的类型不一致,那么函数的返回值是不确定的。在这种情况下,通常函数会返回NULL。但这仅仅是一个惯例,并不一定如此。

匿名函数

匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。

手册中的第一个示例程序是正则表达式相关的,不是很了解.第二个示例程序是一个匿名函数变量赋值。注意,匿名函数变量的定义语句结尾要加分号。

<?php
$greet = function($name) {
	echo "Hello $name  ";
};
$greet("world");
$greet('PHP');

第三个示例程序,关于从父作用域继承变量,也没看懂,好遗憾。第四个示例程序,关于Closures和作用域,和实际相结合,不错的,仔细看看。

这是一个基本的购物车类,实现了添加某数量的商品并计算总价格的功能。其中使用了一个closure作为回调函数。

<?php
class Cart {
	const PRICE_BUTTER = 1.00;
	const PRICE_MILK = 3.00;
	const PRICE_EGGS = 6.95;

	protected $products = array();

	public function add($product, $quantity) {
		$this->products[$product] = $quantity;
	}
	public function getQuantity($product) {
		return isset($this->products[$product]) ?
			$this->products[$product] : FALSE;
	}
	public function getTotal($tax) {
		$total = 0.00;
		$callback = function($quantity, $product) use ($tax, &$total) {
			$pricePerItem = constant(__CLASS__ . "::PRICE_" .
				strtoupper($product));
			$total += ($pricePerItem * $quantity) * ($tax + 1.0);
		};
		array_walk($this->products, $callback);
		return round($total, 2);
	}
}

$mycart = new Cart;
$mycart->add('butter', 1);
$mycart->add('milk', 3);
$mycart->add('eggs', 6);
echo $mycart->getTotal(0.05);

注意!匿名函数语句末尾的分号一定不要落下!

(全文完)

时间: 2024-08-10 00:51:08

函数 - PHP手册笔记的相关文章

类型 - PHP手册笔记

原文:类型 - PHP手册笔记 类型简介 PHP 支持 8 种原始数据类型. 四种标量类型: boolean(布尔型,不区分大小写) integer(整型) float(浮点型,也称作double) string(字符串) 两种复合类型: array(数组) object(对象) 最后是两种特殊类型: resource(资源) NULL(无类型) 如果想查看某个表达式的值和类型,用var_dump()函数. <?php $a = array(1, 2, array("a", &q

入门指引 - PHP手册笔记

原文:入门指引 - PHP手册笔记 曾经简单的学习过PHP,看的是<PHP和MySQL Web开发>,还有万能的搜索引擎的帮助.这次准备系统的学习一下,参考资料是PHP Manual. PHP能做什么 PHP主要用于服务端的脚本程序,但PHP的功能远不局限于此.PHP主要用于以下三个领域: 服务端脚本 命令行脚本 编写桌面应用程序(PHP-GTK) 实用的脚本 $_SERVER是一个特殊的PHP保留变量,它包含了web服务器提供的所有信息,被称为超全局变量.可以通过$_SERVER['HTTP

Python学习手册笔记

之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我在这里推荐了几篇文章,有其他语言编程经验的人简单看一看就可以很快地开始编写Python程序了. 黑体表示章节, 下划线表示可以直接在原文对应位置查到的专有技术名词. 原书配套答案请到http://www.hzbook.com/Books/4572.html下载,简单注册即可. 第三章 如何运行程序 impor

类与对象 - PHP手册笔记

原文:类与对象 - PHP手册笔记 基本概念 PHP对待对象的方式与引用和句柄相同,即每个变量都持有对象的引用,而不是整个对象的拷贝. 当创建新对象时,该对象总是被赋值,除非该对象定义了构造函数并且在出错时抛出了一个异常.类应在被实例化之前定义. 创建对象时,如果该类属于一个名字空间,则必须使用其完整名称. 在类定义内部,可以用new self和new parent创建对象. <?php $instance = new stdClass(); $assigned = $instance; $re

命名空间 - PHP手册笔记

原文:命名空间 - PHP手册笔记 概述 命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念,比如在操作系统中,目录用来将相关文件分组,对于目录中的文件来说,目录就扮演了命名空间的角色.这个原理应用到程序设计领域就是命名空间的概念.PHP 5.3后的版本开始支持命名空间. 定义命名空间 命名空间通过关键字namespace来声明.任何合法的PHP代码都可以包含在命名空间中,但只有类.函数和常量这三种类型受命名空间的影响. 在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的de

预定义变量 - PHP手册笔记

原文:预定义变量 - PHP手册笔记 预定义变量将所有的外部变量表示成内建环境变量,并且将错误信息表示成返回头.超全局变量是在全部作用域中始终可用的内置变量.在函数或方法中无需执行global $variable,就可以访问它们. $GOBALS引用全局作用域中可用的全部变量,在PHP中总是可用. $_SERVER服务器和执行环境信息,这个包含的数组元素较多,比如$_SERVER['PHP_SELFT'],$_SERVER['SCRIPT_FILENAME'],$_SERVER['SERVER_

google hacking for penetration testers 手册笔记

参考链接: Advanced operators reference Google hacking database 注意:以下内容涉及到大量参考图表,图表均在本人相册<google hacking参数查询表>里 第一章 谷歌搜索基础知识 1.谷歌翻译 可看作透明代理 利用: “翻译此页” 2.黄金法则: 不区分大小写 通配符*代表一个单词,非单一字母或一系列字母,在一单词开始或结尾使用星号和直接使用单词效果相同 保留查询关键字权利 强制搜索:         加引号:“words” 或 用布

LoadRunner中常用函数参考手册

基础篇1:LoadRunner中常用函数参考手册 常用函数列表 web_url web_submmit_form VS web_submmit_data VS web_custom_request web_custom_request web_concurrent_start(NULL); web_concurrent_end(NULL); ============================分割线================================ 1. web_url Loa

初探C++函数模版学习笔记

泛型程序设计 特点:算法实现时不指定具体要操作的数据的类型.算法实现一遍但可适用于多种数据结构. 优势:减少重复代码的编写. 实现:大量编写模板, 使用模板的程序设计. 函数模版 为了交换两个int变量的值, 需要编写如下Swap函数: void Swap(int & x, int & y) { int tmp = x; x = y; y = tmp; } 为了交换两个double型变量的值, 还需要编写如下Swap函数: void Swap(double & x, double