数组中元素的意义是存放变量。每个元素存放一个值,且用一个键值指向它。正如我们上一节所介绍的,键值可以是整数或者任意长度的字符。
有两种方式可以创建一个数组。第一种是显式地调用array()语法结构:
$a = array (10, 20, 30);
$a = array ('a' => 10, 'b' => 20, 'c' => 30);
$a = array (5 => 1, 3 => 2, 1 => 3,);
$a = array();
以上的第一行代码创建了一个仅包含三个值的数组。这样的话,其中每个元素仍然有它自己的键值,PHP会为其中每一个没有指定键的元素自动加上以0开始的键。在第二个例子中,同样是三个元素,但期每一个键都被指定了一个字母左右键值(特别提醒的是字母键值长度可以任意)。第三个例子中,键值打破常规自增,第一个元素的键值是5——需要提醒的是最后一个逗号后面没元素,这在语法上是允许的,且不会影响到最终结果。最后的第四例创建了一个空的数组。
那么第二种创建数组的方法是使用数组操作符“[]”:
$x[] = 10; $x['aa'] = 11; echo $x[0]; // 输出10
正如你看到的,使用操作符直接创建数组要比array()去创建数组来的高效的多:在第一行中,我们向数组变量$x中添加了一个新的值。由于我们没有给出键值,PHP会自动将其下一个自动编号的键值赋给这个新的数组元素。在第二行中,我们指定了一个’aa’作为键值添加到数组变量$x中。需要提醒的是,我们并没有明显指定$x是一个数组,可以这样使用意味着PHP会将其自动转换成数组供我们使用,除非它本身就是数组。如果$x是空的,那仅仅被转换成一个空的数组。
数组是PHP中无可争议的高级数据结构之王。PHP中的数组异常松散——允许数值自增键、字母键甚至两者混合,且可以存放任何类型的值(包括存放其他数组)。拥有超过70个方法可以操作数组,几乎你能想得到的一定能能做得到——而且远不止此。
函数时PHP语言中最常用的组件(或许这适用于任何语言)。没有了它,编写重用代码几乎不可能办到——更别说面向对象开发技术了。
因此,你必须精通函数而非略懂皮毛,并且了解引用传参和可变个数传参。考试中会遇到不少围绕函数工作原理的问题——幸运的是这些概念相对简单且易于理解,在本章中都有讲到。
PHP中存在三个变量作用域:全局变量、函数局部变量和类成员变量。全局变量,人如其名,可以在程序任何部分使用;在函数和类以外定义的变量就称为全局变量。
作者提示:类成员变量将在面向对象开发章节中详细介绍。
在一个函数中,就进入了PHP的一个新的变量作用域——这里的变量与全局变量是互不关联,不会相互覆盖。任何定义在函数内部的变量都会在函数执行完后消失。因此函数中变量名称可以随意定义而不需要担心覆盖外面的变量(也就是兼容性问题)。
$a = "Hello World";
function hello()
{
$a = "Hello Reader";
$b = "How are you";
}
hello();
echo $a; // 输出"Hello World"
echo $b; // 发出一个“使用了不存在的变量”的警告
两条途径可以使全局变量作用于函数内;第一种方 法是使用global关键字在函数内申明:
$a = "Hello";
$b = "World";
function hello()
{
global $a, $b;
echo "{$a} {$b}";
}
hello(); // 输出"Hello World"
注意一点,使用global关键字,其后的变量使用逗号分隔,可以同时将多个全局变量作用到函数中——当然,你也可以使用多条global语句声名,达到同样的效果。
很多开发者感觉使用global关键字时全局变量与函数局部变量互通会引发一些问题。他们使用超全局数组$GLOBALS来解决这个问题:
$a = "Hello";
$b = "World";
function hello()
{
echo $GLOBAL['a'] . ' ' . $GLOBAL['b'];
}
hello(); // 输出"Hello World"
在PHP中所有的函数都有返回值——即使你没有指定它返回内容。因此在PHP中声名”void”(无返回值)的函数没有意义。你可以使用return关键字来指定要返回的内容:
function hello()
{
return "Hello World"; // 没有任何显示结果
}
$txt = hello(); // 将返回的“Hello World”值赋给$txt
echo hello(); // 显示“Hello World”
显然,return也可用于中断一个函数的运行,即使你没有打算返回任何值:
function hello($who)
{
echo "Hello $who";
if ($who == "World") {
return; // 执行到这里的话,本函数下面的语句就不会被执行到
}
echo ", how are you";
}
hello("World"); // 显示“Hello World”
hello("Siemen"); // 显示“Hello Siemen, how are you?”
请注意,即使你没有在return后面加上需要返回的内容,PHP仍然会触发函数返回NULL。
函数也可以返回一个引用;这可以使返回值是其本身的引用,来取代复制关系(默认的返回值除了对象外其余都是复制关系)。比较典型的例子是资源类型(类似数据库连接)与使用工厂模式。但要注意的是——你只能返回一个值作为引用,而不是一个表达式,或者强制使用return语句返回NULL:
function &query($sql)
{
$result = mysql_query($sql);
return $result;
}
// 下面是不正确的写法,会引发PHP的提示
function &getHello()
{
return "Hello World";
}
// 同样是不正确的写法,这样写会引发一个警告
function &test()
{
echo "This is a test";
}函数的语法非常简单。创建一个新的函数,我们只要使用function关键字,后面跟上一个识别名称,一对圆括号与一对花括弧:
function hello()
{
echo "Hello World!";
}
hello(); // 显示 "Hello World!";
PHP的函数名不区分大小写且只能由字母、数字和下划线组成。注意不能以数字开头。
想要让你编写的函数去执行的话,只要把你要执行的代码写在花括弧中间,然后去掉用它。
function hello()
{
echo "Hello World!";
}
hello(); // 显示 "Hello World!";
可以这么说,函数是PHP程序的心脏。被函数封装的每一段代码可在任何地方反复调用其价值不可估量——它是构造程序和面向对象开发的基石。
在本章中,我们的焦点放在创建于管理函数——因此,本章着重讲解如果写函数,而不是如何使用。
目录放出:
本章涵盖了很多PHP应用开发的要点。简单来说,这些知识是开发的基本要素,因此你必须非常熟悉他们的能力和特殊需要。
有很多基本的知识点我们也只是略微了解:数组、字符串、函数和对象。他们复杂到足以使用整个章节去分别介绍他们,因此,以下四个章节就详细介绍他们。