




已阅读5页,还剩158页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PHP核心技术,46388723一、入门指引,PHP是什么?HypertextPreprocessor,超文本预处理器PersonalHomePage,个人主页是一种在服务器端执行的脚本语言,可嵌入到HTML中,尤其适合web开发。PHP能做什么?1.服务端脚本(网站和web应用程序)这是PHP最传统,也是最主要的目标领域。(PHP解析器,web服务器和web浏览器)2.命令行脚本可以编写一段PHP脚本,并且不需要任何服务器或者浏览器来运行它,通过这种方式,仅仅只需要PHP解析器来执行。3.编写桌面应用程序可以使用PHP-GTK来编写桌面应用程序。PHP能够用在所有的主流操作系统上,包括*nix,windows和mac系统。,B/S,二、安装与配置,安装apache安装php安装mysql虚拟主机配置权限权限设置分布式配置文件,2.1安装apache,认识apacheApachehttpserver是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上。安装步骤演示,截图,要点让学生访问,分析itworks是哪里来的?(默认索引页和默认文档目录)静态网站和动态网站的概念,2.2安装php,Apache不能提供解析PHP代码的功能。安装步骤,截图说明之,安装完成使用phpinfo测试之要点:将php安装成apache模块,使用loadmodule指令完成。2.根据请求的资源后缀决定是否交给php解释器处理,使用FilesMatch指令完成。3.需要告知apache,如何找到php.ini配置文件,注意AddHandler和FilesMatch的区别php与apache之间的联系,2.3安装mysql,安装过程截图说明之安装细节详细说明,重点的地方,要强调,重点有以下几个:更改安装目录和数据存放目录更改字符集包含bin目录3306端口,2.4虚拟主机配置,启用vitualhosts配置配置节点hosts文件,配置主机和域名对应关系,配置细节配置项一般不区分大小写,但参数通常是大小写敏感的配置项要顶格写,否则无效#表示注释/和的使用,路径的结尾不用添加斜线的使用Apache的每一次配置,包括后面的php.ini的配置,都需要重启apache才能生效如果配置错误,则Apache不能正常启动,2.5访问权限配置,在其它盘符下新建一文件夹,并配置好虚拟主机,访问之:Apache提供了严格的目录权限控制机制,目录权限控制,对当前目录及其子目录有效果,如果没有针对某个目录进行访问权限配置,则使用默认配置。访问权限控制通过directory指令段来实现,一是独立使用directory段来配置,二是在对应的VirtualHost中配置(推荐使用)。,2.5访问权限配置(续),如果首页不是index.html,比如将其改成xunlei.html或者index.htm,再次访问,还是出现了Forbidden提示,why?这里涉及两个问题,一是默认是索引页,二是对索引列表的显示控制。此时,再次访问http:/x此时,再次访问,可以看到如下列表:,2.5访问权限配置(续),关于Deny和Allow的说明总则:影响最终判断结果的只有两点:order语句中allow、deny的先后顺序;allow、deny语句中各自包含的范围。注意:修改完配置后要保存好并重启Apache服务,配置才能生效;开头字母不分大小写;allow、deny语句不分先后顺序,谁先谁后不影响最终判断结果,但都会被判断到;order语句中,“allow,deny”之间“有且只有”一个逗号(英文格式的),而且先后顺序很重要;Apache有一条缺省规则,“orderallow,deny”本身就默认了拒绝所有的意思,因为deny在allow的后面;同理,“orderdeny,allow”本身默认的是允许所有;“orderallow,deny”代表先判断allow语句再判断deny语句,反之亦然。,2.5访问权限配置(续),判断原则:首先判断默认的;然后判断逗号前的;最后判断逗号后的;最终按顺序叠加而得出判断结果。实例分析:,2.6分布式配置文件,考虑场景:内容提供者需要针对特定目录改变服务器的配置而又没有root权限。在同一个机器上运行了多个用户站点,服务器管理员不愿意频繁的修改配置,而是将改变配置的工作交给用户。此时就需要一种能够针对某个目录进行独立配置的机制,为此Apache提供了分布式配置文件,此配置文件的名称是.htaccess。它提供了针对每个目录改变配置的方法。即在一个特定的目录中放置一个包含指令的文件,其中的指令作用于此目录及其所有子目录。,注意细节.htaccess文件,比较特殊,可以使用editplus或者ST2等编辑器来创建。.htaccess属于目录级别的控制,对应于Directory指令段中的配置。.htaccess默认并未启用,可在主配置文件中使用allowoverride指令加以配置。配置修改.htaccess文件,不需要重启,每次都会读取,性能有损失。,三、PHP语言基础,PHP执行周期PHP基本语法变量常量数据类型类型转换运算符表达式,3.1PHP执行周期,apache通过模块来调用php程序初始化php的执行环境(读配置文件,加载扩展)处理相应的php代码代码执行完毕,释放php所占用的系统资源将执行结果返回给apache服务器,解释型OR编译型,3.2PHP基本语法(1),为什么需要标记?2.四种PHP标记需要开启short_open_tag需要开启asp_tags3.PHP语句结束符语句结束符以分号结束在php的结束标记内,内置一个语句结束符如果php代码段是整个文档内最后的一个代码段,可以省略结束标记建议,如果整篇文档都为php代码,建议不写结束标记。,3.2PHP基本语法(2),4.php的注释#单行,unix风格/单行,c风格/*/多行c风格,注意细节尽量多写注释注释应尽量规范化推荐使用phpdocumentor规范php注释只能注释php的代码,不能注释标签的内容放在html代码注释内的php代码也会被执行,3.3变量-基础,变量的基本概念变量的使用赋值:无需声明,也无需考虑其类型,直接赋值即可。获取:直接通过变量名引用修改:重新赋值即可删除:unset变量名命名规范规定:字符,下划线,数字原则:见名知意方式:下划线,驼峰,注意细节$不是变量名的一部分,这是语法,表示后边的标识符是一个变量(特殊的this)当使用一个没有定义的变量时,会报一个notice错误,可以使用isset来检查变量名是大小写敏感的,建议使用下划线方式,3.3变量-赋值,注意细节unset一个变量时,删除了该变量,以及标识符到变量之间的引用只有有名字的变量才可以引用赋值。($bar=),值传递,引用传递,3.3变量-可变变量、变量范围,可变变量一个变量的变量名是可以变化的一个变量的变量名可以用另一个变量名来代替,标识符可以是一个变量。变量范围变量的范围即它定义的上下文背景(也就是它的生效范围),也叫作用域,它指的是一个变量在一段代码中被另一段代码发现并操作的问题。在默认情况下,一个变量在整个PHP代码中(PHP文件范围)可见。实际上根据作用域来划分有三种变量:超全局变量全局变量局部变量,3.3变量-预定义变量,php中存在很多不需要用户脚本来定义就可以直接使用的变量,称之为预定义变量。$_POST$_GET$_REQUEST$_SERVER$_FIELS$_SESSION$_COOKIE$_ENV$GLOBALS),注意细节使用request时,如果post和get都有一个相同名称的变量时,则只保留post,取决于php的配置request_order=GP;$GLOBALS引用全局作用域中可用的全部变量,$_SERVER,保存的是web服务器可以获得的所有环境和请求信息。常用的有PHP_SELFSERVER_ADDRREMOTE_ADDRSCRIPT_NAME,3.4常量-语法,常量vs变量常量前面没有美元符号($);常量只能用define()函数定义,而不能通过赋值语句;常量可以不用理会变量的作用域而在任何地方定义和访问;常量一旦定义就不能被重新定义或者取消定义;常量的值只能是标量。,和变量相对应的是常量,在脚本执行期间其值不能改变。常量是一个简单值的标识符(名字)。常量默认为大小写敏感(可以使用define函数的第三个参数加以控制),通常常量标识符总是大写的。常量名和其它任何PHP标签遵循同样的命名规则。定义:使用define函数获取:可以简单的通过指定其名字来取得常量的值,const函数defined函数,3.4常量-预定义常量,PHP自身也定义大量的预定义常量,可以使用get_defined_constants()来查看。比如:PHP_OSPHP_VERSIONPHP_EOLPHP_INI_MAXPATH_SEPARATOR环境变量中路径分隔符(w;*nix:)DIRECTORY_SEPARATOR目录分隔符,3.4常量-魔术常量,php定义了一些常量,从长相上看是常量,但实际上不是常量的数据,这些常量称为魔术常量。,注意它们的值随着它们在代码中的位置改变这些特殊的常量不区分大小写,但尽量大写,保持一致。,3.5数据类型-概念,什么是数据类型?数据类型,顾名思义就是指某种类型的数据,不同类型的数据在结构、可交互性及操作方式都有不同的限制和约定。定义变量时,如何声明其类型?变量的类型通常不是由程序员设定的,确切地说,是由PHP根据该变量使用的上下文在运行时决定的。如果想查看某个表达式的值和类型,用var_dump()函数。,3.5数据类型-整型,先来看看两个php预定义常量,并分析结果整型的表示方式较多,除了默认的十进制之外,还可以使用八进制和十六进制来表示。没有任何前缀的为10进制如果以0开头的为8进制如果以0 x开头的为16进制将0123转成十进制数,将0 x1A转成十进制数将10进制(如55)转成8进制和16进制,如何转?长除法(画图演示),注意细节对于整型,一旦数值过大,不会溢出,而是发生类型转换,会转成浮点型。php不支持无符号整型。,3.5数据类型-浮点型,也叫浮点数,双精度数或实数,注意在PHP中,实际上double和float是相同的,由于一些历史的原因,这两个名称同时存在。在PHP中浮点数具有14位十进制数字的精度,最大值和平台相关,通常是1.8e308。定义浮点数的方式,注意细节不要通过判断两个浮点数是否相等来获得业务逻辑。,3.5数据类型-布尔,boolean,这是最简单的类型,只有两个值TRUE和FALSE。通常我们使用某些运算符返回boolean值,并将其传递给控制流程。,注意细节TRUE和FALSE不区分大小写有时候,可能会使用1表示true,0表示false,但要注意,1和0是在运行时,被转换成了true和false,1和0本身并没有真假的含义一般对于0会被转成false,非0的值都会被转换为true,3.5数据类型-字符串(1),一个字符串就是由一系列的字符组成。可以通过下面的4种方法来定义:单引号双引号heredoc语法结构nowdoc语法结构(PHP5.3.0以后),注意细节单引号中可以包含双引号,双引号中也可以包含单引号“hello$name”和hello$name,变量是否解析取决于是由谁来定义的的用法,$在一起的时候,意味着解析变量,3.5数据类型-字符串(2),需求:使用php输出一个a标签,并给a标签定义一个点击事件,alert一句话。,注意细节双引号支持所有的转义字符,单引号可以支持和转义,其他的均不支持在单引号前或在字符串的结尾处想要输出反斜线,使用,在任何其它的字符前加了反斜线,反斜线将会被直接输出。,常见的转义字符,注意x61的用法,3.5数据类型-字符串(3),当定义一个比较复杂(比如多行,或者含有一些需要特殊处理的字符)的字符串时,如刚才的那个例子,此时使用单引号和双引号就略显乏力。为此,php提供了一种专门用于定义字符串的方式,这就是定界符。有两种定界符定义方式,heredoc和nowdoc,其区别有两点:形式上,nowdoc中的变量开始标记需要使用单引号功能上,类似于同双引号和单引号的对比,即在heredoc中,变量可以解析,在nowdoc中不解析我们经常使用定界符的形式来定义html或js代码字符串。,注意细节使用定界符时,对于结束标记有严格的要求,必须顶格写,3.5数据类型-数组,数组是一组数据的集合,所以数组是一种复合数据类型,一个数据可以表示多个值。由key/value组成的键值对来表示的,每个键值对表示一个元素。定义数组:使用array语言结构,或者直接使用中括号语法获取元素的值:使用中括号语法,查看整个数组使用print_r函数修改元素:使用方括号语法来修改删除元素:使用unset,注意删除单个元素和整个数组的区别,注意细节元素的下标只能是字符串和整型,可以使用浮点数,但会被取整,如果使用字符串形式的数字,则仍会被当做整数。如果使用布尔型,则true-1,false-0可以不指定下标,如果不指定下标,则系统会自动分配一个数字下标,其值是当前最大的下标+1。如果指定的键名已经有了值,则该值会被覆盖。应始终在用字符串表示的数组索引上加上引号。$foobar$foobar。字符串的特殊用法,3.5数据类型-对象和资源,对象和数组相同的是对象具备保存多个值的能力,和数组不同的是,对象还可以有处理所保存数据的能力。所以,对象是有生命力的数组。资源类型在使用PHP去操作不完全属于php的资源时,比如数据库,文件,图像等,都会产生资源。所以资源是一种特殊变量,保存了对外部资源的一个引用。资源类型不能通过用户手动创建,而需要通过php的内置函数来获得资源。,3.5数据类型-NULL,NULL值表示一个变量没有值,NULL类型唯一可能的值就是NULL,不区分大小写。在下列情况下一个变量被认为是NULL:被赋值为NULL尚未被赋值被unset()一个常见的应用,就是将对象的值赋值为NULL,用于销毁对象。,注意细节要查看null值,要使用var_dump函数输出未定义的变量(不存在),其值也是null,3.5数据类型-伪类型,在对程序进行描述时,有时会产生一些不真实或不确定的类型,我们可以使用伪类型加以描述。更多的出现在手册当中。numbernumber说明一个参数可以是integer或者float。如max函数。mixed说明一个参数可以接受多种不同的(但并不必须是所有的)类型。如var_dump函数。callback是指接受用户自定义的函数作为一个参数,回调函数,如array_map函数。voidvoid作为返回类型意味着函数的返回值是无用的。void作为参数列表意味着函数不接受任何参数。如echo和pi。,3.6类型转换-概念,如果一个运算符两边的数据类型不相同的话,php该如何处理?为了保证程序的顺利执行,会在执行过程中,结合上下文,将数据向合适的类型做转换,这就是类型转换。注意两点:在参与运算的多个操作数据之间,运算之前都需要将数据类型转成一致才可以。这并没有改变这些操作数本身的类型;改变的仅是这些操作数如何被求值以及表达式本身的类型。通常使用自动类型转换就可以用于大多数业务逻辑。,弱类型OR强类型,3.6类型转换-强制,自动类型转换:系统自动进行转换强制类型转换:人为的定义将某数据从一种类型转成另一种类型在PHP中,实现强制转换,在要转换的变量之前加上用括号括起来的目标类型即可。(int),(integer)-转换为整型(integer)(bool),(boolean)-转换为布尔型(boolean)(float),(double),(real)-转换为浮点型(float)(string)-转换为字符串(string)(array)-转换为数组(array)(object)-转换为对象(object)(unset)-转换为NULL,注意细节对于任意类型:integer,float,string,booleanandresource,如果将一个值转换为数组,将得到一个仅有一个元素的数组,下标为0,值为该元素的值。将其它类型的值转换为资源没有意义。,3.6类型转换-规则,转换成字符串一个整数或浮点数被转变为数字的字面样式的字符串一个booleanTRUE值被转换成字符串1。BooleanFALSE被转换成数组转换成字符串Array资源总会被转变成Resourceid#1这种结构的字符串NULL总是被转变成空的字符串。转换成整型从布尔值转换,FALSE将产生出0(零),TRUE将产生出1(壹)。从浮点数转换,当从浮点数转换成整数时,将向下取整。从字符串转换,如果字符串没有包含.,e或E并且数字值符合整数类型的限定,可被认定是一个integer,否则被认定为一个float。字符串的开始部分给定了它的值,如果字符串以合法的数字开始,这个数字可直接使用。否则,值就是0。,3.6类型转换-规则,转换成布尔型()当转换为boolean时,以下值被认为是FALSE:布尔值FALSE自身整型值0(零)浮点型值0.0(零)空字符串,以及字符串0(注意00、0.0被认为是TRUE)空数组特殊类型NULL(包括尚未设定的变量)所有其它值都被认为是TRUE(包括对象和资源)。1和其它非零值(不论正负)一样,被认为是TRUE!,注意细节HTML表单并不传递整数、浮点数或者布尔值,它们只传递字符串。FALSE是一个布尔值而false是一个字符串。,3.6数据类型-相关函数,var_dumpget_typesettypeis系列issetemptyisset检测变量是否设置empty检查一个变量是否为空,等同于!(boolean)var,重点关注isset和empty的区别,3.7运算符,运算符是可以通过给出的一或多个值来产生另一个值的东西。根据运算符的功能不同,分成了很多种类的运算符:算术运算符赋值运算符字符串运算符比较运算符递增递减运算符逻辑运算符位运算符错误控制运算符三目运算符,注意细节运算符根据操作数的数目可以分为单目、双目、三目对于双目运算符来说,在进行运算时,必须确保两个操作数的类型相同,如果不相同,则会进行自动类型转换。,3.7.1算术运算符,还记得小学时学到的基本数学知识吗?就和他们一样,注意细节除法运算符总是返回浮点数。只有在下列情况例外:两个操作数都是整数(或字符串转换成的整数)并且正好能整除,这时它返回一个整数。取模运算符的操作数在运算之前都会转换成整数(除去小数部分)。取模$a%$b在$a为负值时的结果也是负值。也就是说,结果的正负取决于$a。,如果有一些特殊的运算,比如,取整、求平方根等怎么办?,3.7.2赋值运算符,基本的赋值运算符是“=”。它意味着把右边表达式的值赋给左边的运算数。赋值运算表达式的值也就是所赋的值。也就是说,“$a=3”的值是3。思考:$a=($b=4)+5;这行代码如何理解?在基本赋值运算符之外,还有适合于所有二元算术,数组集合和字符串运算符的“组合运算符”,这样可以在一个表达式中使用它的值并把表达式的结果赋给它,例如:$a=$a+3$a+=3;,3.7.3字符串运算符,有两个字符串运算符。.=,注意细节echoa,b;和echoa.b;的区别,逗号的效率要高,3.7.4比较运算符,比较运算符,如同它们名称所暗示的,允许对两个值进行比较。,注意细节如果比较一个整数和字符串,则字符串会被转换为整数。如果比较两个数字字符串,则作为整数比较。=和=的区别。比如0=false返回真,而0=false返回假。,3.7.5递增递减运算符,PHP支持C风格的前后递增与递减运算符。,注意细节递增递减运算符不影响布尔值。递减NULL值也没有效果,但是递增NULL的结果是1,3.7.6逻辑运算符,注意细节逻辑运算中的短路运算为什么与和或有两种不同的形式呢?这是因为它们运算的优先级不同。,3.7.7位运算符,位运算符允许对整型数中指定的位进行置位。如果左右参数都是字符串,则位运算符将操作字符的ASCII值。,注意细节要彻底搞清位运算,需要二进制原码、反码和补码的相关知识二进制的运算都是补码的形式进行右移:低位溢出,符号位不变,高位用符号位补全(相当于除以2n然后取整)左移:高位溢出,符号位不变,低位补0(相当于乘以2n),3.7.8运算符,当语句在执行时出现错误(如找不到文件,文件打开失败),php会根据配置信息,将相应的错误信息显示到页面。如果我们预期某段代码可能会发生错误,但又不想让用户看到错误信息的话,可以将错误信息屏蔽掉。PHP支持一个错误控制运算符:。当将其放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都被忽略掉。通常,在处理php不能完全控制的资源时,需要使用这个运算符,比如文件操作,数据库操作,图像操作等。,注意细节运算符只对表达式有效。不能把它放在函数或类的定义之前,也不能用于条件结构例如if和foreach等。,常见的代码,3.7.9三目运算符,从命名上来看,这个运算符应该包含三个运算数,一个运算符隔开两个运算数,那么三个运算符数需要两个运算符?:格式:条件表达式?结果1:结果2和ifelse对应。比如求两个数的较大值:三目运算符还可以嵌套使用,结果1和结果2可以是一个三目运算符表达式。面试题:使用一句代码实现求三个数中的最大值其它特殊运算符:=数组运算符数组运算符-对象运算符instanceof对象运算符,3.7.10优先级和结合性,注意细节运算符优先级指定了两个表达式绑定得有多“紧密”。同一行中的运算符具有相同优先级,此时它们的结合方向决定求值顺序。必要时可以用括号来强制改变优先级。可以增强代码的可读性。$b=$a$a=5,这里还涉及到一个额外的值,即赋值语句本身的值。赋值语句本身求值为被赋的值,即5。实际上这意味着“$a=5”,不必管它是做什么的,是一个值为5的表达式。因而,这样写“$b=($a=5)”和这样写“$a=5;$b=5”(分号标志着语句的结束)是一样的。因为赋值操作的顺序是由右到左的,也可以这么写“$b=$a=5”。另外比较典型的例子就是$a+和if条件中的语句。,四、控制结构,概述顺序结构分支结构循环结构breakcontinueinclude和requirereturn,4.1概述,任何PHP脚本都是由一系列语句构成的。一条语句可以是一个赋值语句,一个函数调用,一个循环,一个条件语句或者甚至是一个什么也不做的语句(空语句)。通过程序提供的语言结构,来控制程序代码的执行顺序,叫做流程控制。典型的三种流程:顺序选择(分支)循环通常,在编写代码之前,先要规划好我们的程序,我们可以采用流程图来设计和描述程序的流程。流程图:以图例的形式表示代码(业务)的执行过程。常用图例:开始和结束,进程,条件判断,进程方向,数据输入,4.2顺序结构,这是最简单的结构,按照代码的书写顺序,从上到下依次执行。如赋值语句,输出语句等。,4.3分支结构-if系列,if结构是很多语言包括PHP在内最重要的特性之一,它允许按照条件执行代码片段。单分支if双分支ifelse多分支ifelseifelseifelse,注意细节多分支if的写法有两种,注意二者之间的区别,只是将连写的elseif分开写而已,elseif,出现这种语法的原因:a.可以在else语句中再嵌套ifelse语句b.如果条件成立时执行的语句只有一条语句时,还可以省略大括号。流程控制的替代语法,替代的是进程语句中的大括号。,设计一个简单的计算器,实现基本的计算功能,4.3分支结构-switch系列,多分支结构除了可以使用ifelseifelse的结构实现,还可以使用switch语句实现。,注意细节在switch中,case后面的值只能是字面量值,如整型、字符串,不能是表达式。是否强制结束switch语句,是利用break或continue来实现的,此时二者没有任何区别。在switch语句中,只要满足一个条件,后面的条件都将不会再做判断,要么直接往下执行,要么直接结束,取决于是否使用了break或continue。switch的替代语法。,4.4循环结构-while系列,while循环,dowhile循环,VS,4.4循环结构-for语句,for循环是PHP最复杂的循环结构,其语法为:问题:假设循环执行了n次,表达式执行了几次?条件表达式执行了几次?条件变化量执行了几次?,注意细节循环执行完后,$i的值仍然存在,这和其他语言不同,因为php没有语句作用域。for语句中的三个表达式,都支持逗号表达式的写法,即可以写多条,每条之间使用逗号隔开,多条语句都会执行,比较特殊的是条件表达式,虽然可以使用多条,但最后一条语句才其判断作用。循环可以嵌套使用,举例说明。,4.5break,仔细分析三种循环,可以发现终止循环的条件都放在循环体之外,有时候我们需要在循环体执行过程中提前终止循环。PHP提供了break和continue两个语句以实现此功能。break结束当前for,fwhile,do-while或者switch结构的执行。,注意细节break可以接受一个可选的数字参数来决定跳出几重循环。默认情况下,跳出第一层循环。,4.6continue,continue在循环结构用用来跳过本次循环中剩余的代码并在条件求值为真时开始执行下一次循环。,注意细节在php内部,把switch当做是只能循环一次的循环结构,故break和continue一样。在循环体内,使用switch语句判断是否需要结束循环时,要注意switch内的break和continue只能退出switch,如果要退出循环,则需要加上层数才行。,4.6include和require,php允许将一段代码分割成多个文件,然后在执行时,利用文件加载语句,将相应的代码组合起来。(画图说明之)最常用的就是include和require,注意二者之间的区别(处理失败方式)include和include_once之间的区别(避免重复包含),注意细节文件路径分为相对路径和绝对路径,注意二者的区别,建议使用绝对路径include使用相对路径时,相对与哪一个文件取决于在哪个文件内执行,而非取决于代码写在哪一个文件内目录分隔符,可以使用预定义常量DIRECTORY_SEPARATOR使用include和requie载入文件时,在乎的是文件内容,而不是文件名(模式切换)include_path的应用(set_include_path或者ini_set),4.7return,通常return是在函数中使用,表示函数的返回值,实际上在函数外部也是可以使用return语句的。在函数外部,return可以终止脚本文件的执行。直接在脚本中使用return是没有多大意义的,我们一般使用exit或者die来终止当前脚本的执行。通常我们是在include文件内使用return语句。此时return只能终止被包含的文件执行,而不会终止包含它的文件。如果在被包含文件中,return有返回值的话,这个值可以被include接收到,并作为include的返回值返回。,五、函数,函数概念用户自定义函数可变函数函数的参数函数体及函数返回值函数的调用(作用域)匿名函数局部静态变量递归函数迭代,5.1什么是函数,简言之,是一段功能代码的集合。分类:系统函数,也叫内置函数,php自己定义的用户自定义函数函数的组成:以max函数为例,分析之函数名,函数标识符参数函数体,实现函数功能的具体代码返回值上述四个组成部分,在有些情况下,是可以省略的。,5.2自定义函数-function,使用关键字function来定义,格式为:函数调用,直接调用,如果有返回值的话,可以以赋值的形式赋值给变量。,注意细节有效的函数名以字母或下划线打头,后面跟字母,数字或下划线。不使用关键字,不和系统函数重名。尽量做到见名知义。使用一致的命名方式(下划线或驼峰式)。函数名是大小写无关的,但尽量保持一致,即在调用函数的时候,使用其在定义时相同的形式。自定义函数,尽量写注释,使用phpdocumentor注释规范。函数需要先定义,后使用。和C,C+等语言不同的是,定义和使用的顺序不影响函数的使用。,5.2自定义函数-create_function,还有一种方式,即使用create_function函数来定义函数:调用,使用create_function方法返回的的字符串名来调用即可create_function和function关键字定义函数的区别是什么?create_function创建的函数是在脚本运行阶段生成的。function关键字创建的函数是在脚本编译阶段生成的。create_function创建的函数是一个临时函数,一般使用在callback所指示参数的位置,如array_map函数,5.3可变函数,PHP不仅支持可变变量,还支持可变函数。这意味着如果一个变量名后有圆括号,PHP将寻找与变量的值同名的函数,并且尝试执行它。使用create_function函数创建一个函数,并赋值给变量$func1,然后通过此变量进行调用,这个就是可变函数的用法。可变函数不仅适用于create_function,也适用于普通函数。实例:,5.4函数参数-形参和实参,通过参数列表可以传递信息到函数,即以逗号作为分隔符的表达式列表。在函数定义时,所使用的参数,称之为形式参数,简称形参。在函数调用时,所获得的参数。称之为实际参数,简称实参。形参的名字和实参的名字可以一样。在调用函数时,会将实参传递给形参,以保证函数体可以有效的运行。既然是赋值,就存着两种赋值方式,值传递和引用传递。使用上面这种方式,有时候会提示deprecated,表示过时的意思,这种写法已经不推荐了,一般应该在函数定义时,决定参数的传递类型,在参数前加上warning逻辑错误关于错误,在PHP中,有两种处理方法:PHP标准错误异常(面向对象思想解决错误的方法),9.2错误处理-标准错误,常见的错误级别有哪些?E_ERROR,E_WARNING,E_NOTICE,E_STRICT,E_ALL当错误发生了,应该怎么办?通常有以下几种触发方式:显示错误报告记录错误日志(不显示错误,而是将其写入某个文件)采用用户自定义的错误处理器来处理错误,注意细节E_ERROR级别错误是不可恢复的,则脚本直接停止,也不会执行自定义错误处理器error_log的特殊值,不设置、syslog,9.2错误处理-异常,异常用于在错误情况发生时改变脚本的正常流程,它是PHP5提供的一种面向对象的错误处理方法。异常的基本使用创建自定义异常处理器多个异常重新抛出异常设置顶层异常处理器,注意细节如果抛出了异常,就必须捕获它,9.3反射,为什么需要反射?想要获取对象$p的详细信息,包括属性和方法,如何实现?使用类和对象相关函数,但不够详细使用反射反射,就是用来获取某个结构的详细信息的,这其中的结构包括类和方法,以及普通的函数。反射的基本用法反射的应用-简单插件,9.4PDO,开发者的苦恼?需要将项目移植到不同的数据库服务器上去。该怎么做?针对不同的数据库,编写不同的程序,PHP本身是支持其它数据库的,包括Oracle、SQLSERVER、PostgreSQL、SQLite等。一个比较好的办法就是使用OOP思想,制定一个接口或者抽象类,然后分别实现所定义的方法,结合工厂方法,实现之。事实上,PHP本身已经提供了这样一个接口,这就是PDO-PHPDataObject。PDO的安装开启PDO支持,以及其它数据库驱动程序。,9.4PDO-使用,设置DSNPDO类实现基本数据库操作(连接,认证,发送语句)PDOSatatement类处理语句的执行结果的对象,例如处理select语句的获得的结果PDOException类PDO错误处理的异常对象,十、会话技术,什么是会话COOKIESESSION,10.1什么是会话,当一个用户请求一个页面后再请求另外一个页面时,HTTP无法告诉我们这两个请求是来自同一个人。为了使得网站可以跟踪客户端与服务器之间的交互,保存和记忆每个用户的身份和信息,我们需要一种强有力的解决方案,这样就产生了会话控制。会话控制思想就是能够在网站中跟踪一个变量,我们可以跟踪变量,就可以做到对用户的支持,并根据授权和用户身份显示不同内容,不同页面。常用方法:利用get传值使用文件来保存(演示)数据库保存,10.2COOKIE,将数据保存到浏览器端的技术,就是cookie技术。cookie是在浏览器保存额外数据的技术,这是浏览器的技术,而不是php的技术,只不过php支持cookie,可以使用php相关函数来保存或者获取cookie数据。cookie原理,抓包分析,10.2COOKIE,使用cooki需要注意的细节cookie中可以保存哪些数据?过期时间cookie的访问cookie有效范围cookie的不足,10.3SESSION-基本使用,session则是将数据保存到服务器端的一种会话技术。session的使用步骤开启会话注册会话变量使用会话变量注销变量、销毁会话,注意细节session_start()函数实现。在该函数之前不能有输出。注销单个的可以使用unset某个会话,注销所有的则可以使用session_unset()或$_SESSION=array()。,10.3SESSION-详解,SESSION原理,抓包演示session_start到底干了什么?session中可以保存哪些数据?,10.3SESSION-存储机制,SESSION数据是保存在服务器端某个文件夹中的,而在我们的php脚本中,是通过$_SESSION这个数组来操作SESSION数据的。那么$_SESSION与存储SESSION的文件是如何关联的呢?我们需要知道两个非常重要的时刻,session到底干了些什么?开启session脚本结束session存储机制两个方面:读取数据,发生在session_start时写入数据,发生在脚本结束时session入库,10.3SESSION-垃圾回收,什么是session垃圾?垃圾回收,它是通过gc函数来实现的。,注意细节open,read,gc等都是session_start时执行的。read和gc的执行顺序,是先read,然后gc,所以如果有过期的数据,是能够被读取到的,读取数据存入$_SESSION变量,然后删除该文件,在脚本结束的时候,再次执行write,又以当前的sessionid,新建一session文件,并将数据存入其中。如果不需要读取当前数据,需要在read方法上做处理。,10.3SESSIONvsCOOKIE,session是保存在服务器端上,而cookie数据是保存在客户端上的。session默认是基于session的。如果将cookie禁用,session还有效吗?如何解决?方案一:使用session_name函数和session_id获取值然后拼接方案二:直接使用常量SID方案三:启用SID透明支持如何选用的问题,十一、HTTP协议,什么是HTTP协议HTTP请求详解HTTP响应分析PHP模拟请求HTTP应用-防盗链HTTP应用-控制缓存HTTP应用-文件下载,11.1什么是HTTP协议,HyperTextTransferProtocolHTTP就是用于从WWW服务器传输超文本到本地浏览器的传送协议。HTTP协议的请求响应模型HTTP协议的位置HTTP工作流程,默认HTTP的端口号为80HTTPS的端口号为443。,11.2HTTP请求,HTTPRequest,即http请求由三部分组成:请求行、请求头、请求正文。分别以GET和POST请求抓包演示。请求行请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本。请求头请求头包含许多有关的客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器所用的语言,请求正文的长度等。请求正文注意,消息头和消息体中间有一个空行。对于get请求来说,消息体为空,但对于post来说,则有实际内容。,11.3HTTP响应,HTTP响应也是由三个部分组成,分别是:状态行、响应头、响应正文。抓包演示。状态行格式:协议版本号状态码描述1xx:指示信息-表示请求已接收,继续处理2xx:成功-表示请求已被成功接收、理解、接受3xx:重定向-要完成请求必须进行更进一步的操作4xx:客户端错误-请求有语法错误或请求无法实现5xx:服务器端错误-服务器未能实现合法的请求响应头服务器的信息以及一些附件信息响应正文返回给浏览器的内容,注意和头信息之间有一个空行,11.4php模拟请求,为何要模拟如何模拟,11.5HTTP应用-防盗链,什么是盗链?盗链是指服务提供商自己不提供服务的内容,通过技术手段直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。盗链者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。常见的盗有以下几种:图片盗链、音频盗链、视频盗链、文件盗链。如何防止盗链?原始方式-不定义更改文件或目录名称加密认证图片加水印限制引用页-HTTP_REFERER,11.6HTTP应用-控制缓存,什么是浏览器缓存?为了提高访问网页的速率,浏览器会将曾经访问的网页内容(包括图片以及cookie文件等)存放在用户电脑磁盘里。这个存放空间,就称它为浏览器缓存。以后每次访问网站时,浏览器会首先搜索这个目录,其中已经有访问过的内容,那浏览器就不必从网上下载,而直接从缓存中调出来,从而提高了访问网站的速率。关键代码header(Cache-Control:no-cache);header(Pragma:no-cache);header(Expires:-1);,注意细节在浏览页面的时候,在地址栏里按下enter键和点刷新是不一样的。图片是单独来请求的,这个时候没带header头,它是通过文件属性中的修改时间对比来判断是否重新发送图片。(可通过增加时间戳让其时刻刷新),深入理解Header函数,11.7HTTP应用-文件下载,文件下载原理普通的下载方式安全的下载方式我们只需要向HTTP响应头发送三个头信息,明确告诉浏览器要下载。header(Content-Type:application/octet-stream);header(Content-Disposition:attachment;filename=.$file);header(Content-Length:.filesize($file);,注意细节对于中文文件名如何处理?如果我们的文件过大,一次性读取性能会差一些,可以考虑分批读取。假如我现在要下载多个文件,该怎么办?(封装成一个函数),十二、PHP图像处理,图像处理基础PHP绘图步骤常用绘图函数验证码常用图像处理函数缩略图、加水印,12.1图像处理基础,为何需要图像处理?图片是web网站的基石之一,除了展示一些固定的图片之外,我们还需要动态的处理某些图片,比如最常见的验证码,上传图片时对图片进行缩略、添加水印等处理,绘制并显示股票走势图,电子相册等,还比如在各种统计网站中,要生成各种统计图等。在PHP中,图像绘制和处理是通过GD扩展库来实现的,所以首先需要开启GD扩展。另外要注意的一点就是绘图坐标体系,如下:,12.2PHP绘图步骤,在PHP中绘制一个图像,分为四个步骤:.创建画布.绘制各种图形.输出图像.释放资源在PHP中,通过GD库处理图像的操作,都是在内存中处理的,操作完成以后再以文件流的形式,输出到浏览器或者保存在服务器的磁盘中。,12.3常见绘图函数,创建画布:imagecreate/imagecreatetruecolor输出图像:imagegif/imagepng/imagejpeg/imagewbmp分配颜色:imagecolorallocate填充图像:imagefill绘制点:imagesetpixel绘制直线:imageline绘制矩形:imagerectangle绘制椭圆:imageellipse绘制多边形:imagepolygon绘制弧:imagearc绘制文本:imagestring/imagechar/imagettftext释放资源:imagedestroy,12.4验证码,验证码分析什么是验证码?验证码的形式多种多样,图片验证码,回答问题验证码。验证码技术要点:随机生成字符串灵活控制字符串位置,大小和颜色验证码类编写captcha将验证码功能加入到项目中,12.5图像处理函数,通过已有图像创建画布:imagecreatefromgif/jpeg/png/wbmp获取图片大小:getimagesize取得php支持的图像类型:imagetypescopy系列:imagecopy、imagecopyresampled,12.6缩略图和水印,缩略图分析水印分析完成图像处理类的编写,十三、PHP文件编程,文件编程基础文件相关操作目录相关操作文件上传,13.1文件编程基础,任何数据都是在程序运行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 化学人教版选修5第三章 烃的含氧衍生物第四节 有机合成教学设计1
- 2024-2025学年高中语文 第4单元 12 飞向太空的航程说课稿 新人教版必修1
- 中医药技术培训考试题及答案
- 中医考试题及答案解析
- 2024年泉州2024年道路旅客运输从业资格证模拟试题
- 商务考察用车无偿租给企业使用合同范本
- 酒店式公寓店面产权转让与酒店式管理服务合同
- 人工智能商业数据分析资源授权与智能决策协议
- 个人旅游贷款合同展期与旅游服务保障协议
- 2025企业员工合同终止证明
- SYT 6680-2021 石油天然气钻采设备 钻机和修井机出厂验收规范-PDF解密
- 《遗传学》课程标准
- 蛋白质分离纯化及鉴定
- 2024年化粪池清理合同协议书范本
- 实用美术基础中职全套教学课件
- 债权债务法律知识讲座
- 南京财经大学《812西方经济学(宏观经济学、微观经济学)》历年考研真题及详解
- 基于教育培训行业的客户关系营销研究
- 肉制品工艺学-香肠类制品-课件
- 超全QC管理流程图
- 2广告实务课程标准
评论
0/150
提交评论