Array 函数Calendar 函数cURL 函数Date 函数Directory 函数Error 函数Filesystem 函数Filter 函数FTP 函数HTTP 函数LibXML 函数Mail 函数Math 函数Misc 函数MySQLi 函数SimpleXML 函数String 函数XML Parser 函数Zip 函数::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::。。。。。。。。。。。。http:/ /www.iis7.com/b/plc/。。。。。。。。。。。。。。。。。。。。。。。。通过。。。。。。。。。。。。为什么使用::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::您需要做什么?为了开始使用找一个支持在您自己的 PC 机上安装 Web 服务器,然后安装。。。。。。。。。。。使用支持如果您的服务器支持只要在您的 web 目录中创建 .您不需要编译任何软件,或安装额外的工具。由于。。。。。。。。。。。在您自己的 PC 机上建立然而,如果您的服务器不支持安装 Web 服务器安装安装数据库,比如 MySQL官方。。。。。。。。。。。对于初学者建议使用集成的服务器组件,它已经包含了。。。。。。。。。。。WampServer(服务器)Windows 系统可以使用 WampServer,下载地址:http://www.wampserver.com/,支持32位和64位系统,根据自己的系统选择版本。WampServer 安装也简单,你只需要一直点击 "Next" 就可以完成安装了。XAMPP(集成服务器)XAMPP 支持 Mac OS 和 Windows 系统,下载地址:https://www.apachefriends.org/zh_cn/index.html。。。。。。。。。。。。IDE (Integrated Development Environment,集成开发环境)Eclipse forEclipse 是一个开放源代码的、基于Java的可扩展开发平台(如果未安装JDK,则需要先 下载 JDK 安装)。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。支持 Windows、Linux 和 Mac OS 平台。Eclipse for支持 Windows、Linux 和 Mac OS 平台。:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::。。。。。。。。。。。。。。基本的 结束,语法:通过::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::。。。。。。。。。。。。与代数类似x=5y=6z=x+y在代数中,我们使用字母(如 x),并给它赋值(如 5)。从上面的表达式 z=x+y ,我们可以计算出 z 的值为 11。在变量是用于存储数据的容器。。。。。。。。。。。。。与代数类似,可以给变量可以是很短的名称(如 x 和 y)或者更具描述性的名称(如 age、carname、totalvolume)。变量以 $ 符号开始,后面跟着变量的名称变量名必须以字母或者下划线字符开始变量名只能包含字母数字字符以及下划线(A-z、0-9 和 _ )变量名不能包含空格变量名是区分大小写的($y 和 $Y 是两个不同的变量)。。。。。。。。。。。。创建(声明)变量在您第一次赋值给它的时候被创建注释:当您赋一个文本值给变量时,请在文本值两侧加上引号。。。。。。。。。。。。。不必向在强类型的编程语言中,我们必须在使用变量前先声明(定义)变量的类型和名称。。。。。。。。。。。。。变量的作用域是脚本中变量可被引用/使用的部分。localglobal(全局变量)staticparameter。。。。。。。。。。。。局部和全局作用域在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,需要使用 global 关键字。在你可以在不同函数中使用相同的变量名称,因为这些函数内定义的变量名是局部变量,只作用于该函数内。。。。。。。。。。。。global 关键字用于函数内访问全局变量。在函数内调用函数外定义的全局变量,我们需要在函数中的变量前加上 global 关键字。。。。。。。。。。。Static 作用域当一个函数完成时,它的所有变量通常都会被删除。然而,有时候您希望某个局部变量不要被删除。要做到这一点,请在您第一次声明变量时使用 static 关键字然后,每次调用该函数时,该变量将会保留着函数前一次被调用时的值。注释:该变量仍然是函数的局部变量。。。。。。。。。。。。参数作用域参数是通过调用代码将值传递给函数的局部变量。参数是在参数列表中声明的,作为函数声明的一部分。。。。。。。。。。。1, 定义在函数外部的就是全局变量,它的作用域从定义处一直到文件结尾。2、函数内定义的变量就是局部变量,它的作用域为函数定义范围内。3、函数之间存在作用域互不影响。4、函数内访问全局变量需要 global 关键字或者使用 $GLOBALS[index] 数组在要想在函数中直接使用全局变量可以通过 global 关键字声明或者通过::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::在。。。。。。。。。。。。。。echo 和 print 区别:echo - 可以输出一个或多个字符串print - 只允许输出一个字符串,返回值总为 1提示:echo 输出的速度比 print 快, echo 没有返回值,print有返回值1。。。。。。。。。。。。。echo 是一个语言结构,使用的时候可以不用加括号,也可以加上括号: echo 或 echo()。显示字符串。字符串可以包含 HTML 标签显示变量,用双引号。。。。。。。。。。。。print 同样是一个语言结构,可以使用括号,也可以不使用括号: print 或 print()。显示字符串,字符串可以包含 HTML 标签显示变量,用双引号::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::使用概述:1. 必须后接分号,否则编译通不过。2. EOF 可以用任意其它字符代替,只需保证结束标识与开始标识一致。3. 结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空白和字符)。4. 开始标识可以不带引号或带单双引号,不带引号与带双引号效果一致,解释内嵌的变量和转义符号,带单引号则不解释内嵌的变量和转义符号。5. 当内容需要内嵌引号(单引号或双引号)时,不需要加转义符,本身对单双引号转义,此处相当与q和qq的用法。注意:1.以3.位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以。在 heredoc 中,变量不需要用连接符 . 或 , 来拼接在:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::String(字符串)Integer(整型)Float(浮点型)Boolean(布尔型)Array(数组)Object(对象)NULL(空值)。。。。。。。。一个字符串是一串字符的序列,就像 "Hello world!"。你可以将任何文本放在单引号和双引号中。。。。。。。。整数是一个没有小数的数字。整数规则:整数必须至少有一个数字 (0-9)整数不能包含逗号或空格整数是没有小数点的整数可以是正数或负数整型可以用三种格式来指定:十进制, 十六进制( 以 0x 为前缀)或八进制(前缀为 0)。。。。。。。。。浮点数是带小数部分的数字,或是指数形式。。。。。。。。。布尔型可以是 TRUE 或 FALSE。$x=true;$y=false;布尔型通常用于条件判断。。。。。。。。。数组可以在一个变量中存储多个值。。。。。。。。。对象数据类型也可以用于存储数据。在首先,你必须使用class关键字声明类对象。类是可以包含属性和方法的结构。然后我们在类中定义数据类型,然后在实例化的类中使用数据类型。。。。。。。。NULL 值表示变量没有值。NULL 是数据类型为 NULL 的值。NULL 值指明一个变量是否为空值。 同样可用于数据空值和NULL值的区别。可以通过设置变量值为 NULL 来清空变量数据。。。。。。。。var_dump() 方法,判断一个变量的类型与长度,并输出变量的数值,如果变量有值,则输出是变量的值,并返回数据类型。显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。格式:var_dump ( mixed expression [, mixed expression [, ...]] )注意:用保证 var_dump 中的变量必须是存在的,如果变量不存在则返回 NULL。该函数有输出的功能,因此不必加其它的输出函数。::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::常量值被定义后,在脚本的其他任何地方都不能被改变。。。。。。。。。。常量是一个简单值的标识符。该值在脚本中不能改变。一个常量由英文字母、下划线、和数字组成,但数字不能作为首字母出现。 (常量名不需要加 $ 修饰符)。注意: 常量在整个脚本中都可以使用。。。。。。。。。。设置设置常量,使用 define() 函数,函数语法如右所示:bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )该函数有三个参数:name:必选参数,常量名称,即标志符。value:必选参数,常量的值。case_insensitive :可选参数,如果设置为 true,该常量则大小写不敏感。默认是大小写敏感的,false。。。。。。。。。。常量是全局的常量在定义后,默认是全局变量,可以在整个运行的脚本的任何地方使用。::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::字符串变量用于存储并处理文本。。。。。。。。。。字符串变量用于包含有字符的值。在创建字符串之后,我们就可以对它进行操作了。您可以直接在函数中使用字符串,或者把它存储在变量中。注释:当您赋一个文本值给变量时,请记得给文本值加上单引号或者双引号。。。。。。。。。。在并置运算符 (.) 用于把两个字符串值连接起来。。。。。。。。。。有时知道字符串值的长度是很有用的。strlen() 函数返回字符串的长度(字符数)。strlen() 常常用在循环和其他函数中,因为那时确定字符串何时结束是很重要的。(例如,在循环中,我们需要在字符串中的最后一个字符之后结束循环)。。。。。。。。。strpos() 函数用于在字符串内查找一个字符或一段指定的文本。如果在字符串中找到匹配,该函数会返回第一个匹配的字符位置。如果未找到匹配,则返回 FALSE。字符串中第一个字符的位置是 0,而不是 1。索引位置从[0]开始。。。。。。。。。。用strlen()f方法输出中文,一个中文占 3 个字符数。可以使用 mb_strlen 设置指定编码输出中文字符个数。。。。。。。。。strpos() 返回的不是第一匹配的字符会的下标,是按照字符数量来算。中文下的字符在 UTF-8 下是 3 个字符长度,在 gbk 下是2个字符长度。这个 strpos() 只能用于判断字符在字符串中是否存在。:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::在在。。。。。。。。。运算符 名称 描述 + 加 和 - 减 差 * 乘 积 / 除 商 % 模(除法的余数)余数 - x 取反 x 取反 . 并置 连接两个字符串HP7+ 版本新增整除运算符 intdiv()。。。。。。。。。在运算符 等同于 描述x = y x = y 左操作数被设置为右侧表达式的值x += y x = x + y 加x -= y x = x - y 减x *= y x = x * y 乘x /= y x = x / y 除x %= y x = x % y 模(除法的余数)a .= b a = a . b 连接两个字符串。。。。。。。。。运算符 名称 描述++ x 预递增 x 加 1,然后返回 xx ++ 后递增 返回 x,然后 x 加 1(等于本身)-- x 预递减 x 减 1,然后返回 xx -- 后递减 返回 x,然后 x 减 1(等于本身)。。。。。。。。。比较操作符可以让您比较两个值:运算符 名称 描述 实例x == y 等于 如果 x 等于 y,则返回 true 5==8 返回 falsex === y 绝对等于 如果 x 等于 y,且它们类型相同,则返回 true 5==="5" 返回 falsex != y 不等于 如果 x 不等于 y,则返回 true 5!=8 返回 truex y 不等于 如果 x 不等于 y,则返回 true 58 返回 truex !== y 绝对不等于 如果 x 不等于 y,或它们类型不相同,则返回 true 5!=="5" 返回 truex > y 大于 如果 x 大于 y,则返回 true 5>8 返回 falsexx >= y 大于等于 如果 x 大于或者等于 y,则返回 true 5>=8 返回 falsex。。。。。。。。。。运算符 名称 描述 实例x and y 与 如果 x 和 y 都为 true,则返回 true x=6 y=3 (x 1) 返回 true (两边条件都成立时)x or y 或 如果 x 和 y 至少有一个为 true,则返回 true x=6 y=3 (x==6 or y==5) 返回 true (两边条件有一个成立时)x xor y 异或 如果 x 和 y 有且仅有一个为 true,则返回 true x=6 y=3 (x==6 xor y==3) 返回 false (两边条件都不成立时)x && y 与 如果 x 和 y 都为 true,则返回 true x=6 y=3 (x 1) 返回 true (两边条件都成立时)x || y 或 如果 x 和 y 至少有一个为 true,则返回 true x=6 y=3 (x==5 || y==5) 返回 false (两边条件有一个成立时)! x 非 如果 x 不为 true,则返回 true x=6 y=3 !(x==y) 返回 true (取反相值)。。。。。。。。。。运算符 名称 描述x + y 集合 x 和 y 的集合x == y 相等 如果 x 和 y 具有相同的键/值对,则返回 truex === y 恒等 如果 x 和 y 具有相同的键/值对,且顺序相同类型相同,则返回 truex != y 不相等 如果 x 不等于 y,则返回 truex y 不相等 如果 x 不等于 y,则返回 truex !== y 不恒等 如果 x 不等于 y,则返回 true。。。。。。。。。。三元运算符另一个条件运算符是"?:"(或三元)运算符 。语法格式:(expr1) ? (expr2) : (expr3) 对 expr1 求值为 TRUE 时的值为 expr2,在 expr1 求值为 FALSE 时的值为 expr3。自注意:在。。。。。。。。。。组合比较符 ""。。。。。。。。。。运算符优先级下面按照优先级从高到低列出了运算符。同一行中的运算符具有相同优先级,此时它们的结合方向决定求值顺序。说明:左 = 从左到右,右 = 从右到左。结合方向 运算符 附加信息无 clone new clone 和 new左 [ array()右 ++ -- ~ (int) (float) (string) (array) (object) (bool) @ 类型和递增/递减无 instanceof 类型右 ! 逻辑运算符左 * / % 算术运算符左 + – . 算术运算符和字符串运算符左 > 位运算符无 == != === !== 比较运算符左 & 位运算符和引用左 ^ 位运算符左 | 位运算符左 && 逻辑运算符左 || 逻辑运算符左 ? : 三元运算符右 = += -= *= /= .= %= &= |= ^= >= => 赋值运算符左 and 逻辑运算符左 xor 逻辑运算符左 or 逻辑运算符左 , 多处用到运算符优先级中,or 和 ||,&& 和 and 都是逻辑运算符,效果一样,但是其优先级却不一样。。。。。。。。。。。。括号的使用我们通过括号的配对来明确标明运算顺序,而非靠运算符优先级和结合性来决定,通常能够增加代码的可读性。。。。。。。。。。。。组合比较运算符又名太空船运算符,组合比较运算符可以轻松实现两个变量的比较,当然不仅限于数值类数据的比较。语法是这样的:$c = $a $b;这句代码的意思是: 如果 $a > $b, $c 的值为 1 如果 $a == $b, $c 的值为 0 如果 $a 运算符的优先级口诀:括(号)、单(操作数)、算(术)、移(位)、关(系);位(运算符)、逻(辑)、条(件)、赋(值)、逗(号)。::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::条件语句用于根据不同条件执行不同动作。。。。。。。。。。。。当您编写代码时,您常常需要为不同的判断执行不同的动作。您可以在代码中使用条件语句来完成此任务。在if 语句 - 在条件成立时执行代码if...else 语句 - 在条件成立时执行一块代码,条件不成立时执行另一块代码if...elseif....else 语句 - 在若干条件之一成立时执行一个代码块switch 语句 - 在若干条件之一成立时执行一个代码块。。。。。。。。。。if 语句用于仅当指定条件成立时执行代码。语法:if (条件){ 条件成立时要执行的代码;}。。。。。。。。。。在条件成立时执行一块代码,条件不成立时执行另一块代码,请使用 if....else 语句。语法:if (条件){条件成立时执行的代码;}else{条件不成立时执行的代码;}。。。。。。。。。。在若干条件之一成立时执行一个代码块,请使用 if....elseif...else 语句。.语法:if (条件){if 条件成立时执行的代码;}else if (条件){else if 条件成立时执行的代码;}else{条件不成立时执行的代码;}。。。。。。。。。elseif 和 else if 完全同效果,elseif 是::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::switch 语句用于根据多个不同条件执行不同动作。如果您希望有选择地执行若干代码块之一,请使用 switch 语句。语法:{case label1: 如果 n=label1,此处代码将执行; break;case label2: 如果 n=label2,此处代码将执行; break;default: 如果 n 既不等于 label1 也不等于 label2,此处代码将执行;}?>工作原理:首先对一个简单的表达式 n(通常是变量)进行一次计算。将表达式的值与结构中每个 case 的值进行比较。如果存在匹配,则执行与 case 关联的代码。代码执行后,使用 break 来阻止代码跳入下一个 case 中继续执行。default 语句用于不存在匹配(即没有 case 为真)时执行。在 switch 语句中漏写 break, 可能会使你的输出在你意料之外。::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::数组能够在单个变量中存储多个值。。。。。。。。。。。。数组是什么?数组是一个能在单个变量中存储多个值的特殊变量。如果您有一个项目清单(例如:车名字的清单),将其存储到单个变量中,如下所示:$cars1="Volvo";$cars2="BMW";$cars3="Toyota";然而,如果您想要遍历数组并找出特定的一个呢?如果数组的项不只 3 个而是 300 个呢?解决办法是创建一个数组!数组可以在单个变量中存储多个值,并且您可以根据键访问其中的值。。。。。。。。。。。。。在在array();在数值数组 - 带有数字 ID 键的数组关联数组 - 带有指定的键的数组,每个键关联一个值多维数组 - 包含一个或多个数组的数组。。。。。。。。。。。。这里有两种创建数值数组的方法:自动分配 ID 键(ID 键总是从 0 开始):$cars=array("Volvo","BMW","Toyota");人工分配 ID 键:$cars[0]="Volvo";$cars[1]="BMW";$cars[2]="Toyota";。。。。。。。。。。。。获取数组的长度 - count() 函数count() 函数用于返回数组的长度(元素的数量)。。。。。。。。。。。。遍历数值数组遍历并打印数值数组中的所有值,您可以使用 for 循环。。。。。。。。。。。。关联数组是使用您分配给数组的指定的键的数组。这里有两种创建关联数组的方法:$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");或:$age['Peter']="35";$age['Ben']="37";$age['Joe']="43";。。。。。。。。。。。。。遍历关联数组遍历并打印关联数组中的所有值,您可以使用 foreach 循环声明两个变量,一个装属性,一个装值:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::数组中的元素可以按字母或数字顺序进行降序或升序排列。。。。。。。。。。。sort() - 对数组进行升序排列rsort() - 对数组进行降序排列asort() - 根据关联数组的值,对数组进行升序排列ksort() - 根据关联数组的键,对数组进行升序排列arsort() - 根据关联数组的值,对数组进行降序排列krsort() - 根据关联数组的键,对数组进行降序排列。。。。。。。。。。sort() - 对数组进行升序排列,按数组中的元素字母升序排列。数字数组就按数字的大小升序排列。。。。。。。。。。。rsort() - 对数组进行降序排列,按数组中的元素字母降序排列。数字数组就按数字的大小降序排列。。。。。。。。。。。asort() - 根据数组的值,对数组进行升序排列ksort() - 根据数组的键,对数组进行升序排列。。。。。。。。。。arsort() - 根据数组的值,对数组进行降序排列krsort() - 根据数组的键,对数组进行降序排列。。。。。。。。。。以上排序都用print_r输出。::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::超级全局变量在。。。。。。。。。。$GLOBALS$_SERVER$_REQUEST$_POST$_GET$_FILES$_ENV$_COOKIE$_SESSION。。。。。。。。。$GLOBALS 是$GLOBALS 是一个包含了全部变量的全局组合数组。变量的名字就是数组的键。。。。。。。。。$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。下表列出了所有 $_SERVER 变量中的重要元素:$_SERVER['当前执行脚本的文件名,与 document root 有关。例如,在地址为 http://example.com/test.$_SERVER['GATEWAY_INTERFACE']:服务器使用的 CGI 规范的版本;例如,"CGI/1.1"。$_SERVER['SERVER_ADDR']:当前运行脚本所在的服务器的 IP 地址。$_SERVER['SERVER_NAME']:当前运行脚本所在的服务器的主机名。如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定。(如: www.runoob.com)$_SERVER['SERVER_SOFTWARE']:服务器标识字符串,在响应请求时的头信息中给出。 (如:Apache/2.2.24)$_SERVER['SERVER_PROTOCOL']:请求页面时通信协议的名称和版本。例如,"HTTP/1.0"。$_SERVER['REQUEST_METHOD']:访问页面使用的请求方法;例如,"GET", "HEAD","POST","PUT"。$_SERVER['REQUEST_TIME']:请求开始时的时间戳。从$_SERVER['QUERY_STRING']:query string(查询字符串),如果有的话,通过它进行页面访问。$_SERVER['HTTP_ACCEPT']:当前请求头中 Accept: 项的内容,如果存在的话。$_SERVER['HTTP_ACCEPT_CHARSET']:当前请求头中 Accept-Charset: 项的内容,如果存在的话。例如:"iso-8859-1,*,utf-8"。$_SERVER['HTTP_HOST']:当前请求头中 Host: 项的内容,如果存在的话。$_SERVER['HTTP_REFERER']引导用户代理到当前页的前一页的地址(如果存在)。由 user agent 设置决定。并不是所有的用户代理都会设置该项,有的还提供了修改 HTTP_REFERER 的功能。简言之,该值并不可信。)$_SERVER['HTTPS']:如果脚本是通过 HTTPS 协议被访问,则被设为一个非空的值。$_SERVER['REMOTE_ADDR']:浏览当前页面的用户的 IP 地址。$_SERVER['REMOTE_HOST']:浏览当前页面的用户的主机名。DNS 反向解析不依赖于用户的 REMOTE_ADDR。$_SERVER['REMOTE_PORT']:用户机器上连接到 Web 服务器所使用的端口号。$_SERVER['SCRIPT_FILENAME']:当前执行脚本的绝对路径。$_SERVER['SERVER_ADMIN']:该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。(如:someone@runoob.com)$_SERVER['SERVER_PORT']:Web 服务器使用的端口。默认值为 "80"。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。$_SERVER['SERVER_SIGNATURE']:包含了服务器版本和虚拟主机名的字符串。$_SERVER['PATH_TRANSLATED']:当前脚本所在文件系统(非文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。$_SERVER['SCRIPT_NAME']:包含当前脚本的路径。这在页面需要指向自己时非常有用。__FILE__ 常量包含当前脚本(例如包含文件)的完整路径和文件名。$_SERVER['SCRIPT_URI']:URI 用来指定要访问的页面。例如 "/index.html"。。。。。。。。。。。。。。。。。。。。。。。。。$_GET 也可以收集URL中发送的数据。::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块。。。。。。。。。。。在您编写代码时,您经常需要让相同的代码块一次又一次地重复运行。我们可以在代码中使用循环语句来完成这个任务。在while - 只要指定的条件成立,则循环执行代码块do...while - 首先执行一次代码块,然后在指定的条件成立时重复这个循环for - 循环执行代码块指定的次数foreach - 根据数组中每个元素来循环代码块。。。。。。。。。while 循环while 循环将重复执行代码块,直到指定的条件不成立。语法:while (条件){ 要执行的代码;}例子:下面的实例首先设置变量 i 的值为 1 ($i=1;)。然后,只要 i 小于或者等于 5,while 循环将继续运行。循环每运行一次,i 就会递增 1:while($i{ echo "The number is " . $i . ""; $i++;}?>输出:The number is 1The number is 2The number is 3The number is 4The number is 5。。。。。。。。。。。。do...while 语句do...while 语句会至少执行一次代码,然后检查条件,只要条件成立,就会重复进行循环。语法:do{ 要执行的代码;}while (条件);例子:下面的实例首先设置变量 i 的值为 1 ($i=1;)。然后,开始 do...while 循环。循环将变量 i 的值递增 1,然后输出。先检查条件(i 小于或者等于 5),只要 i 小于或者等于 5,循环将继续运行:do{ $i++; echo "The number is " . $i . "";}while ($i?>输出:The number is 2The number is 3The number is 4The number is 5The number is 6:::::::::::::::::::::::::::::::::::::::::::::::::::::::::循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块。。。。。。。。。。。。for 循环for 循环用于您预先知道脚本需要运行的次数的情况。语法for (初始值; 条件; 增量){ 要执行的代码;}参数:初始值:主要是初始化一个变量值,用于设置一个计数器(但可以是任何在循环的开始被执行一次的代码)。条件:循环执行的限制条件。如果为 TRUE,则循环继续。如果为 FALSE,则循环结束。增量:主要用于递增计数器(但可以是任何在循环的结束被执行的代码)。注释:上面的初始值和增量参数可为空,或者有多个表达式(用逗号分隔)。例子:下面的实例定义一个初始值为 i=1 的循环。只要变量 i 小于或者等于 5,循环将继续运行。循环每运行一次,变量 i 就会递增 1:{ echo "The number is " . $i . "";}?>输出:The number is 1The number is 2The number is 3The number is 4The number is 5。。。。。。。。。。foreach 循环foreach 循环用于遍历数组。语法:foreach ($array as $value){ 要执行代码;}每进行一次循环,当前数组元素的值就会被赋值给 $value 变量(数组指针会逐一地移动),在进行下一次循环时,您将看到数组中的下一个值。::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::在。。。。。。。。。我们将如何创建自己的函数。如要在页面加载时执行脚本,您可以把它放到函数里。函数是通过调用函数来执行的。你可以在页面的任何位置调用函数。。。。。。。。。。创建函数是通过调用函数来执行的。语法:{ // 要执行的代码}?>函数的名称应该提示出它的功能函数名称以字母或下划线开头(不能以数字开头)。。。。。。。。。为了给函数添加更多的功能,我们可以添加参数。参数类似变量。参数就在函数名称后面有一个括号内指定。。。。。。。。。。如需让函数返回一个值,请使用 return 语句。:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。有八个魔术常量它们的值随着它们在代码中的位置改变而改变。例如 __LINE__ 的值就依赖于它在脚本中所处的行来决定。这些特殊的常量不区分大小写。。。。。。。。。。__LINE__文件中的当前行号。。。。。。。。。。。__FILE__文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自。。。。。。。。。。__DIR__文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(。。。。。。。。。。__FUNCTION__函数名称(。。。。。。。。。。__CLASS__类的名称(在。。。。。。。。。。__TRAIT__Trait 的名字(Trait 名包括其被声明的作用区域(例如 Foo\Bar)。从基类继承的成员被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。。。。。。。。。。。__METHOD__类的方法名(。。。。。。。。。。__NAMESPACE__当前命名空间的名称(区分大小写)。此常量是在编译时定义的(::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::1. 用户编写的代码与2. 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。。。。。。。。。。。。。。。。定义命名空间默认情况下,所有常量、类和函数名都放在全局空间下,就和命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。语法格式如下;namespace MyProject; // ... 代码 ... ?>你也可以在同一个文件中定义不同的命名空间代码,如下所示: const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ }}namespace AnotherProject { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ }}?>将全局的非命名空间中的代码与命名空间中的代码组合在一起,只能使用大括号形式的语法。全局代码必须用一个不带名称的 namespace 语句加上大括号括起来,如下所示:const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ }}namespace { // 全局代码session_start();$a = MyProject\connect();echo MyProject\Connection::start();}?>在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。所有非namespace MyProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ }}namespace { // 全局代码session_start();$a = MyProject\connect();echo MyProject\Connection::start();}?>。。。。。。。。。。。。子命名空间与目录和文件的关系很像,const CONNECT_OK = 1;class Connection { /* ... */ }function Connect() { /* ... */ }?>上面的例子创建了常量 MyProject\Sub\Level\CONNECT_OK,类 MyProject\Sub\Level\Connection 和函数 MyProject\Sub\Level\Connect。。。。。。。。。。。。命名空间使用1. 非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。2. 限定名称,或包含前缀的名称,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespace\foo。3. 完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo。注意:访问任意全局类、函数或常量,都可以使用完全限定名称。。。。。。。。。。。。命名空间和动态语言特征必须使用完全限定名称(包括命名空间前缀的类名称)。注意因为在动态的类名称、函数名称或常量名称中,限定名称和完全限定名称没有区别,因此其前导的反斜杠是不必要的。。。。。。。。。。。。。namespace关键字和__NAMESPACE__常量常量__NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。__NAMESPACE__ 示例, 在命名空间中的代码关键字 namespace 可用来显式访问当前命名空间或子命名空间中的元素。它等价于类中的 self 操作符。namespace操作符,命名空间中的代码。。。。。。。。。。。。使用命名空间:别名/导入在。。。。。。。。。。。使用命名空间:后备全局函数/常量在一个命名空间中,当1、在命名空间中访问全局类对于函数和常量来说,如果当前命名空间中不存在该函数或常量,2、 命名空间中后备的全局函数/常量。。。。。。。。。。。全局空间如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与。。。。。。。。。。。命名空间的顺序自从有了命名空间之后,最容易出错的该是使用类的时候,这个类的寻找路径是什么样的了。为了引用全局命名空间中的全局类,必须使用完全限定名称 new \C()。:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::在面向对象的程序设计(英语:Object-oriented programming,缩写:OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。在现实世界里我们所面对的事情都是对象,如计算机、电视机、自行车等。对象的主要三个特性:对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为。对象的形态:当施加那些方法是对象如何响应,颜色,尺寸,外型。对象的表示:对象的表示就相当于身份证,具体区分在相同的行为与状态下有什么不同。比如 Animal(动物) 是一个抽象类,我们可以具体到一只狗跟一只羊,而狗跟羊就是具体的对象,他们有颜色属性,可以写,可以跑等行为状态。。。。。。。。。。。。。。面向对象内容类:定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。对象:是类的实例。成员变量:定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,该变量即可称为对象的属性。成员函数:定义在类的内部,可用于访问对象的数据。继承: 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。父类:一个类被其他类继承,可将该类称为父类,或基类,或超类。子类:一个类继承其他类称为子类,也可称为派生类。多态:多态性是指相同的函数或方法可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。重载:简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。抽象性: 抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。封装:封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。构造函数:主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。析构函数:析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。。。。。。。。。。。。。 var $var2 = "constant string"; function myfunc ($arg1, $arg2) { [..] } [..]}?>解析如下:类使用 class 关键字后加上类名定义。类名后的一对大括号({})内可以定义变量和方法。类的变量使用 var 来声明, 变量也可以初始化值。函数定义类似。。。。。。。。。。。。。类创建后,我们可以使用 new 运算符来实例化该类的对象:$runoob = new Site;$taobao = new Site;$google = new Site;以上代码我们创建了三个对象,三个对象各自都是独立的。。。。。。。。。。。。。调用成员方法在实例化对象后,我们可以使用该对象调用成员方法,该对象的成员方法只能操作该对象的成员变量。。。。。。。。。。。。。构造函数是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,在创建对象的语句中与 new 运算符一起使用。。。。。。。。。。。。。。析构函数析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。。。。。。。。。。。。。。继承class Child extends Parent { // 代码部分}。。。。。。。。。。。。方法重写如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。。。。。。。。。。。。。访问控制public(公有):公有的类成员可以在任何地方被访问。protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。private(私有):私有的类成员则只能被其定义所在的类访问。属性的访问控制类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有。方法的访问控制类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。。。。。。。。。。。。接口使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。接口中定义的所有方法都必须是公有,这是接口的特性。要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。。。。。。。。。。。。常量可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号。常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。自。。。。。。。。。。。抽象类任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。定义为抽象的类不能被实例化。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。。。。。。。。。。。。。Static 关键字声明类属性或方法为 static(静态),就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。静态属性不可以由对象通过 -> 操作符来访问。自。。。。。。。。。。。。Final 关键字。。。。。。。。。。。。调用父类构造方法:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::。。。。。。。。。。。。。。。。。。。。。。。。以下实例我们设置了下拉菜单三个选项,表单使用 GET 方式获取数据,action 属性值为空表示提交到当前脚本,我们可以通过 select 的 name 属性获取下拉菜单的值:if($q) { if($q =='RUNOOB') { echo '菜鸟教程http://www.runoob.com'; } else if($q =='GOOGLE') { echo 'Google 搜索http://www.google.com'; } else if($q =='TAOBAO') { echo '淘宝http://www.taobao.com'; }} else {?> 选择一个站点: Runoob Google Taobao ?>。。。。。。。。。。。。。如果下拉菜单是多选的( multiple="multiple"),我们可以通过将设置 select name="q[]" 以数组的方式获取,以下使用 POST 方式提交。。。。。。。。。。。。。单选按钮表单。。。。。。。。。。。。checkbox 复选框。。。。。。。。。。。。$_GET、$_POST 和 $_REQUEST 的区别?$_GET 变量接受所有以 get 方式发送的请求,及浏览器地址栏中的 ? 之后的内容。$_POST 变量接受所有以 post 方式发送的请求,例如,一个 form 以 method=post 提交,提交后$_REQUEST 支持两种方式发送过来的请求,即 post 和 get 它都可以接受,显示不显示要看传递方法,get 会显示在 url 中(有字符数限制),post 不会在 url 中显示,可以传递任意多的数据(只要服务器支持)。:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::表单验证我们应该尽可能的对用户的输入进行验证(通过客户端脚本)。浏览器验证速度更快,并且可以减轻服务器的压力。如果用户输入需要插入数据库,您应该考虑使用服务器验证。在服务器验证表单的一种好的方式是,把表单的数据传给当前页面(异步提交的方式更好),而不是跳转到不同的页面。这样用户就可以在同一张表单页面得到错误信息。用户也就更容易发现错误了。如何使用。。。。。。。。。。。在处理一般表单验证如下:名字必须。 +只能包含字母和空格E-mail必须。 + 必须是一个有效的电子邮件地址(包含'@'和'.')网址可选。如果存在,它必须包含一个有效的URL备注可选。多行输入字段(文本域)性别必须。 必须选择一个。。。。。。。。。。。。表单使用 method="post" 方法来提交数据。。。。。。。。。。。。。什么是 $_SERVER["$_SERVER["所以, $_SERVER["。。。。。。。。。。。。什么是 htmlspecialchars()方法?htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。预定义的字符是:& (和号) 成为 &" (双引号) 成为 "' (单引号) 成为 '> (大于) 成为 >。。。。。。。。。。。。$_SERVER["当黑客使用跨网站脚本的HTTP链接来攻击时,$_SERVER["XSS又叫 CSS (Cross-Site Script) ,跨站脚本攻击。恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。指定以下表单文件名为 "test_form.现在,我们使用URL来指定提交地址 "test_form.这样做就很好了。但是,考虑到用户会在浏览器地址栏中输入以下地址:http://www.runoob.com/test_form.以上的 URL 中,将被解析为如下代码并执行:alert('hacked')代码中添加了 script 标签,并添加了alert命令。 当页面载入时会执行该Javascript代码(用户会看到弹出框)。 这仅仅只是一个简单的实例来说明请注意, 任何JavaScript代码可以添加在标签中! 黑客可以利用这点重定向页面到另外一台服务器的页面上,页面 代码文件中可以保护恶意代码,代码可以修改全局变量或者获取用户的表单数据。。。。。。。。。。。。。。如何避免 $_SERVER["$_SERVER["form 代码如下所示:htmlspecialchars() 把一些预定义的字符转换为 HTML 实体。现在如果用户想利用尝试该漏洞失败!。。。。。。。。。。。。。使用首先我们对用户所有提交的数据都通过当我们使用 htmlspecialchars() 函数时,在用户尝试提交以下文本域:location.href('http://www.runoob.com')该代码将不会被执行,因为它会被保存为HTML转义代码,如下所示:<script>location.href('http://www.runoob.com')</script>以上代码是安全的,可以正常在页面显示或者插入邮件中。当用户提交表单时,我们将做以下两件事情:1. 使用2. 使用接下来让我们将这些过滤的函数写在一个我们自己定义的函数中,这样可以大大提高代码的复用性。将函数命名为 test_input()。:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::字段 验证规则名字 必需。 + 只能包含字母和空格E-mail 必需。 + 必需包含一个有效的电子邮件地址(包含"@"和".")网址 可选。 如果存在,它必需包含一个有效的URL备注 可选。多行字段(文本域)。性别 必需。必需选择一个。:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::现在我们来学如何验证 names(名称), e-mails(邮件), 和 URLs。。。。。。。。。。。。。以下代码将通过简单的方式来检测 name 字段是否包含字母和空格,如果 name 字段值不合法,将输出错误信息:$name = test_input($_POST["name"]);if (!preg_match("/^[a-zA-Z ]*$/",$name)) { $nameErr = "只允许字母和空格"; }。。。。。。。。。。。。preg_match — 进行正则表达式匹配。语法:int preg_match ( string $pattern , string $subject [, array $matches [, int $flags ]] )在 subject 字符串中搜索与 pattern 给出的正则表达式相匹配的内容。如果提供了 matches ,则其会被搜索的结果所填充。$matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推。。。。。。。。。。。。。以下代码将通过简单的方式来检测 e-mail 地址是否合法。如果 e-mail 地址不合法,将输出错误信息:$email = test_input($_POST["email"]);if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) { $emailErr = "非法邮箱格式"; }。。。。。。。。。。。以下代码将检测URL地址是否合法 (以下正则表达式运行URL中含有破折号:"-"), 如果 URL 地址不合法,将输出错误信息:$website = test_input($_POST["website"]);if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) { $websiteErr = "非法的 URL 的地址"; }:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::在从带有 GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送信息的量也有限制。。。。。。。。。。。。何时使用 method="get"?在 HTML 表单中使用 method="get" 时,所有的变量名和值都会显示在 URL 中。注释:所以在发送密码或其他敏感信息时,不应该使用这个方法!然而,正因为变量显示在 URL 中,因此可以在收藏夹中收藏该页面。在某些情况下,这是很有用的。注释:HTTP GET 方法不适合大型的变量值。它的值是不能超过 2000 个字符的。:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::在。。。。。。。。。。。$_POST 变量预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值。从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。注释:然而,默认情况下,POST 方法的发送信息的量最大值为 8 MB(可通过设置。。。。。。。。。。。何时使用 method="post"?从带有 POST 方法的表单发送的信息,对任何人都是不可见的,并且对发送信息的量也没有限制。然而,由于变量不显示在 URL 中,所以无法把页面加入书签。。。。。。。。。。。。预定义的 $_REQUEST 变量包含了 $_GET、$_POST 和 $_COOKIE 的内容。$_REQUEST 变量可用来收集通过 GET 和 POST 方法发送的表单数据。:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::一个数组中的值可以是另一个数组,另一个数组的值也可以是一个数组。依照这种方式,我们可以创建二维或者三维数组。。。。。。。。。多维数组是包含一个或多个数组的数组。在多维数组中,主数组中的每一个元素也可以是一个数组,子数组中的每一个元素也可以是一个数组。。。。。。。。。。输出方式其中的一种:echo $#['#'][0] . '地址为:' . $#['#'][1];::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::。。。。。。。。。Tip时间戳是一个字符序列,表示一定的事件发生的日期/时间。语法:string date ( string $format [, int $timestamp ] )参数 描述format 必需。规定时间戳的格式。timestamp 可选。规定时间戳。默认是当前的日期和时间。。。。。。。。。。。date() 函数的第一个必需参数 format 规定了如何格式化日期/时间。这里列出了一些可用的字符:d - 代表月中的天 (01 - 31)m - 代表月 (01 - 12)Y - 代表年 (四位数)。。。。。。。。。。format 字符 说明 返回值例子日 --- ---d 月份中的第几天,有前导零的 2 位数字 01 到 31D 星期中的第几天,文本表示,3 个字母 Mon 到 Sunj 月份中的第几天,没有前导零 1 到 31l ("L"的小写字母)星期几,完整的文本格式 Sunday 到 SaturdayN ISO-8601 格式数字表示的星期中的第几天(S 每月天数后面的英文后缀,2 个字符 st,nd,rd 或者 th。可以和 j 一起用w 星期中的第几天,数字表示 0(表示星期天)到 6(表示星期六)z 年份中的第几天 0 到 365星期 --- ---W ISO-8601 格式年份中的第几周,每周从星期一开始(月 --- ---F 月份,完整的文本格式,例如 January 或者 March January 到 Decemberm 数字表示的月份,有前导零 01 到 12M 三个字母缩写表示的月份 Jan 到 Decn 数字表示的月份,没有前导零 1 到 12t 给定月份所应有的天数 28 到 31年 --- ---L 是否为闰年 如果是闰年为 1,否则为 0o ISO-8601 格式年份数字。这和 Y 的值相同,只除了如果 ISO 的星期数(W)属于前一年或下一年,则用那一年。(Y 4 位数字完整表示的年份 例如:1999 或 2003y 2 位数字表示的年份 例如:99 或 03时间 --- ---a 小写的上午和下午值 am 或 pmA 大写的上午和下午值 AM 或 PMB Swatch Internet 标准时 000 到 999g 小时,12 小时格式,没有前导零 1 到 12G 小时,24 小时格式,没有前导零 0 到 23h 小时,12 小时格式,有前导零 01 到 12H 小时,24 小时格式,有前导零 00 到 23i 有前导零的分钟数 00 到 59>s 秒数,有前导零 00 到 59>u 毫秒 (时区 --- ---e 时区标识(I 是否为夏令时 如果是夏令时为 1,否则为 0O 与格林威治时间相差的小时数 例如:+0200P 与格林威治时间(GMT)的差别,小时和分钟之间有冒号分隔(T 本机所在的时区 例如:EST,MDT(【译者注】在 Windows 下为完整文本格式,例如"Eastern Standard Time",中文版会显示"中国标准时间")。Z 时差偏移量的秒数.UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的。 -43200 到 43200完整的日期/时间 --- ---c ISO 8601 格式的日期(r RFC 822 格式的日期 例如:Thu, 21 Dec 2000 16:01:07 +0200U 从 Unix 纪元(January 1 1970 00:00:00 GMT)开始至今的秒数 参见 time():::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::在include 和 require 语句用于在执行流中插入写在其他文件中的有用的代码。。。。。。。。。。。。include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的:require 生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行。因此,如果您希望继续执行,并向用户输出结果,即使包含文件已丢失,那么请使用 include。否则,在框架、CMS 或者复杂的包含文件省去了大量的工作。这意味着您可以为所有网页创建标准页头、页脚或者菜单文件。然后,在页头需要更新时,您只需更新这个页头包含文件即可。语法:include 'filename';或者require 'filename';::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::fopen() 函数用于在。。。。。。。。。打开文件fopen() 函数用于在此函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来打开文件:?>文件可能通过下列模式来打开:模式 描述r 只读。在文件的开头开始。r+ 读/写。在文件的开头开始。w 只写。打开并清空文件的内容;如果文件不存在,则创建新文件。w+ 读/写。打开并清空文件的内容;如果文件不存在,则创建新文件。a 追加。打开并向文件末尾进行写操作,如果文件不存在,则创建新文件。a+ 读/追加。通过向文件末尾写内容,来保持文件内容。x 只写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。x+ 读/写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。注释:如果 fopen() 函数无法打开指定文件,则返回 0 (false)。。。。。。。。。。。。关闭文件fclose() 函数用于关闭打开的文件://执行一些代码fclose($file);?>。。。。。。。。。。检测文件末尾(EOF)feof() 函数检测是否已到达文件末尾(EOF)。在循环遍历未知长度的数据时,feof() 函数很有用。注释:在 w 、a 和 x 模式下,您无法读取打开的文件!if (feof($file)) echo "文件结尾";。。。。。。。。。。逐行读取文件fgets() 函数用于从文件中逐行读取文件。注释:在调用该函数之后,文件指针会移动到下一行。。。。。。。。。。。逐字符读取文件fgetc() 函数用于从文件中逐字符地读取文件。注释:在调用该函数之后,文件指针会移动到下一个字符。。。。。。。。。。。当如果你需要处理的数据比较少时可以使用csv文件(这是一类文本文件)存储数据更加便利。注意:CSV文本编码必须和HTML的编码相同,否则用::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::通过。。。。。。。。。。。。创建一个文件上传表单允许用户从表单上传文件是非常有用的。。。。。。。。。。。。。HTML创建上传文件表单 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data"。 标签的 type="file" 属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。注释:允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。。。。。。。。。。。。创建上传脚本通过使用第一个参数是表单的 input name,第二个下标可以是 "name"、"type"、"size"、"tmp_name" 或 "error"。如下所示:$_FILES["file"]["name"] - 上传文件的名称$_FILES["file"]["type"] - 上传文件的类型$_FILES["file"]["size"] - 上传文件的大小,以字节计$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称$_FILES["file"]["error"] - 由文件上传导致的错误代码这是一种非常简单文件上传方式。基于安全方面的考虑,您应当增加有关允许哪些用户上传文件的限制。。。。。。。。。。。。上传限制保存被上传的文件::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::cookie 常用于识别用户。。。。。。。。。。。。Cookie 是什么?cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过。。。。。。。。。。。如何创建 Cookie?setcookie() 函数用于设置 cookie。注释:setcookie() 函数必须位于 标签之前。语法:setcookie(name, value, expire, path, domain);注释:在发送 cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码。(为防止 URL 编码,请使用 setrawcookie() 取而代之。)。。。。。。。。。。。如何取回 Cookie 的值?。。。。。。。。。。。如何删除 Cookie?当删除 cookie 时,您应当使过期日期变更为过去的时间点。。。。。。。。。。。。如果浏览器不支持 Cookie 该怎么办?如果您的应用程序需要与不支持 cookie 的浏览器打交道,那么您不得不使用其他的办法在您的应用程序中的页面之间传递信息。一种方式是通过表单传递数据:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::。。。。。。。。。。。。您在计算机上操作某个应用程序时,您打开它,做些更改,然后关闭它。这很像一次对话(Session)。计算机知道您是谁。它清楚您在何时打开和关闭应用程序。然而,在因特网上问题出现了:由于 HTTP 地址无法保持状态,Web 服务器并不知道您是谁以及您做了什么。Session 的工作机制是:为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,或者通过 URL 进行传导。。。。。。。。。。。。。开始在您把用户信息存储到注释:session_start() 函数必须位于 标签之前。。。。。。。。。。。。存储 Session 变量存储和取回 session 变量的正确方法是使用。。。。。。。。。。。。销毁 Session如果您希望删除某些 session 数据,可以使用 unset() 或 session_destroy() 函数。unset() 函数用于释放指定的 session 变量您也可以通过调用 session_destroy() 函数彻底销毁 session注释:session_destroy() 将重置 session,您将失去所有已存储的 session 数据。:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::。。。。。。。。。。。。。语法:mail(to,subject,message,headers,parameters)to 必需。规定 email 接收者。subject 必需。规定 email 的主题。注释:该参数不能包含任何新行字符。message 必需。定义要发送的消息。应使用 LF (\n) 来分隔各行。每行应该限制在 70 个字符内。headers 可选。规定附加的标题,比如 From、Cc 和 Bcc。应当使用 CRLF (\r\n) 分隔附加的标题。parameters可选。对邮件发送程序规定额外的参数。注释:。。。。。。。。。。。。。。。。。。。。。。。。。。。。:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::。。。。。。。。。。我们使用了FILTER_SANITIZE_EMAIL 过滤器从字符串中删除电子邮件的非法字符FILTER_VALIDATE_EMAIL 过滤器验证电子邮件地址的值:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::在。。。。。。。。。。在创建脚本和 Web 应用程序时,错误处理是一个重要的部分。如果您的代码缺少错误检测编码,那么程序看上去很不专业,也为安全风险敞开了大门。线面是一些最为重要的错误检测方法。将为您讲解不同的错误处理方法:简单的 "die()" 语句自定义错误和错误触发器错误报告。。。。。。。。。。基本的错误处理:使用 die() 函数。。。。。。。。。。创建自定义错误处理器创建一个自定义的错误处理器非常简单。我们很简单地创建了一个专用函数,可以在该函数必须有能力处理至少两个参数 (error level 和 error message),但是可以接受最多五个参数(可选的:file, line-number 和 error context):语法:error_function(error_level,error_message,error_file,error_line,error_context)error_level 必需。为用户定义的错误规定错误报告级别。必须是一个数字。参见下面的表格:错误报告级别。error_message必需。为用户定义的错误规定错误消息。error_file 可选。规定错误发生的文件名。error_line 可选。规定错误发生的行号。error_context可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。。。。。。。。。。。。错误报告级别,这些错误报告级别是用户自定义的错误处理程序处理的不同类型的错误值 常量 描述2 E_WARNING 非致命的 run-time 错误。不暂停脚本执行。8 E_NOTICErun-time 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。256 E_USER_ERROR 致命的用户生成的错误。这类似于程序员使用512 E_USER_WARNING 非致命的用户生成的警告。这类似于程序员使用1024 E_USER_NOTICE 用户生成的通知。这类似于程序员使用4096 E_RECOVERABLE_ERROR可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler())8191 E_ALL 所有错误和警告。(在。。。。。。。。。。。。设置错误处理程序可以修改错误处理程序,使其仅应用到某些错误,这样脚本就能以不同的方式来处理不同的错误。。。。。。。。。。。。。触发错误在脚本中用户输入数据的位置,当用户的输入无效时触发错误是很有用的。在可能的错误类型:E_USER_ERROR - 致命的用户生成的 run-time 错误。错误无法恢复。脚本执行被中断。E_USER_WARNING - 非致命的用户生成的 run-time 警告。脚本执行不被中断。E_USER_NOTICE - 默认。用户生成的 run-time 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。。。。。。。。。。。。。错误记录在默认的情况下,根据在通过电子邮件向您自己发送错误消息,是一种获得指定错误的通知的好办法。:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::。。。。。。。。。。。。异常是什么异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。当异常被触发时,通常会发生:当前代码状态被保存代码执行被切换到预定义(自定义)的异常处理器函数根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本我们将展示不同的错误处理方法:异常的基本使用创建自定义的异常处理器多个异常重新抛出异常设置顶层异常处理器注释:异常应该仅仅在错误情况下使用,而不应该用于在一个指定的点跳转到代码的另一个位置。。。。。。。。。。。。。异常的基本使用当异常被抛出时,其后的代码不会继续执行,如果异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么将发生一个严重的错误(致命错误),并且输出 "Uncaught Exception" (未捕获异常)的错误消息。。。。。。。。。。。。。Try、throw 和 catch要避免上面实例中出现的错误,我们需要创建适当的代码来处理异常。适当的处理异常代码应该包括:Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。Throw - 里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"。Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象。。。。。。。。。。。。。创建一个自定义的 Exception 类创建自定义的异常处理程序非常简单。我们简单地创建了一个专门的类,当这个自定义的 customException 类继承了。。。。。。。。。。。。多个异常可以为一段脚本使用多个异常,来检测多种情况。可以使用多个 if..else 代码块,或一个 switch 代码块,或者嵌套多个异常。这些异常能够使用不同的 exception 类,并返回不同的错误消息。。。。。。。。。。。。重新抛出异常有时,当异常被抛出时,您也许希望以不同于标准的方式对它进行处理。可以在一个 "catch" 代码块中再次抛出异常。脚本应该对用户隐藏系统错误。对程序员来说,系统错误也许很重要,但是用户对它们并不感兴趣。为了让用户更容易使用,您可以再次抛出带有对用户比较友好的消息的异常。。。。。。。。。。。。设置顶层异常处理器set_exception_handler() 函数可设置处理所有未捕获异常的用户定义函数。。。。。。。。。。。。。异常的规则需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。使用多个 catch 代码块可以捕获不同种类的异常。可以在 try 代码块内的 catch 代码块中抛出(再次抛出)异常。简而言之:如果抛出了异常,就必须捕获它。::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::。。。。。。。。。。。。什么是测试、验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分。。。。。。。。。。。。。为什么使用过滤器?几乎所有的 Web 应用程序都依赖外部的输入。这些数据通常来自用户或其他应用程序(比如 web 服务)。通过使用过滤器,您能够确保应用程序获得正确的输入类型。您应该始终对外部数据进行过滤!输入过滤是最重要的应用程序安全课题之一。什么是外部数据?来自表单的输入数据CookiesWeb services data(服务数据)服务器变量数据库查询结果。。。。。。。。。。。。。。函数和过滤器如需过滤变量,请使用下面的过滤器函数之一:filter_var() - 通过一个指定的过滤器来过滤单一的变量filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量filter_input - 获取一个输入变量,并对它进行过滤filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤。。。。。。。。。。。。。。Validating 和 Sanitizing有两种过滤器:Validating 过滤器:用于验证用户输入严格的格式规则(比如 URL 或 E-Mail 验证)如果成功则返回预期的类型,如果失败则返回 FALSESanitizing 过滤器:用于允许或禁止字符串中指定的字符无数据格式规则始终返回字符串。。。。。。。。。。。。。选项和标志选项和标志用于向指定的过滤器添加额外的过滤选项。不同的过滤器有不同的选项和标志。。。。。。。。。。。。。。验证输入让我们试着验证来自表单的输入。我们需要做的第一件事情是确认是否存在我们正在查找的输入数据。然后我们用 filter_input() 函数过滤输入的数据。。。。。。。。。。。。。。净化输入让我们试着清理一下从表单传来的 URL。首先,我们要确认是否存在我们正在查找的输入数据。然后,我们用 filter_input() 函数来净化输入数据。。。。。。。。。。。。。。过滤多个输入表单通常由多个输入字段组成。为了避免对 filter_var 或 filter_input 函数重复调用,我们可以使用 filter_var_array 或 the filter_input_array 函数。。。。。。。。。。。。。。使用 Filter Callback通过使用 FILTER_CALLBACK 过滤器,可以调用自定义的函数,把它作为一个过滤器来使用。这样,我们就拥有了数据过滤的完全控制权。您可以创建自己的自定义函数,也可以使用已存在的将您准备用到的过滤器的函数,按指定选项的规定方法进行规定。在关联数组中,带有名称 "options"。:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::。。。。。。。。。。检测一个数字是否在一个范围内。。。。。。。。。。检测 IPv6 地址。。。。。。。。。。检测 URL - 必须包含QUERY_STRING(查询字符串)。。。。。。。。。。移除 ASCII 值大于 127 的字符::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::我们将为大家介绍如何使用。。。。。。。。。。环境配置,在。。。。。。。。。。JSON 函数函数 描述json_encode 对变量进行 JSON 编码json_decode 对 JSON 格式的字符串进行解码,转换为json_last_error返回最后发生的错误。。。。。。。。。。json_encode语法:string json_encode ( $value [, $options = 0 ] )参数value: 要编码的值。该函数只对 UTF-8 编码的数据有效。options:由以下常量组成的二进制掩码:JSON_HEX_QUOTJSON_HEX_TAGJSON_HEX_AMP JSON_HEX_APOS JSON_NUMERIC_CHECK JSON_PRETTY_PRINT JSON_UNESCAPED_SLASHES JSON_FORCE_OBJECT。。。。。。。。。。。json_decode语法:mixed json_decode ($json_string [,$assoc = false [, $depth = 512 [, $options = 0 ]]])参数json_string: 待解码的 JSON 字符串,必须是 UTF-8 编码数据assoc : 当该参数为 TRUE 时,将返回数组,FALSE 时返回对象。depth : 整数类型的参数,它指定递归深度options : 二进制掩码,目前只支持 JSON_BIGINT_AS_STRING 。::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::序号 内容1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::通过MySQL 是跟。。。。。。。。。。。。。MySQL 是什么?MySQL 是一种在 Web 上使用的数据库系统。MySQL 是一种在服务器上运行的数据库系统。MySQL 不管在小型还是大型应用程序中,都是理想的选择。MySQL 是非常快速,可靠,且易于使用的。MySQL 支持标准的 SQL。MySQL 在一些平台上编译。MySQL 是免费下载使用的。MySQL 是由 Oracle 公司开发、发布和支持的。MySQL 是以公司创始人 Monty Widenius's daughter: My 命名的。MySQL 中的数据存储在表中。表格是一个相关数据的集合,它包含了列和行。在分类存储信息时,数据库非常有用。一个公司的数据库可能拥有以下表:EmployeesProductsCustomersOrders。。。。。。。。。。。。。。。。。。查询查询是一种询问或请求。通过 MySQL,我们可以向数据库查询具体的信息,并得到返回的记录集。请看下面的查询(使用标准 SQL):mysql> set names utf8;mysql> SELECT name FROM websites;+---------------+| name |+---------------+| Google || 淘宝 || 菜鸟教程 || 微博 || Facebook || stackoverflow |+---------------+6 rows in set (0.00 sec)语句 set names utf8;用于设定数据库编码,让中文可以正常显示。上面的查询选取了 "websites" 表中 "name" 列的所有数据。。。。。。。。。。。。下载 MySQL 数据库如果您的。。。。。。。。。。。关于 MySQL 数据库的事实关于 MySQL 的一点很棒的特性是,可以对它进行缩减,来支持嵌入的数据库应用程序。也许正因为如此,许多人认为 MySQL 仅仅能处理中小型的系统。事实上,对于那些支持巨大数据和访问量的网站(比如 Friendster、Yahoo、Google),MySQL 是事实上的标准数据库。::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::MySQLi extension ("i" 意为 improved)PDO (在。。。。。。。。。。。。。。。。我是该用 MySQLi ,还是 PDO?如果你需要一个简短的回答,即 "你习惯哪个就用哪个"。MySQLi 和 PDO 有它们自己的优势:PDO 应用在 12 种不同数据库中, MySQLi 只针对 MySQL 数据库。所以,如果你的项目需要在多种数据库中切换,建议使用 PDO ,这样你只需要修改连接字符串和部分查询语句即可。 使用 MySQLi, 如果不同数据库,你需要重新编写所有代码,包括查询。两者都是面向对象, 但 MySQLi 还提供了 API 接口。两者都支持预处理语句。 预处理语句可以防止 SQL 注入,对于 web 项目的安全性是非常重要的。。。。。。。。。。。。。。。。。MySQLi 和 PDO 连接 MySQL 实例我们会使用以下三种方式来演示MySQLi (面向对象)MySQLi (面向过程)PDO。。。。。。。。。。。。。。。MySQLi 安装,Linux 和 Windows: 在安装详细信息,请查看: http://。。。。。。。。。。。。。。。PDO 安装,可以通过PDO 安装详细信息,请查看: http://。。。。。。。。。。。。。。。连接 MySQL在我们访问 MySQL 数据库前,我们需要先连接到数据库服务器