文章教程

2.2.1关于PHP数据

9/17/2020 9:37:07 PM 人评论 次浏览

2.2 PHP程序的组成

从功能的角度,完整的PHP程序可以划分为3个组成部分:数据的采集、数据的处理和数据的输出,其中PHP的数据采集主要包括3个过程:浏览器端的数据采集、浏览器端数据的提交和PHP程序的数据采集,如图2-3所示。在图2-3中,浏览器用户访问注册页面(如register.html), register.html 页面为浏览器用户提供一个图形界面(如 FORM 注册表单)采集用户的数据。浏览器用户在FORM表单中输入个人信息,单击“提交”按钮后,浏览器负责将用户信息提交到WEB服务器某个动态页面(如 register.php 程序)。register.php 程序负责采集浏览器端的用户信息,再对采集到的用户信息进行数据处理,并将处理结果输出,告知浏览器用户处理结果。

figure_0026_0049
图2-3 PHP的数据采集

2.2.1 关于PHP数据

数据位于程序的核心,如何快速、安全地管理内存中的数据显得格外重要。PHP与传统的高级语言的相同之处如下。

(1)PHP 使用变量或常量实现数据在内存中的存储,并使用变量名(如$userName)或常量名(例如PI)实现了内存数据的按名存取。

(2)PHP使用等于号“=”(赋值运算符)给变量赋值。

(3)PHP不允许直接访问一个未经初始化的变量,否则PHP预处理器会提示类似下面的Notice信息:Notice: Undefined variable: a in C:\wamp\www\2\sample.php on line 2。

(4)PHP提供变量作用域的概念实现内存数据的安全访问控制。

(5)PHP引入了数据类型的概念修饰和管理数据。

PHP与传统的高级语言的不同之处如下。

(1)PHP变量名之前要加美元符号“$”标识,例如变量$userName。

(2)PHP 是一种“弱类型的语言”,声明变量或常量时,不需要事先声明变量或常量的数据类型,PHP 会自动由 PHP 预处理器根据变量的值将变量转换成适当的数据类型。例如,程序looseType.php如下。

<?php

$a = 0;

$a = 0.00;

?>

程序looseType.php中创建了一个$a变量,当将整数0赋值给变量$a时,$a是一个整型变量;当将浮点数(带有小数点的数)0.00赋值给变量$a时,$a又变成一个浮点型的变量。

2.2.2 PHP数据类型

PHP数据类型分为4种:标量数据类型、复合数据类型、特殊数据类型和伪类型。其中标量数据类型共有4种:布尔型、整型、浮点型和字符串型。复合数据类型共有两种:数组和对象。特殊数据类型有资源数据类型和空数据类型。伪类型通常在函数的定义中使用。

1.标量数据类型

(1)布尔型(boolean)。布尔型是最简单的数据类型,布尔型的值要么为FALSE(逻辑“假”),要么为TRUE(逻辑“真”),且FALSE和TRUE不区分大小写(如TRUE和true是等效的)。

例如,程序boolean.php如下。

<?php

$a = TRUE;

$b = FALSE;

echo $a;

echo "<br/>";

echo $b;

?>

程序boolean.php的运行结果如图2-4所示。

figure_0027_0050
图2-4 布尔型示例程序运行结果

figure_0027_0051使用echo输出TRUE时,TRUE被自动地类型转换为整数1;使用echo输出FALSE时,FALSE被自动地类型转换为空字符串。

(2)整型(integer)。PHP中整型数据类型的数据指的是不包含小数点的实数。在32位操作系统中,整型数据的有效范围为−2 147 483 648~2 147 483 647。整型数据可以用十进制、八进制或十六进制表示,并且可以包含正号(+)和负号(−)。为了区分十进制数,八进制整数前必须加上0(零),十六进制整数前必须加上0x。例如,程序int.php如下。

<?php

$a = 1234;   //十进制数

$b = -123;   //一个负数

$c = 0123;   //八进制数(等于十进制的 83)

$d = 0x1A;   //十六进制数(等于十进制的 26)

echo $a;    //输出:1234

echo "<br/>";

echo $b;    //输出:-123

echo "<br/>";

echo $c;    //输出:83

echo "<br/>";

echo $d;    //输出:26

?>

(3)浮点型(float 或 double)。浮点型数据就是通常所说的带小数点的实数。例如,程序float.php如下。

<?php

$a = 1.0;

$b = 3.1415;

$c = 1.2E2;   //该浮点数表示1.2×102

echo $a;    //输出:1

echo "<br/>";

echo $b;    //输出:3.1415

echo "<br/>";

echo $c;    //输出:120

?>

figure_0028_0052浮点数只是一个近似值,尽量避免浮点数间比较大小,因为最后的结果往往不准确。

(4)字符串型(string)。字符串数据是一个字符的序列。组成字符串的字符是任意的,可以是字母、数字或者符号,在PHP中没有对字符串的最大长度进行严格的规定。字符串最简单的指定方法是使用一对单引号(')或者一对双引号(")。例如,程序string.php如下。

<?php

$string1 = 'string1';

$string2 = "string2";

$string3 = 'string3$string1';  //$string3变量的值为:string3$string1

$string4 = "string4$string1";  //$string4变量的值为:string3string1

echo $string1;     //输出:string1

echo "<br/>";

echo $string2;     //输出:string2

echo "<br/>";

echo $string3;     //输出:string3$string1

echo "<br/>";

echo $string4;     //输出:string4string1

?>

figure_0029_0053使用双引号指定的字符串中若出现变量名(以$开头),变量名会被替换成对应的变量值;使用单引号指定的字符串则不会。这是使用单引号和双引号指定字符串的主要区别。

2.复合数据类型

(1)数组(array)。PHP 数组由一组有序的变量组成,每个变量称为一个元素,每个元素由键和值构成。由于PHP数组中元素的键不能相等(= =),因此可以根据键唯一确定一个数组元素。同一个PHP数组中,各元素中的键既可以是数字编号,也可以是字符串;同一个PHP数组中,各元素的值既可以是标量数据类型数据,也可以是复合数据类型数据(如数组、对象)。在传统的高级语言中,数组都是静态的,在定义数组前必须指定数组的长度,而在PHP中,数组是动态的,在定义数组时不必指定数组的长度。例如,程序array.php如下。

<?php

$numbers = array(5,4,3,2,1);

$words = array("browser","application","database"=>"MySQL");

echo $numbers[2]; //输出:3

echo "<br/>";

echo $words["database"]; //输出:MySQL

?>

(2)对象(object)。客观世界中的一个事物就是一个对象,每个客观事物都有自己的特征和行为。从程序设计的角度来看,事物的特征就是数据,也叫成员变量;事物的行为就是方法,也叫成员方法。面向对象的程序设计方法就是利用客观事物的这种特点,将客观事物抽象为“类”,而类是对象的“模板”。例如,程序Student.class.php如下。

<?php

class Student{

//下面是Student类的成员变量

public $name;

public $sex;

public $birthday;

//下面是Student类的成员方法

function getName(){

//this是指向当前对象

return $this->name;

}

function setName($name){

$this->name = $name;

}

}

$student = new Student();

$student->setName("张三");

echo $student->getName(); //输出:张三

?>

程序Student.class.php首先定义了一个Student类,该类由成员变量$name、$sex和$birthday以及成员方法 setName($name)和 getName()组成。通过对类进行实例化,可以得到一个对象。在程序Student.class.php中,通过使用new关键字实例化一个$student对象,然后就可以使用如下方式访问该对象的成员变量和成员方法。

xiao_1 访问成员变量的方法:对象->成员变量(如$student ->name)

xiao_1 访问成员方法的方法:对象->成员方法(如$student->getName())

面向对象程序设计是软件设计和实现的有效方法,随着PHP面向对象技术的日趋完善,为了便于程序的模块化开发以及程序的后期维护,很多功能都可以通过 PHP 面向对象技术实现。

3.特殊数据类型

(1)资源数据类型(resourse)。资源是PHP提供的一种特殊数据类型,这种数据类型用于表示一个PHP的外部资源,如一个数据库的连接或者一个文件流等。PHP提供了一些特定的函数(所谓函数是指完成特定功能的代码段)建立资源和使用资源。例如, PHP 提供的mysql_connect()函数用于建立一个 MySQL 服务器的连接,PHP 提供的 fopen()函数用于打开一个文件等,这些函数的返回值为资源数据类型。例如,程序resource.php如下,该程序的运行结果如图2-5所示。

<?php

/*

使用mysql_connect()函数建立一个MySQL数据库连接时,需要指定数据库服务器的主机名(或IP地址)、用户名(例如"root")和密码(例如"")

*/

$connection = mysql_connect("localhost","root","");

/*

使用fopen()函数以“r”读的方式打开“Student.class.php”文件

*/

$ioStream = fopen("Student.class.php","r");

/*

使用var_dump()函数输出函数中参数的数据类型

*/

var_dump($connection);

echo "<br/>";

var_dump($ioStream);

?>

resource.php程序中,var_dump()函数的功能是输出函数参数的数据类型。

figure_0030_0054任何资源在不需要使用的时候应该及时释放。如果程序员忘记了释放资源, PHP垃圾回收机制将在PHP程序执行完毕后自动回收资源,避免造成WEB服务器内存资源和网络资源浪费。

(2)空(Null)。NULL是一个特殊的数据类型,该数据类型只有一个NULL值,用来标识一个不确定或不存在的数据。NULL不区分大小写,即null和NULL是等效的。例如,程序null.php如下,该程序的运行结果如图2-6所示。

figure_0031_0055
图2-6 NULL型示例程序运行结果

<?php

$a = NULL;   //变量$b被赋值为NULL

$b = null;   //变量$b被赋值为NULL

var_dump($a);  //输出:NULL

echo "<br/>";

var_dump($b);  //输出:NULL

?>

figure_0031_0056
图2-5 资源数据类型示例程序运行结果

4.伪类型

PHP引入4种伪类型用于指定一个函数的参数或返回值的数据类型。

(1)mixed。mixed 说明函数可以接受(或返回)不同类型的数据(但不是所有类型的数据)。

(2)number。number 说明函数可以接受(或返回)整型或者浮点型数据。

(3)void。void说明函数没有参数或返回值。

( 4 ) callback。callback 说明函数可以接受用户自定义的函数作为一个参数。例如, call_user_function()或usort()函数。

figure_0031_0057伪类型不能作为变量的数据类型,使用伪类型主要是为了确保函数的易读性。

2.2.3 浏览器端的数据采集

浏览器端数据的采集主要依靠HTML提供的FORM表单实现。FORM表单是包含一系列表单元素的区域,表单元素是允许用户在表单中输入信息的元素。常见的表单元素有:文本域、下拉列表、单选框、复选框等。以“用户注册系统”为例,创建一个用户注册的FORM表单的方法是:在“C:\wamp\www\2\”目录下新建 register.html 文件,以记事本方式打开该文件后,输入如下代码并保存该文件。

<form action="register.php">

用 户 名:<input type="text" name="userName"/><br/>

密 码 :<input type="password" name="password"/><br/>

确认密码:<input type="password" name="confirmPassword"/><br/>

<input type="submit" value=" 提 交 "/>

<input type="reset" value=" 重 填 "/>

</form>

打开浏览器,在地址栏中输入“http://localhost/2/register.html”回车,即可访问到register.html静态页面,如图2-7所示。

figure_0032_0058
图2-7 简单的注册页面

register.html程序说明如下。

(1)HTML中的字符序列“ ”被浏览器解析为一个空格。

(2)<form></form>标签是创建 FORM 表单所需的基本标签,每一个表单必须以<form>标签起始,以</form>标签结束。

① 必要时给<form />标签指定action属性指定FORM表单的处理程序。例如 action="register.php"意味着单击FORM表单的“提交”按钮后,表单数据提交给register.php程序处理。

② 必要时给<form />标签指定method属性指定FORM表单的提交方式。表单的提交方式默认为GET提交方式,当FORM表单以GET提交方式向WEB服务器提交数据时,提交数据将显示在浏览器地址栏中。

(3)<input />标签定义了可以输入信息的区域,<input />标签必须定义一个接受类型的 type属性,type属性可能的属性值包括text(文本框)、button(按钮)、checkbox(复选框)、file(文件)、hidden(隐藏字段)、image(图像)、password(密码框)、radio(单选按钮)、reset(重置按钮)、submit(提交按钮)等,指定属性值时用单引号(')或者双引号(")指定。例如,type="text"、type="password"、type="submit"或type="reset"等。

① 必要时给<input/>标签指定name属性为标签命名,建议以语义化的方式为<input/>标签命名(见名知意)。例如,name="userName"、name="password"等。

② 必要时给<input/>标签指定value属性为标签设置初始值。例如value=" 提 交 "、value=" 重 填 "。

③ 当<input />标签type的属性值为"submit"时,该元素在浏览器中渲染为一个提交按钮。单击提交按钮后,填写好的表单数据就会被提交到指定的程序进行处理,例如,register.html程序的FORM表单数据被提交到register.php程序进行处理。

④ 当<input />标签type的属性值为"reset"时,该元素在浏览器中渲染为一个重置按钮。单击重置按钮后,填写好的表单数据将被设置为value属性初始值。

2.2.4 PHP程序的数据采集

FORM表单创建好后,就可以编写PHP程序“采集”FORM表单提交过来的数据了,步骤如下。

(1)在“C:\wamp\www\2\”目录下新建register.php文件,输入如下代码。

<?php

$userName = $_GET["userName"];

$password = $_GET["password"];

$confirmPassword = $_GET["confirmPassword"];

//以下代码输出$userName变量、$password变量、$confirmPassword变量的值,并输出换行符

echo $userName;

echo "<br/>";

echo $password;

echo "<br/>";

echo $confirmPassword;

?>

(2)保存 register.php 文件内容后,打开浏览器并在浏览器地址栏中输入“http://localhost/2/register.html”重新访问 register.html 页面,然后在表单文本框和密码框中输入如图2-8所示信息,单击“提交”按钮后,register.html页面中填写的数据被提交到register.php页面。register.php页面使用$_GET接收表单中对应元素的值,并将用户填写在表单元素的数据打印在register.php页面上,如图2-9所示。

figure_0033_0059
图2-8 注册表单
figure_0033_0060
图2-9 PHP程序处理表单数据

由于 register.html 的 FORM 表单的提交方式为 GET 提交方式,PHP 程序需使用$_GET 采集表单中对应元素的值。例如,$_GET["userName"]负 责“采集”表单中<input type="text"name="userName"/>文本框中输入的信息。

2.2.5 PHP数据处理

PHP程序“采集”到表单数据后,必要时需对这些数据进行加工处理,PHP一般使用运算符、控制语句和函数等对数据进行加工处理。对于“用户注册系统”而言,最简单的数据加工处理如下。

(1)判断password和confirmPassword的值是否一致,若一致则提示用户可以注册,否则提示用户重新输入用户名和密码。

(2)若password和confirmPassword的值一致,将password加密。

为了实现这些数据的加工处理,需要将register.php程序的代码修改为如下代码。

<?php

$userName = $_GET["userName"];

$password = $_GET["password"];

$confirmPassword = $_GET["confirmPassword"];

if($password == $confirmPassword){

echo "您可以注册了";

echo "<br/>";

echo "您加密后的密码为:";

echo md5($password);

}else{

echo "您输入的密码和确认密码不一致,请重新注册!";

}

?>

修改后的register.php程序说明如下。

(1)register.php中使用了“= =”比较运算符、条件控制if…else语句和md5()函数对“采集”到的表单数据进行处理。

(2)register.php中使用了md5()函数,该函数的语法格式为:string md5(string str)。

md5()函数的功能是将传递到md5()函数的字符串str转换为32位的密文,实现数据加密功能。两个相等的字符串(使用“= =”比较)经md5()函数加密后,得到相同的密文。例如程序md5.php如下。

<?php

echo md5("abcdefg");  //输出:7ac66c0f148de9519b8bd264312c4d64

echo "<br/>";

echo md5("Abcdefg");  //输出:ab4f4d4ab813f90c8408bfcb5783bd47

echo "<br/>";

echo md5("10");   //输出:d3d9446802a44259755d38e6d163e820

echo "<br/>";

echo md5(10);   //输出:d3d9446802a44259755d38e6d163e820

?>

由于字符串"abcdefg"和"Abcdefg"不相等(使用“= =”比较),因此它们的加密结果不相同;由于字符串"10"和整数10相等(使用“= =”比较),因此它们的加密结果相同。

2.2.6 PHP数据的输出

PHP经常使用echo语句向浏览器输出字符串数据,除了echo语句外,还可以使用print语句或printf()函数向浏览器输出字符串数据。echo与print输出的是没有经过格式化的字符串,而printf()函数则是输出经过格式化的字符串。对于复合数据类型的数据(如数组或对象),可选用print_r()函数输出。实际编程过程中,经常使用输出语句对程序进行调试。

1.print和echo

print 和 echo 两者的功能几乎完全一样,都用于向页面输出字符串。例如可以将 register.php程序修改为如下代码完成相同的功能(粗体字为代码修改部分)。

<?php

$userName = $_GET["userName"];

$password = $_GET["password"];

$confirmPassword = $_GET["confirmPassword"];

if($password == $confirmPassword){

print "您可以注册了";

print "<br/>";

print "您加密后的密码为:";

print md5($password);

}else{

print "您输入的密码和确认密码不一致,请重新注册!";

}

?>

echo和print之间区别是:使用echo可以同时输出多个字符串(多个字符串之间使用逗号隔开即可),而print一次只能输出一个字符串。register.php代码也可以修改为如下代码(粗体字为代码修改部分)。

<?php

$userName = $_GET["userName"];

$password = $_GET["password"];

$confirmPassword = $_GET["confirmPassword"];

if($password == $confirmPassword){

echo "您可以注册了","<br/>","您加密后的密码为:",md5($password);

}else{

echo "您输入的密码和确认密码不一致,请重新注册!";

}

?>

echo和print之间的其他区别如下。

(1)在echo前不能使用错误抑制运算符“@”。

(2)print()也可以看做是一个有返回值的函数,此时print能作为表达式的一部分,而echo不能。

2.输出运算符“<?= ?>”

如果HTML代码块中只嵌入一条PHP语句,且该PHP语句是一条输出语句,此时若使用echo或print语句输出字符串不仅显得麻烦,而且降低了程序的易读性。PHP提供另一种便捷的方法:使用输出运算符“<?= ?>”输出字符串数据。可以将程序 htmlWithPHP.php 修改为如下代码,增强程序的易读性(粗体字为代码修改部分,其他代码不变)。

<html>

<head>

<title>

PHP代码和HTML代码混编示例程序

</title>

</head>

<body bgcolor='<?="red"?>'>

<?

echo "hello world!";

echo "<br/>";

echo date("Y-m-d H:i:s");

?>

</body>

</html>

figure_0035_0061只有将 php.ini 文件中的 short_open_tag 选项设置为 On时,输出运算符“<?= ?>”才会生效。

3.print_r()函数

对于复合数据类型的数据输出,经常使用print_r()函数。使用print_r()函数输出数组中的元素或对象中的成员变量时,将按照“键”=>“值”对或“成员变量名”=>“值”的方式输出元素或对象的内容。例如,程序print_r.php如下。

<?php

class Person{

public $name = "张三";

public $sex = "男";

public $age = 20;

function say(){

echo "这个人在说话";

}

function walk(){

echo "这个人在走路";

}

}

$person = new Person();

print_r($person); //输出:Person Object([name]=>张三 [sex] => 男 [age] => 20 )

echo "<br/>";

$words = array("browser","application","database");

print_r($words); //输出:Array ( [0] => browser [1] => application [2] => database )

?>

教程类别