在lovo学习php已经两个月了,这两个月自己又学会了些什么呢?
什么是php?这是刚刚开始的疑问,开始只是很模糊的理解成web服务器的后台应用程序什么的,到后来学习后才慢慢的认识了php,php的全名是HyperText Preprocessor(超文本预处理器),最开始发明者的目的是用来处理自己的个人主页的,因此php最开始是代表Personal Home Page,发展至今,php不在是简单的处理服务器端的脚本程序了(例如:从表单中收集资料;产生动态的网页内容;传送及接收cookies等),php还可以应用于命令行脚本和编写桌面程序等等。
认识php后我们还得知道他是怎么去运行工作的,首先我们得拥有php本身,php本身相对于编译语言来说是一种脚本语言,和javascript一样是一种解释性的语言,javascript可以通过浏览器去解释执行,而php是运用在服务器端的,因此服务器端得有对应的程序去处理我们编写的php代码,这就意味着我们必须得有一个服务器,在服务器里要有运行php代码的应用程序,幸运的是,我们使用的是Apache(web服务器应用程序),安装他可以让我们自己的电脑成为一个服务器,并且里面包含了一个数据库和我们需要的php的应用程序;理解php的运行环境后我们在来说说他是如何去工作的。说的简单点,php帮助web服务器去理解客户端发送的请求消息,告知服务器以何种HTML的形式向客户端发送适当的web页面,但生成的这个web页面又和由普通的HTML产生的web页面有所不同,因为他没有服务器的解释,服务器仅仅是发送HTML数据到浏览器
,就这样从而动态的产生HTML代码(如下图)。理解了php是如何工作后,我们来谈谈php这一语言本身,运用以前学习C语言和javascript的基本步骤,我们得从编程语言的基本组成入手————基本字符集、标识符、关键字、语句和标准库函数。php的语法和C语言很类似,基本字符集包括:数字字符,拉丁字母,运算符,特殊符号和不可显示字符(_(连字符或下划线)、空格、换行、制表符);标识符规则也是由字母或下划线打头,并且区分大小写;关键字和语句也同C极为类似;php拥有功能非常完善的函数库,在php手册中基本罗列齐全。
简单阐述了一下基本组成,我们再说说基本语法,php的书写方式是以“<?php”开始,“?>”结束,他可以嵌入在html代码中,也可以嵌套在javascript代码中;php代码的注释有很多种方法,/* */ 多行注释,//或者# 单行注释;php的数据类型和其他语言稍有不同,除开基本的布尔型(boll),整型(integer),字符串型(string),浮点型(float),空值(null),php还有对象类型(object),数组类型(array)和资源类型(resource);我们还是简单的说说这些数据类型的特点:
整型变量的值是整数,表示范围是-2147483648~2147483647;字符串型是以单括号或双括号括起来的,但使用双括号时如果字符串里面有变量或常量的引用时是可以识别的,单引号则将之转化成字符,另外字符串之间的拼接是用的“.”字符连接符,字符串中还有定界符的概念,它通过定界符“<<<”之后提供一个标识符代表字符串的开始,最后也用这个标识符代表结束,只是最后的标识符得顶格书写,在定界符里的字符串类似于用双引号括起来;浮点型有称双精度型也就是说它具有十进制的14位的精度,当然我们也可以用round函数对指定精度内进行四舍五入,例如round(1.2534533,2)就等于1.25;布尔型和空值就不阐述了;数组是一组由相同数据类型元素组成的一个有效映射,在php中,映射就是把values(值)映射到keys(键名)的类型,数组通过array()函数定义,其值使用” key
-> value ”的方式设置,多个值使用逗号分隔,当然也可以不使用key 直接写值,这样会使用默认的key,即是从0开始的数组,值得注意的是,php通过数字作为key并不会自动填充没有定义的比这个数字小的值,这和javascript稍有不同;资源类型是一钟特殊的变量,保存了到外部资源的引用,我们大多数时候会把这个资源类型转化成我们想用的类型在拿来使用,在后面的php与数据库的运用中体现的尤为明显;在php数据类型中依然支持类型间的强制转换,和C类型,在定义或输出某一类型的值是在其前面加一个用圆括号括起来的数据类型,这个数据类型就是我们要转化的类型,还有一种方法是使用settype()函数,不过他返回的是一个布尔值,我们只关心他的执行结果,这就不能想前者一样直接输出了。了解了数据类型后我们来说说如何去声明并使用一个变量。变量的声明是通过一个”$”美元符号开始,变量名则是一个标识符,变量不用特意去声明数据类型,在用”=”赋值运算符为这个变量的值初始化时就确定了它的数据类型;php中变量的作用域得值得注意,举个简单的例子,在一个函数外的声明的变量是不能在函数里得到正确引用的,反之亦然(这里说的是我们自己定义的局部变量,不包括php自身的一些全局变量和用static声明的静态变量)。
除了我们自己定义的变量php中还有一些自身就存在的变量,我们称之为“预定义变量”。
1. 服务器变量$_SERVER,他是有web服务器创建的数组,其内容包括头信息、路径、脚本位置等信息(下表是常用的服务器变量)
服务器变量名
变量的存储内容
$_SERVER["HTTP_ACCEPT"]
当前Accept请求的头信息
$_SERVER["HTTP_ACCEPT_LANGUAGE"]
当前请求的Accept-Language头信息,如zh-cn
$_SERVER["HTTP_ACCEPT_ENCODING"]
当前请求的Accept-Encoding头信息,如gzip、deflate
$_SERVER["HTTP_USER_AGENT"]
当前用户使用的浏览器信息
$_SERVER["HTTP_HOST"]
当前请求的Host头信息的内容,如localhost
$_SERVER["HTTP_CONNECTION"]
当前请求的Connection头信息,如Keep-Alive
$_SERVER["PATH"]
当前的系统路径
$_SERVER["SystemRoot"]
系统文件夹的路径,如C:\Windows
$_SERVER["SERVER_SIGNATURE"]
包含当前服务器版本和虚拟主机名的字符串
$_SERVER["SERVER_SOFTWARE"]
服务器标志的字串,如Apache/ (Win32) PHP/5.2.8
$_SERVER["SERVER_NAME"]
当前运行脚本所在服务器主机的名称,如localhost
$_SERVER["SERVER_ADDR"]
服务器所在的IP地址,如127.0.0.1
$_SERVER["SERVER_PORT"]
服务器所使用的端口,如80
$_SERVER["REMOTE_ADDR"]
正在浏览当前页面用户的IP地址
$_SERVER["DOCUMENT_ROOT"]
当前运行脚本所在的文档根目录,即htdocs目录
$_SERVER["SERVER_ADMIN"]
指明Apache服务器配置文件中的SERVER_ADMIN参数
$_SERVER["SCRIPT_FILENAME"]
当前执行脚本的绝对路径名
$_SERVER["HTTP_ACCEPT"]
当前Accept请求的头信息
$_SERVER["HTTP_ACCEPT_LANGUAGE"]
当前请求的Accept-Language头信息,如zh-cn
$_SERVER["HTTP_ACCEPT_ENCODING"]
当前请求的Accept-Encoding头信息,如gzip、deflate
$_SERVER["HTTP_USER_AGENT"]
当前用户使用的浏览器信息
$_SERVER["HTTP_HOST"]
当前请求的Host头信息的内容,如localhost
$_SERVER["HTTP_CONNECTION"]
当前请求的Connection头信息,如Keep-Alive
$_SERVER["PATH"]
当前的系统路径
$_SERVER["SystemRoot"]
系统文件夹的路径,如C:\Windows
$_SERVER["SERVER_SIGNATURE"]
包含当前服务器版本和虚拟主机名的字符串
$_SERVER["SERVER_SOFTWARE"]
服务器标志的字串,如Apache/ (Win32) PHP/5.2.8
$_SERVER["SERVER_NAME"]
当前运行脚本所在服务器主机的名称,如localhost
$_SERVER["SERVER_ADDR"]
服务器所在的IP地址,如127.0.0.1
$_SERVER["SERVER_PORT"]
服务器所使用的端口,如80
$_SERVER["REMOTE_ADDR"]
正在浏览当前页面用户的IP地址
$_SERVER["DOCUMENT_ROOT"]
当前运行脚本所在的文档根目录,即htdocs目录
$_SERVER["SERVER_ADMIN"]
指明Apache服务器配置文件中的SERVER_ADMIN参数
$_SERVER["SCRIPT_FILENAME"]
当前执行脚本的绝对路径名这些变量在帮助我们理解http协议中可以起到很大的作用;
2. 环境变量$_EVN,
环境变量记录与PHP所运行系统相关的信息,如系统名、系统路径等。单独访问环境变量可以通过“$_ENV[‘成员变量名‘]”方式来实现;3. GLOBAL变量$GLOBALS,$GLOBALS变量以数组形式记录所有已经定义的全局变量。通过“$GOLBAL["变量名"]”的方法来引用全局变量。我们前面提到了局部变量的作用域,这里我们可以通过“$GOLBAL["变量名"]”来使本不可以在这一作用域得到正确引用的变量能得到正确的引用;
4. $_COOKIE。它是由
HTTP Cookies传递的变量组成的数组。5. $_GET。它是由HTTP
get方法传递的变量组成的数组。6. $_POST。它是由HTTP
post方法传递的变量组成的数组。7. $_FILES。它是由HTTP
post方法传递的已上传文件项目组成的数组。8. $_REQUEST。它是所有用户输入的变量数组,包括$_GET、$_POST、$_COOKIE所包含的输入内容。
9. $_SESSION。它是包含当前脚本中会话变量的数组。
简单说完变量,我们再来讲讲常量,常量分为自定义常量和预定义常量。自定义常量使用define( )函数来定义语法格式如下:define("常量名","常量值");常量一旦定义,就不能再改变或取消定义,而且值只能是标量,数据类型只能是boolean、integer、float或string。和变量不同,常量定义时不需要加“$”;预定义常量也称魔术常量,PHP提供了大量的预定义常量。但是很多常量是由不同的扩展库定义的,只有加载这些扩展库后才能使用。预定义常量使用方法和常量相同,但是它的值会根据情况的不同而不同,经常使用的预定义常量有5个,这些特殊的常量是不区分大小写的(见下表)。
预定义常量名称
说 明
__LINE__
常量所在的文件中的当前行号
__FILE__
常量所在的文件的完整路径和文件名
__FUNCTION__
常量所在的函数名称
__CLASS__
常量所在的类的名称
__METHOD__
常量所在的类的方法名学习了这些基础后我们对php的认识似乎多了一些,其实php还有很多的基础知识还没有学到,php功能之所以那么强大,很大一方面是因为他功能齐全的函数库,针对不同的数据类型都有对应的处理,可以想到的功能都有对应的函数,下图是摘自php手册,可以看到函数参考一行所包含的函数目录:
这里还是简单说一些基本的常用函数:
数组函数:
- 创建一个数组 array() ,参数可以用=>
运算符给出索引。<?php
$fruits = array (
"fruits" => array("a" => "orange", "b" => "banana", "c" => "apple"),
"numbers" => array(1, 2, 3, 4, 5, 6),
"holes" => array("first", 5 => "second", "third")
);
?>
- 给数组新增加一个值,array_push( ),将一个或多个单元压入数组的末尾。
<?php
$stack = array("orange", "banana");
array_push($stack, "apple", "raspberry");
print_r($stack);
?>
- 删除数组中的指定元素,array_splice(),从指定位置开始,删除指定长度的元素。
这个函数一共可以有四个参数,前两个参数必须有,既是需要删除元素的数组和删除开始的位置(从0开始),第二个参数可以是负数,代表从倒数开始,第三个是删除的长度,如果没给出默认移除从开始位置到最后,第四个参数是将删除的元素所替换的值
<?php
$input
= array("red", "green", "blue", "yellow");array_splice($input, 2);
// $input is now array("red", "green")
$input = array("red", "green", "blue", "yellow");
array_splice($input, 1, -1);
// $input is now array("red", "yellow")
$input = array("red", "green", "blue", "yellow");
array_splice($input, 1, count($input), "orange");
// $input is now array("red", "orange")
$input = array("red", "green", "blue", "yellow");
array_splice($input, -1, 1, array("black", "maroon"));
// $input is now array("red", "green",
// "blue", "black", "maroon")
$input = array("red", "green", "blue", "yellow");
array_splice($input, 3, 0, "purple");
// $input is now array("red", "green",
// "blue", "purple", "yellow");
?>
- 数组的排序 sort()和rsort(),按键值排序sort()从小到大,rsort()从大到小,如果是字符串会按照字母顺序,但他们只会返回一个布尔值
- array_unique() 去除数组中的相同元素,array_unique()
先将值作为字符串排序,然后对每个值只保留第一个遇到的键名,接着忽略所有后面的键名。这并不意味着在未排序的array
中同一个值的第一个出现的键名会被保留。- in_array()检测一个值是否在数组中(返回true和false)
- array_search()返回的是键或值,返回的是键值所对应的键名,没有找到就返回false
- array_pop() 删除数组中的最后一个元素
获取当前的函数:
在获取当前时间函数中我们得知道几点,首先我们是通过date( )函数来格式化一个本地时间,它的参数就是我们需要的格式,例如date("Y-m-d G:i:s") 会得到类似于的“2016-06-11
13:26:56"时间,在获取当地时间前我们还得设置时区,因为php默认的时区是格林威治区域(GMT),我们得使用date_default_timezone_set("PRC")将默认时区设置为中华人民共和国。字符串函数:
- 获取字符串的长度,strlen(
)函数,参数就是要计算的字符串,直接返回数字长度,如果为空则返回0- 将字符串全部转化成大写或小写,strtoupper(
)转化大写,strtolower( )转化成小写- 查找字符在字符串中第一次或最后一次出现的位置,stripos(
)首次出现的数字位置,不区分大小写,strpos( )区分大小写;stristr( )最后一次位置,不区分大小写,strstr( )区分大小写简单的了解了一些php的函数后,我们得稍微深入一点点去学习php了,关于php的学习理解web的工作原理是很重要的,在前面也讲到了php的工作原理,重新提及一下这点,php的触发总是发生在访问一个url时,在访问时又是如何将需要的信息发送或者在响应时怎么将需要的信息发送呢?下面我们得再讲讲http协议,从而加深我们对web工作原理的理解并且理解php中cookie和session。
http,超文本传输协议,是一种为分布式,合作式,多媒体信息系统服务,面向应用层协议,是Internet上目前使用最广泛的应用层协议,它基于传输层的TCP协议进行通信,http是通用的,无状态的协议。(应用层:OSI模型【开放式系统互联】,这个模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。无状态:建立完成连接就会关闭连接,重新访问时又得重新连接),它的工作原理就是请求与响应模式,就是我们所熟悉的客户端发送http请求,服务器接收到请求后关闭连接,服务器处理完请求后同客服端建立连接生成http响应回发。
http的消息类型就分为两大类:请求和响应。请求消息分为:请求行,请求头,空行和消息体;响应消息分为:状态行,响应头,空行,消息体。请求行有三个元素:请求方法,URI(统一资源标识),http版本;请求方法最常见的是get和post方法,更多方法见下表:
请求头中包含了一些关于浏览器和服务器的信息,简单列举几个:Contention:
Close是在告知服务器本浏览器不想使用永久连接方(HTTP/1.0使用非永久连接,HTTP/1.1默认使用永久连接);User-agent:指定用户代理服务器的类型,例如:Mozilla/5.0;Accept-Encoding:gzip,compress是指出发送此请求的浏览器支持哪些压缩编码方式;Accept-language:zh-cn指出客户浏览器支持的语言是中文(简体中文)。响应行也有三个元素:http版本号,状态代码以及描述状态的短语(状态代码一共有五大类:分别是1XX,消息,请求已被服务器接收,继续处理;2XX,成功,请求已成功被服务器接收、理解、并接受;3XX,重定向,需要后续操作才能完成这一请求;4XX,请求错误,请求含有词法错误或者无法被执行;5XX,服务器端错误,服务器在处理某个正确请求时发生错误),响应头中包含一些服务器回应信息的一些信息,例如:Date:Thu,
04 Jun 2015 03:02:38 GMT指出服务器创建并发送本响应消息的日期和时间;Content—Length:697654指出所发送对象的字节数;Cache-Control:网页的缓存等等信息。既然http协议是无状态的,如果不采取任何方法,这就意味着在一个网站中浏览信息时如果需要用户信息的验证那么每打开一个网页就得验证一次,因为这又是一次新的请求,这就显得很麻烦了。为避免这种麻烦,我们就可以用到前面提到的预定义变量cookie和session。
cookie是服务器留在计算机小文件,每当相同的计算机通过浏览器请求页面时,它同时会发送cookie。$_COOKIE["key"]变量可以取回cookie的值,其中的键名就是定义cookie是取的名字,我们可以在<html>便签前使用setcookie( )函数设置cookie,语法:setcookie(name/名称,value/值,expire/有效期,path/服务器路径,domain/域名),前面两个参数必填;那cookie是怎么识别用户的呢?讲通俗点,我第一次响应后就将服务器产生的cookie存储在客户机中,客户机第二次请求时就将这个cookie包含在url地址中一起发送出去了,服务器就能接收到cookie并识别用户了。session和cookie类似,相同的session也会产生一个文件来识别用户,不同的是这个文件是存放在服务器的,这样就不是通过url来发送了,意味着就可以写更多的用户信息了。简单阐述一下session的工作过程,不同于cookie最开始是设置cookie,session是通过session_start()来打开会话的(无参数),我们直接使用预定义变量“$_SESSION["key"]=value”来设置一个session,值得注意的是每当我们要使用session时我们都得在<html>前使用session_start(
)打开会话。php响应消息返回时意味着重新生成了web页面,如果页面一些部分是固定的或者一些页面加载需要耗费很多资源与时间时页面的重新加载就显得有点不满意了,于是,我们得学习一门技术——AJAX=异步 JavaScript 和 XML,一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。这项技术是多种技术的结合:1.使用CSS和XHTML来表示;2.使用DOM模型来交互和动态显示;3.使用XMLHttpRequest来和服务器进行异步通信;4.使用javascript将所有技术绑定起来(当每个事件触发时执行);5.还包含XML技术。
AJAX又是如何去工作的呢?又是怎么实现局部的页面刷新的呢?在弄清之前我们先来说说ajax对象有哪些常见的函数和哪些常见的属性,我们通过下面两张表格来了解:
ajax常用函数
AJAX常用属性
既然要实现异步操作,我们得首先初始化ajax对象并发出XMLHttpRequest请求,由于部分浏览器和其他浏览器所支持的ajax对象不同,因此我们在初始化对象时需要相对浏览器可能存在的ajax对象做判断:
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
初始化ajax对象后,我们就得思考在何时指定响应函数了,这就得要用到上表的ajax的onreadystatechange属性,也就是当触发ajax对象状态的改变,这时让函数开始执行(此时只是准备工作,还并没有向指定url发送请求):
xmlhttp.onreadystatechange=function()
{
//下面所述要执行的内容
}
指定完响应函数后,我们得让函数执行出怎样的结果,既然是要获取到反馈回来的信息,那我们就让一切状态或响应完成后才执行我们的想要的结果,这就得时readyState==4并且这是服务器的状态也必须是200,并在这个时候取得服务器返回的文本信息,这是又用到了responseText:
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
现在所有的准备工作都做好了我们就可以想服务器发出请求了,这时我们就得用到open函数打包URL,并用send发送出去,触发上面的onreadyStatechange事件(书写是注意这两个函数不要写在了onreadyStatechange事件里面了):
1.GET方式请求:
xmlhttp.open("GET","demo_get.html?t=" + Math.random(),true);
xmlhttp.send();
2.POST方法:
xmlhttp.open("POST","demo_post.html",true);
xmlhttp.send();
3.如果需要像 HTML 表单那样 POST 数据,请使用 setRequestHeader() 来添加 HTTP 头。然后在 send() 方法中规定您希望发送的数据,则需要使用上表中的setRequestHeader( )函数:
xmlhttp.open("POST","ajax_test.html",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("fname=Henry&lname=Ford");
我们上面也说了,jquery讲这所有技术绑定起来,既是当每一个事件被触发时将上面所有的代码装在里面就可以了,最后在onreadyStatechange函数里就的得到了服务器返回的文本,并显示在了id名为myDiv的div中了。
完整事例代码:
这是通过DOM对象最常规的操作,当然在强大的jquery中也有对ajax开源的代码,使用起来就方便多了:
$("input:first").blur(function(){
$.ajax({
type:"POST",
url: "some.php",
data:"fname=Henry&lname=Ford",
success:function(msg){
$("#myDiv").html(msg);
}
})
);
这样就实现了页面局部刷新的AJAX技术。
前面我们提到了cookie和session,虽然二者都可以存在信息,但所能存储的量还是不够,因此,我们还得使用我们的数据 库,前面也提到了,在安装apache时会同时安装了一个数据库,更幸运的是php对数据库的支持非常好,我们用的mysql数据库也一样适用。
在使用数据库时,我们首先先大概了解一下PHP是如何去操作数据库的:
如上图所示,PHP并不是直接对数据库进行操作的,它通过它自身的一些函数发送一些SQL语句和数据库服务器处理,数据库服务器执行这些SQL指令,并又通过PHP自身的一些函数将结果返回给PHP程序。这足以看出PHP函数在其中的重要性,那我们又需要哪些函数呢?我们通过数据库操作的执行顺序来分分有哪些函数:
1.连接数据库前的准备工作:从PHP5开始,PHP开发者放弃了对MySQL的默认支持,而是放到了扩展函数库中。因此要使用MySQL函数,需要首先开启MySQL函数库-------打开php.ini,找到“;extensions = php_mysql.dll”,将此行面前的分号“;”去掉,保存之后重新启动IIS/APACHE(wamp默认已经开启了);
2.连接数据库:mysql_connect(),这个函数总共有五个参数,我们一般只使用前面三个参数:mysql服务器,用户名,密码;
3.选择执行的数据库,mysql_select_db(),这个函数有两个参数,第一个是要选择的数据库名,第二个是数据库连接;
4.执行sql语句,mysql_query(),这个函数有两个参数,第一个是sql语句,第二个是数据库连接,如果是查询的sql他返回的是一个资源类型的集合,如果是一个操作的sql则返回一个布尔值;
5.返回一行记录,mysql_fetch_array(),这个函数有两个参数,第一个是返回的资源类型的集合,第二个是数组是以什么的方式进行映射,默认是MYSQL_BOTH,它返回的数组既有列名键名,又有数字键名;
6.关闭连接,mysql_close(),它只有一个参数,就是数据库连接。
数据库的基本函数还有很多,比如还有,mysql_num_rows() 返回结果集的行的数目等等,另外值得注意的是,这些函数在将来都会被弃用,在运行这些函数是我们可以使用错误控制运算符 @来使这些即将过期报错隐藏起来。
两个月的学习大概就这些,当然也还有没提到的,比如在AJAX中的返回JSON格式等等,我也相信以后会学习的更多,希望自己能够源路苦行,坚持到底。