PHP想入门? 看这个就够了

PHP想入门? 看这个就够了_第1张图片
PHP 进阶整理

本文将介绍PHP的一些较重要的内容。
包括:
面向对象编程、正则表达式、
程序错误处理、XML、
AJAX、图像处理、MySQL数据库、
开发模式。

一、面向对象的PHP编程


和其他面向对象语言差不多,有区别的地方会指出,其他简要介绍一下。

注:
构造函数:function __construct();
析构函数:function __destruct();
有默认的set和get方法
指向父类:parent::
指向子类:self::

//类
name = $name;
      }
      public function get_name(){
              echo "My name is ".$this->name."
"; } } //继承 class Worker extends Person { private $salary; //构造函数 function __construct(){ $salary = 5000; } //析构函数 function __destruct(){ echo "析构函数被调用"; } public function set_salary($salary){ $this->salary = $salary; } public function get_salary(){ return $this->salary; } } $boy = new Person; $boy->set_name("Harry Pottor"); $boy->get_name(); $girl = new Person; $girl->set_name("Emma"); $girl->get_name(); $a_work = new worker; $a_work->set_name('Paul'); $a_work->set_salary(3500); $name = $a_work->get_name(); $salary = $a_work->get_salary(); echo $name."的月薪为".$salary; ?>
"; } ?>

相关函数:

__construct():构造函数
__destruct():析构函数
__get():用到不存在属性时,系统默认调用
__set():当设置不存在属性时,系统默认调用
__call():访问一个不存在的方法时,默认调用
__toString():将一个对象转换成字符串
__clone():克隆一个对象时使用。
克隆:PHP默认通过引用传递对象。使用$obj2 = $obj1两对象是关联的,如果不希望产生关联,就使用clone,克隆一个新的对象。

二、正则表达式:Regular expression


定义:是负责对字符串做解析对比,从而分析出字符串的构成,以便进一步对字符串做相关的处理。

注:正则表达式允许用户通过使用某种特殊字符构建匹配模式,然后把匹配模式与文件中的数据、程序输入或者Web页面的表单输入等目标对象进行比较,根据这些输入中是否包含匹配模式,来执行相应的程序。

1.正则表达式的语法:

元字符:
^ :匹配指定字符串开头的字符串
$ :匹配指定字符串结尾的字符串
. :匹配除\n之外的任何单个字符,代替任何字符
[] :匹配指定范围内的单个字符,代替指定字符
| :在多项之间选择一个进行匹配
\ :转义字符
() :标记子表达式的开始和结束位置
* :匹配其左边的子表达式0次或多次
+ :匹配其左边的子表达式1次或多次
? :匹配其左边的子表达式0次或1次

限定符:
{n}:表示匹配该限定符左边字符n次
{n,}:表示匹配该限定符左边至少n次
{n,m}:表示匹配该限定符左边至少n次,最多m次

转义字符:
\n :一个换行符。等价于\x0a和\cJ
\r :一个回车符。等价于\x0d和\cM
\s :任何空白字符,包括空格、制表符、换页符等。等价于[\f\n\r\t\v]
\S :任何非空白字符。等价于[^\f\n\r\t\v]
\t :一个制表符。等价于\x09和\cI
\v :一个垂直制表符。等价于\x0b和\cK
\f :一个换页符。等价于\x0c和\cL
\cx :由x指明的控制字符。

字符类:
[[:alpha:]] :匹配任何字母
[[:digit:]] :匹配任何数字
[[:alnum:]] :匹配任何字母和数字
[[:space:]] :匹配任何空白字符
[[:upper:]] :匹配任何大写字母
[[:lower:]] :匹配任何小写字母
[[:punct:]] :匹配任何标点符号
[[:xdigit:]] :匹配任何16进制数字,相当于[0-9a-fA-F]
[[:blank:]] :匹配空格和Tab,等价于[\t]
[[:cntrl:]] :匹配所有ASCII 0到31之间的控制符
[[:graph:]] :匹配所有的可打印字符,等价于[^ \t\n\r\f\v]
[[:print:]] :匹配所有的可打印字符和空格,等价于[^\t\n\r\f\v]

反义:
\W :匹配任意不是字母,数字,下划线或汉子的字符
\S :匹配任意不是空白符的字符
\D :匹配任意非数字的字符
\B :匹配不是单词开头或结束的位置

//模式:举例

^once  //匹配给定模式开头的字符串

PHP$   //匹配给定模式结尾的字符串 

^Python$  //精确定位:指定字符串

b.s   //这个单词可以是bes、bis、bos....

b[eiou]s //这个单词只匹配 bes、bis、bos、bus

b(a|e|i|o|oo)s  //这个单词匹配bas、bes、bis、bos、boos

pe* //匹配perl、peel、pet、port...

co+  //匹配come、code、cool、co...

a{3}  //匹配aaa、cacaaad、aacoaaao...

a{3,}  //匹配aaa、aaab、caaaaa...

a{1,3}b  //匹配ab、aab、aaab...

ab*  //和ab{0,}同义,a、ab、abb...

ab+  //和ab{1,}同义,ab、abb...

ab?  //和ab{0,1}同义,a、ab

a?b+$  //匹配ab、abb...

a(bc)*  //匹配a、abc、abcbc...

[ab]  //与a|b同义,匹配a、b

[a-d]  //与a|b|c|d及[abcd]同义,匹配a、b、c、d。

^[a-zA-Z_]$  //匹配所有的只有字母和下划线的字符串。如果不加^和$,凡是含有字母和下划线的字符都会被匹配。

^[a-zA-Z0-9_]{1,}$  //匹配所有包含一个以上的字母、数字或下划线的字符串。

^[0-9]{1,}$  //匹配所有正数

^\-{0,1}[0-9]{1,}$  //匹配所有的整数

^\-{0,1}[0-9]{0,}\.{0,1}[0-9]{0,}$  //匹配所有小数

PHP有两大类函数支持正则表达式,
一类是POSIX扩展函数(PHP5.2之后弃用),
另一类是Perl兼容的正则表达式函数(PHP4.0后支持)。

2.POSIX扩展正则表达式函数(PHP5后弃用):

ereg() :字符串的正则匹配函数
ereg_replace() :区分大小写的正则表达式替换
eregi() :不区分大小写的正则表达式匹配
eregi_replace() :不区分大小写的正则表达式替换
split() :用正则表达式将字符串分割到数组中
spliti() :用正则表达式不区分字母大小写将字符串分割到数组中
sql_regcase() :产生用于不区分大小的正则表达式

//正则表达式匹配函数
int ereg(string $pattern, string $string [, array ®s]);  //区分大小写
int eregi(string $pattern, string $string [, array ®s]);  //不区分大小写


"; }else{ echo "日期字符串$date 不符合'YYYY-MM-DD'格式

"; } } ?> //替换匹配字符串的函数 string ereg_replace(string $pattern, string $replacement, string $string); //区分大小写 string eregi_replace(string $pattern, string $replacement, string $string); //不区分大小写 替换前字符串为:
"; echo $str; echo "
"; echo "
"; $pattern = "car"; //匹配字符串 $replacement = "Apple"; //替换后字符串 $str_rpc = eregi_replace($pattern,$replacement,$str); echo "替换后字符串为:
"; echo $str_rpc; ?> //根据正则表达式分割字符串函数 array split(string $pattern, string $string [, int $limit]); "; echo "
"; $sep_arr = split("~",$str); echo "字符串截取后:
"; //分割字符串变量$str echo "
";

print_r($str_arr);
?>

//生成正则表达式的函数
string sql_regcase(string $string);   //不区分大小正则表达式

原字符串:
$str"; //定义字符串变量 echo "
"; echo "
"; $reg_str = sql_regcase($str); echo "生成的正则表达式为:
"; //生成正则表达式 echo $reg_str; ?>

3.PERL兼容正则表达式函数(PHP4后支持,重点):

PERL兼容正则表达式使用修正符,
所谓修正符,是指正则表达式最后的补充说明。
另外,
PERL兼容正则表达式中所有的模式前后都需要加/

修正符
i :匹配时忽略大小写
m :除了匹配^$整个字符串开头和结尾,还匹配其中的换行符(\n)的之后和之前
s :使原点字符(.)匹配任意一个字符同时也匹配换行符
x :模式中的空白字符除了被转义的或在字符类中的以外完全被忽略
e :preg_replace()在替换字符串中对逆向引用作正常的替换,将其作为PHP代码求值,并用其结果来替换所搜索的字符串

A :模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配
D :模式中的行结束($)仅匹配目标字符串的结尾,否则包含换行符
S :为加速匹配而对其进行分析,分析一个模式仅对没有单一固定其实字符的nonanchored模式有用
U :使“?”的默认匹配成为贪婪状态
X :一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身
u :模式字符串被当成UTF-8

preg_grep() :返回与模式匹配的数组单元的正则表达式函数
preg_match() :进行正则表达式匹配的函数
preg_match_all() :进行全局正则表达式匹配的函数
preg_replace() :执行正则表达式的搜索和替换的函数
preg_split() :用正则表达式分割字符串的函数

//返回与模式匹配的数组单元的正则表达式函数
array preg_grep(string $pattern, array $input [, int $flag]);

原数组:";
echo "
";
print_r($test_preg);
echo "
"; $preg_arr = preg_grep("/^[A-Z].*[0-9]$/",$test_preg); //正则表达式 echo "
"; echo "将原数组中以任意大写字母开头的、中间任意个字符、最后以数字结尾的字符串找出:"; echo "
";
print_r($preg_arr);  //输出匹配的元素
echo "
"; ?> //进行正则表达式匹配的函数 int preg_match(string $pattern , string $subject [, arrayy $matches [, int $flag]]); "; echo "
"; }else{ echo "在字符串'$str'中找到对'php'的匹配"; echo "
"; echo "
"; } } ?> //进行全局正则表达式匹配的函数 int preg_match_all (string $pattern, string $subject, array $matches [,int $flag]); 粗体字符可点击的连接"; preg_match_all("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html , $matches); for ($i=0;$i //执行正则表达式的搜索和替换的函数 mixed preg_replace(mixed $pattern,mixed $replacement,mixed $subject [, int $limit]); "; echo $string; echo "

"; $patterns[0] = "/quick/"; $patterns[1] = "/brown/"; $patterns[2] = "/fox/"; $replacements[2] = "bear"; $replacements[1] = "black"; $replacements[0] = "slow"; $str1 = preg_replace($patterns,$replacements,$string); //替换字符串 echo "使用函数ksort()之前字符串替换为:
"; echo $str1; echo "

"; ksort($patterns); //排序 ksort($replacements); //排序 $str2 = preg_replace($patterns,$replacements,$string); echo "使用函数ksort()之后字符串替换为:
"; echo $str2; echo "

"; ?> //用正则表达式分割字符串的函数 array preg_split(string $pattern,string $subject [,int $limit [, int $flag]]); //参数$limit=-1,$flag参数如下: PREG_SPLIT_NO_EMPTY:只返回非空的部分 PREG_SPLIT_DELIM_CAPTURE:界定符模式中的括号表达式会被捕捉返回 PREG_SPLIT_OFFSET_CAPTURE:对每个出现的匹配结果同时返回其附属的字符串偏移量。注意,这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为它在$subject中的偏移量 原字符串:
"; echo $str; echo "

"; $chars = preg_split('/ /',$str,-1,PREG_SPLIT_OFFSET_CAPTURE); //分割字符串 echo "调用函数preg_split()后:"; echo "
";
print_r($chars);
?>

4.几例常见的正则表达式分析:

  • 实例1:检查IP地址的正则表达式:
    直接上代码:
$ip 是正确的IP地址";
    echo "

"; }else { echo "$ip 不是正确的IP地址"; echo "

"; } } function validateIp($ip){ //验证ip的函数 $iparray = explode(".",$ip); for ($i=0; $i < count($iparray); $i++) { if ($iparray[$i]>255) { return (0); } return preg_match("/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/",$ip); } } ?>
  • 实例2:检查中文字符的正则表达式:
    直接上代码
存在中文";
    echo "
"; echo "
"; }else { echo "不存在中文"; echo "
"; echo "
"; } } ?>
  • 实例3:检查Email地址的正则表达式
合法的Email格式";
    echo "
"; echo "
"; }else { echo "不合法的Email格式"; echo "
"; echo "
"; } } ?>
  • 实例4:检查URL地址的正则表达式
    直接上代码:
合法的URL格式";
    echo "
"; echo "
"; }else { echo "不合法的URL格式"; echo "
"; echo "
"; } } ?>

三、PHP程序中的错误处理


PHP程序异常通常有3种情况:
1.语法错误:代码书写、语法错误

2.运行时错误:代码本身没有错,在运行时操作时出错
3.逻辑错误:最难改,程序能正常运行,但最终结果不是所期望的值

1.内置异常处理类——Exception

PHP5增加了内置的异常处理类——Exception,内置函数
getMessage():返回对错误的描述信息
getCode():返回错误代码,以数字形式出现
getFile():返回发送错误的文件名
getLine():返回发送错误的代码行号
getTrace():返回backtrace()错误
getTraceAsString():返回已格式化成字符串的、由函数getTrace()所产生的信息
__toString():产生异常的字符串信息,可以重载

现在让我们来看一下PHP中内置异常处理类的完整代码:


2.捕获异常的方法:

和JAVA很像,
try...catch...:异常处理的格式
throw:抛出异常

例如:

';
  if (is_dir('./test')) {
    echo '监测到../ch16是一个目录';
    echo '
'; echo '可能继续做其他一些操作'; echo '
'; echo '....'; echo '
'; }else { throw new Exception($error, 12345); //抛出异常 } echo '上面throw异常的话,这行代码不会执行,转而执行catch块
'; }catch(exception $e){ //获取异常 echo '捕获异常:'.$e->getMessage()."
错误代码:".$e->getCode().'
'; echo '
'; } echo '继续执行'; ?>

3.获取异常信息的函数使用:

直接上代码例子

getMessage();
  echo '

'; echo '错误所在文件:'.$e->getFile(); echo '

'; echo '错误所在行号:'.$e->getLine(); echo '
=================================
'; } echo '程序执行完毕'; ?>

4.自定义的错误处理:myHandler()

PHP中默认错误处理器被自定义的错误处理函数myHandler()替代

";
  echo "程序$file执行过程中,在第$line行,产生一个错误。";
  echo "
"; echo "错误代码为:$code,错误的原因是:$msg"; } echo $uvar; //输出未定义变量,错误处理 ?>

四、PHP 与 XML


XML:扩展标记语言(eXtensible Markup Language),由W3C制定
它不仅仅是一种标记语言,还是一种存储数据的格式。
用XML可以描述标记建立数据,
现在由于JSON的优越性(解析完能转换成非常好的数据结构,使用起来会很方便),数据解析上更多的使用JSON,
但作为初学者,还是要学习一下XML的内容。
这里参考一篇技术博客,这里关于XML和JSON解析讲解的很好。

1.XML与HTML的不同:

注意:XML和HTML有些不同,
XML用来描述数据,并关注数据是什么;
而HTML用来显示数据,它关注的是如何使数据显示出来。
XML并不是作为HTML的替代品而出现,它们有各自的领域和价值。

2.XML实例:

下面描述一个图书馆信息的XML文档



  
    Learning PHP7
    David
    White Water Press
    29.90
  
  
    Learning XML
    MrLiu
    White Water Press
    58.90
  
  
    Using PERL
    Lucy
    White Water Press
    17.90
  
  
    Windous Networks
    Paul
    White Water Press
    32.99
  
  
    Fly Leaf
    Jenny
    White Water Press
    19.50
  

  • 1.XML声明:

version属性:描述XML的版本号
standalone属性:描述该XML文件是否和一个独立的声明文件(DTD)配套使用,YES表示没有DTD,NO表示有DTD配套
encoding属性:XML分析器支持的编码标准,常用的是UTF-8和GB2312(简体中文码)

  • 2.XML元素:<标记>数据内容
<国籍>中国
Learning XML
  • 3.标记和属性:<标记名 属性名="属性取值">

  • 4.处理指令:

cocoon是来自Apache软件基金会的XML处理框架,该实例告诉cocoon,XML文档包含一个SQL语句。

  • 5.实体:

实体是文档用来替换一些特殊标记符号的字符串。
XML和HTML中常见的实体如下:
<:代表小于符号<,less than
>:代表大于符号>,greater than
":代表一个双引号
&apos:代表一个单引号,或撇号
&:代表一个“与”符号&
注:实体以“&”开头,以英文“;”结束。

  • 6.文件类型定义(DTD):

一个完全意义上的XML文件不仅应该是形式良好的,而且还该使用自定义标记的XML文件。定义来表示数据的标记,最常用的方法是实用文档定义类型(Document Type Definition)DTD。
简而言之,DTD规定了一个语法分析器为了解释一个“有效的”XML文件所需要知道的所有规则和细节。

实例:DTD用来指定XML文档的基本结构,在XML文件的序言部分加入一个DTD描述,加入位置在XML处理指示之后



文件体

DTD中使用元素类型声明(Element Type Definition,ETD)来声明所有有效的文件元素。ETD结构如下:

所以刚才的图书馆实例可以修改为:









]>

  
    Learning PHP7
    David
    White Water Press
    29.90
  
  
    Learning XML
    MrLiu
    White Water Press
    58.90
  
  
    Using PERL
    Lucy
    White Water Press
    17.90
  
  
    Windous Networks
    Paul
    White Water Press
    32.99
  
  
    Fly Leaf
    Jenny
    White Water Press
    19.50
  

使用DTD中也可以定义属性,格式如下:

实例:



这段示例XML定义了元素,同时使用关键字ATTLIST声明元素的属性。属性列表中的名称city告诉解析器这些属性是为元素定义的。名称province是属性的名称,关键字CDATA和#REQUIRED告诉XML解析器province属性包含文本并且是必须的。如果是可选的,使用CDATA #IMPLIED。

3.PHP对XML的支持:

PHP5后支持符合W3C标准的DOM和SimpleXML扩展,默认情况下同时支持SAX(原生支持)、DOM、SimpleXML。

XML解析器分为两种类型:
一种是基于树型的解析器:将XML文档转换成树型结构。提供一个API来访问所产生数的每个元素,其通用的标准为DOM,即文档对象模式。重点在结构,树型结构。
二种是基于事件的解析器:将XML文档视为一系列的事件。当一个而特殊事件发生时,默认调用开发者提供的函数处理。重点在数据,从头到尾。

  • PHP函数处理XML文档:
//XML解析器的建立
resource xml_parser_create([string $encoding]);
//XML解析器的释放
bool xml_parser_free(resource $parser);

//处理XML元素的函数
bool xml_set_element_handler(resource $parser,callback $start_elem_handler,callback $end_elem_handler);

//处理XML字符数据的函数
bool xml_set_character_data_handler(resource $parser,callback $handler);

//解析一个XML文档
int xml_parse (resource $parser,string $data [, bool $is_final]);

Expat函数XML文档实例:

//ExpatXML.php
-- 图书信息 --

"; break; case "TITLE": echo "书名:"; break; case "AUTHOR": echo "作者:"; break; case "PUBLISHER": echo "出版社:"; break; case "PRICE": echo "价格:"; break; } } function stop($parser,$elem_name){ //在一个元素结束时调用的函数 echo "
"; } function char($parser,$data){ //当找到一个字符数据时调用该函数 echo $data; } xml_set_element_handler($parser,"start","stop"); //指定元素处理器 xml_set_character_data_handler($parser,"char"); //指定字符数据处理器 $fp=fopen("XMLTest.xml","r"); //打开XML文件 while($data=fread($fp,1024)){ //循环读入XML文件中的内容 xml_parse($parser,$data,feof($fp)) or die(sprintf("XML错误:%s at line %d", xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser))); } xml_parser_free($parser); //释放XML分析器资源 ?>
  • 使用SimpleXML处理XML

SimpleXML,名副其实,使用起来十分简单,最适合简单的、类似记录的数据。
SimpleXML函数:

//载入XML文件的函数
object simplexml_load_file(string $filename [, string $class_name [,int $options]]);



//载入XML字符串的函数
object simplexml_load_strig(string $data [, string $class_name[, int $options]]);

";
$xml_str .= "";
$xml_str .= "最近在学什么";
$xml_str .= "小强";
$xml_str .= "大强";
$xml_str .= "";
$xml_str .= "我最近在学PHP,你呢?";
$xml_str .= "";
$xml_str .= "";

$xml = simplexml_load_string($xml_str); //加载XML字符串
var_dump($xml);
?>

SimpleXML实例:

getName() . "====
"; //获取当前元素的名称 foreach ($xml->children() as $child) { echo "--- ".$child->getName()."---
"; foreach ($child->children() as $ch) { echo $ch->getName().":".$ch."
"; } echo "
"; } ?>
  • 使用PHP的DOM库处理XML文档

DOM是Document Object Model的缩写。它是在浏览器中使用的、用JavaScript操作的W3C DOM规范。分析成DOM的树型结构。

下面介绍如何通过DOM在PHP中处理XML文档:
步骤如下:
1> 首先需要创建一个DOM的实例,即DOMDocument

$dom = new DOMDocument;

2>载入XML到该实例中,有两种方法:一是从一个字符串载入,使用函数loadXML(),二是从文件载入,使用load()。

//使用字符串载入
$dom->loadXML('books');

//从文件载入
$dom->load('XMLTest.xml');

3>使用DOM对象的documentElement属性可以访问XML文档的根元素

load('XMLTest.xml');  //2.载入XML到该实例中
$root = $dom->DOMDocumentElement;   //3.获取XML文档的根元素
?>

4>使用DOM对象的saveXML输出XML字符串,而使用方法save()可以将XML保存为一个XML文件

";   //开始下定义XML字符串
$xml_str .="";
$xml_str .="";
$xml_str .="Harry Potter";
$xml_str .="J.K.Rowling";
$xml_str .="Warner Bros.";
$xml_str .="39.0";
$xml_str .="";
$xml_str .="";

$dom = new DOMDocument;
$dom->LoadXML($xml_str);  //载入定义的XML字符串

echo $dom->saveXML();     //将XML输出到一个字符串
$dom->save("test.xml");
?>

5>使用DOM的getElementsByTagName()方法可以返回一个元素的字符数据,该函数接受一个元素名称作为参数。

load('XMLTest.xml');    //载入指定的XML文档

$books = $doc->getElementsByTagName("book");    //返回book元素的数据
foreach($books as $book){                       //遍历book元素
  $authors = $book->getElementsByTagName("author");
  $author = $authors->item(0)->nodeValue;

  $publishers = $book->getElementsByTagName("publisher");
  $publisher = $publishers->item(0)->nodeValue;

  $titles = $book->getElementsByTagName("title");
  $title = $titles->item(0)->nodeValue;

  $prices = $book->getElementsByTagName("price");
  $price = $prices->item(0)->nodeValue;

  echo "$title - $author - $publisher - $price";
  echo "
"; echo "
"; } ?>

五、PHP 与 AJAX


AJAX是当今Web应用中的一种相当流行的技术,
它最大的优点是给用户最佳的浏览体验。
无论是使用Java、ruby还是PHP,都可以实现AJAX应用

注:AJAX并不完全依赖于某种服务器脚本程序,它是在浏览器端实现的技术

1.什么是AJAX?

AJAX,全称:“Asynchronous JavaScript and XML”
翻译一下,是异步JavaScript和XML
是一种创建交互式网页应用的网页开发技术。
其中包括:使用XHTML和CSS标准实现Web页面,使用DOM实现动态显示和交互,使用XML进行数据交换与处理,最后使用JavaScript绑定和处理所有数据。

AJAX将一些服务器负担的工作下放至客户端,利用客户端的某些能力来处理数据,从而减轻了服务器和带宽的负担。

AJAX最大的优点是页面无序刷新就可以更新页面内容和数据,减少用户实际等待的时间,给了用户最佳的体验效果。

2.AJAX的工作原理:

在AJAX之前,Web站点强制用户进入提交、等待、页面刷新显示数据的流程。其中有大量的网络请求,服务器和网络带宽有很大的负担。

然而,AJAX可以在用户单击按钮时,使用JavaScript和DHTML立即更新Web页面,并向服务器发出异步请求,以执行更新或查询数据库。当请求返回时,就可以使用JavaScript和CSS响应更新Web页面,而不是刷新整个页面。最重要的时,这种速度非常快,Web站点看起来是即使响应的。

原理:关于AJAX工作原理,可以用一句话概括:通过XMLHttpRequest对象来向服务器发一部请求,从服务器获得数据,然后用JavaScript来操作DOM从而完成页面更新。

AJAX工作原理

缺陷:然而AJAX并不是完美的,它也有缺陷。AJAX破坏了浏览器的“后退”机制。即后退无法返回原先的页面,这是一个相当大的缺陷,虽然后来有使用一个隐藏的IFRAME来重现页面上的变更,但是成本是非常大的。

3.PHP与AJAX:

  • 创建XMLHttpRequest对象(JavaScript对象):

不同的浏览器使用不同的方法创建XMLHttpRequest对象,
例如,IE使用ActiveXObject,所以最好使用如下代码,改进版:

var xmlHttp = null;
if(window.xmlHttpRequest){
        xmlHttp=new xmlHttpRequest();
}else if(window.ActiveXObject){
        xmlHttp=new ActiveXObject("Microsoft.xmlHTTP");
}

完整的XMLHttpRequest对象的JavaScript程序:

//AJAXTest.js
function GetXmlHttpRequest(){
  var xmlHttp=null;
  try{
    xmlHttp = new XMLHttpRequest();   //对于Firefox等浏览器
  }
  catch(e){
    try{
      xmlHttp = new ActiveXObject("Msxm12.XMLHTTP");  //对于IE浏览器
    }
    catch(e)
    {
      try{
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch(e){
        xmlHttp =false;
      }
    }
  }
  return xmlHttp;
}
  • 发送异步请求:
    先了解一下XMLHttpRequest对象的一些方法:

open(method,url[ ,async]):使用method参数所指定的方式(POST或GET)打开一个url指定的链接。async为true表示异步,false为同步。
setRequestHeader(label,value):在请求报头增加一个键值对
send(content):JavaScript将请求和数据向服务器发送出去
getAllResponseHeaders():获取服务器所有的HTTP响应报头,并作为一个字符串返回
getResponseHeader(label):获取一个有参数label指定的HTTP响应报头
abort():用来终止当前的请求
再了解一下XMLHttpRequest对象的属性和含义:
onreadystatechange:每次请求状态发生改变时,会调动由该属性保存的事件处理时间
readyState:对象状态值,有5种选择:0表示为初始化,1表示正在加载(loading),2表示加载完毕(loaded),3表示正在接受响应,4表示响应接受完毕(complete)
responseTest:从服务器返回的数据,以字符串形式给出
responseXML:从服务器返回DOM兼容的文档数据对象,即XML数据对象
status:从服务器返回数字代码,比如404(未找到)或200(一切正常)
statusText:与状态相关的文本信息
发送异步请求的JavaScript程序:

function sendRequest(){
  //获取页面表单的文本框name的值
  var user_name = document.getElementById("name").value;

  if ((user_name == null)||(user_name == "")) {
    return;
  }

  xmlHttp = GetXmlHttpRequest();
  if(xmlHttp == null){
    alert("浏览器不支持XmlHttpRequest!");
    return;
  }

  var url = "getUserName.php";  //构建请求的URL地址
  url = url + "?name=" + user_name;

  xmlHttp.open("GET",url,true); //使用GET方法打开一个到url的连接,为发出请求做准备
  //设置一个回调函数,当服务器完成请求后调用
  xmlHttp.onreadystatechange = updatePage;
  xmlHttp.send(null);   //发送请求
}

回调函数:

function updatePage(){
  if (xmlHttp.readyState == 4) {
    var response = xmlHttp.responseText;
    document.getElementById("userInfo").value = response
  }
}

完整实例:

//AJAXTest.html


  
ajax应用实例




  

请选择一个省(自治区):

//AJAXTest.php "合肥", "fj"=>"福州", "gd"=>"广州", "js"=>"南京", "sh"=>"上海", "ln"=>"沈阳", "bj"=>"北京", "hb"=>"石家庄", "hn"=>"郑州", "hlj"=>"哈尔滨", "xj"=>"乌鲁木齐", "xz"=>"拉萨", "nmg"=>"呼和浩特" ); if (empty($_GET['prov'])) { echo '您没有选择省(自治区)'; }else{ $prov = $_GET['prov']; $city = $city_arr[$prov]; echo '所选省(自治区)省会(首府)为:'.$city; } ?>

注意:在这个实例中,我遇到一些问题,用ajax始终无法响应,我猜测可能是html和php文件关联上有问题,存在bug,我没调出来。回过头我再调。

  • 一个已经实现AJAX的PHP类——xajax

xajax是一个开源的PHP类库,它能综合HTML、CSS、JavaScript、PHP,轻而易举就开发出强大的、基于AJAX的Web应用。

下载xajax:官网:http://www.xajaxproject.org/

如何在PHP程序中使用xajax:
1>包含xajax库:require_once("xajax.inc.php");
2>创建xajax对象:$xajax = new xajax();
3>注册需要通过xajax调用的名称:$xajax->registerFunction("myFunction");注册函数名为:myFunction
4>编写注册的PHP函数,并且在函数中使用xajaxResponse对象创建向浏览器端返回的XML指令
5>在PHP程序输出任何信息之前,调用xajax用于接管请求:$xajax->processRequests();
6>在页面的标签之间,使用xajax生成实现AJAX应用所必须的JavaScript代码:$xajax->printJavascript();
7>在程序中,从Javascript时间或者函数调用前面注册的函数,例如:

实例:

debugOn();      //打开ajax调试功能

//注册一个xajax调用的php函数名(与JavaScript中的函数名xajax_showOutput相对应)
$xajax->registerFunction("showOutput");

//编写上面已经注册的php函数,在此函数中用xajaxResponse对象来返回XML指令集
function showOutput(){
  $testResponse = new xajaxResponse();
  $testResponse->addAlert("Hello");

  $testResponse2 = new xajaxResponse();
  $testResponse2->loadXML($testResponse->getXML());
  $testResponse2->addReplace("this","is","a","replacement");
  $testResponseOutput = htmlspecialchars($testResponse2->getXML());

  $objResponse = new xajaxResponse();

  //使用xajaxResponse对象的addAssign方法添加XML指令
  //该指令将id为submittedDiv的元素的innerHTML属性更新为$testResponseOutput
  $objResponse->addAssign("submittedDiv","innerHTML",$testResponseOutput);
  return $objResponse;
}

$xajax->processRequest();   //在脚本传送出任何东西前,xajax都要处理所有请求
?>



  
  xajaxTest
  printJavascript("xajax/");
  ?>



  
  

单击这里显示响应XML

这里将被响应的XML指令所替换

六、PHP 图像处理


PHP除了开发Web应用,还可以生成图片或对图片进行加工处理
目前主流图片处理库:Grafika
GitHub地址:https://github.com/kosinix/grafika/
是基于Imagick和GD,可以用于改变图片大小,剪裁,比较,添加水印等等功能。还有感知哈希,高级图像过滤,绘制贝塞尔曲线等功能,非常强大。
关于Grafika:可以参考这篇博客,写的非常完整详细。

本章主要讲述较底层的GD扩展库的方法和使用:

  • GD扩展库主要函数:

imagecreatefromgif():用来从指定的GIF文件取出图像
imagegif():创建一个GIF图像
imagecreatefrompng():从指定PNG文件取出图像
imagepng():创建一个PNG图像
imagecreate():新建一个基于调色板的图像
imagecreateturecolor():返回一个黑色图像的标识符
imagecolorallocate():创建一个由RGB颜色指定的图像
imagefill():用指定的颜色填充图像
imageline():用指定颜色画出一条线段
imagestring():在图像上显示一个字符串
imagettftext():用TrueType字体向图像写入文本
imageSX/imageSY():分别用来去的图像宽度和高度
imagettfbbox():用来去的使用TrueType字体的文本范围
imagealphablending():用来设定图像的混色模式
imagecopyresized():用来复制部分图像并调整大小
imagecopyresampled():重采赋值部分图像并调整大小
getimagesize():获取图像属性

  • 步骤:

1>建立画布
2>在画布上绘制形状或书写文本
3>输出最终的图片
4>清空绘图资源

  • 图像的建立:
//1.生成图像:



//2.设定图像颜色:



//3.在图像上绘制直线:



//4.在图像上输出文字:



//5.在图像中显示中文字符:

  • 图片的处理:
//1.打开已存在的图片:



//2.获取图片的相关属性:
$x pixels";
echo "
"; echo "
"; echo "图片tower.jpg的高为:$y pixels"; Imagejpeg($img); Imagedestroy($img); ?> //3.对图片加水印效果: 0){ $uploadfile = "./".time()."_".$_FILES['userfile']['name']; if (copy($_FILES['userfile']['tmp_name'],$uploadfile)) { makeImageWaterMark($uploadfile,2,"Photo by Macc",16,"$43042A"); echo ""; } else{ echo "文件上传错误!
"; } } ?> GDTest.php
选择上传图片:
//4.生成已有图片的缩略图: //5.使用imagecopyresampled函数做缩略图:
  • 实例:生成带有底纹的数字验证码图片

七、PHP 与 MySQL

Web程序中的各类数据需要靠数据库存储,只有在数据库配合的基础上,PHP才能发挥其最大功效。

MySQL本身并不是数据库,他只是用来创建、维护、管理数据库的计算机软件。

1.MySQL数据库的基本操作

//windous 登录MySQL命令
mysql -u user_name -p password -h host
//退出MySQL
quit
exit

//创建数据库
create database database_name;

//删除数据库
drop database database_name;

//表的建立
create table Users(
UserId int unsignd not null,
UserName varchar(50) not null,
Gender char(6) not null defaultale',
RegTime date not null;
);
// varchar是变长字符串,在1-255之间
// char指定长度,不足空格补

//建立索引:INDEX
create table books(
id int not null,
name varchar(40) not null,
price = decimal(3,2),
index idx(id)
);

//特殊索引,主键
create table users(
id int not null primary key,
name varchar(30),
create_time date
);

//查看某个数据库中所有表的命令
show tables

//查看某个表的结构
use database
describe table_name

//插入数据
insert into users(id,name,created_time) values (1,'MrLiuQ','2017-07-22 10:18:00');
insert into users values(1,'MrLiuQ','2017-07-22 10:18:00');//省略字段名
insert into users set id=2,name='David',create_name='2017-07-22 10:18:00';

//查询数据
SELECT name,created_time AS ct FROM users;

//条件查询
SELECT *FROM users WHERE name='MrLiuQ';
SELECT *FROM users WHERE created_time>'2017-07-22 10:18:00';
SELECT *FROM users WHERE name='MrLiuQ'->AND created_time>'2017-07-22 10:18:00';
SELECT *FROM users WHERE name='MrLiuQ'->OR created_time>'2017-07-22 10:18:00';

//更新数据
UPDATE users SET name'Lily Cameron' WHERE id=3;//成功后,表users中id为3的用户名被修改为Lily Cameron

//删除数据
DELETE FROM users WHERE name='Lily Cameron';

//对查询结果做排序
SELECT *FROM users WHERE created_time >'2017-07-22 10:18:00'->ORDER BY id DESC;//ASC表示升序,DESC表示降序。

//对查询结果做分组
SELECT city FROM users GROUP BY city;

//对查询结果做限定
SELECT name,city FROM users ORDER BY name LIMIT 4;//返回前4条信息

2.MySQL的数据类型

INT:整数值。UNSIGNED INT指定无符号整数值
DECIMAL:指定数字值的精度和范围
REAL:浮点数值
CHAR:定长字符类型
VARCHAR:变长字符串,在1~255之间
TEXT:文本类型
DATE:日期值
TIME:时间值
DATETIME:MySQL支持,存放日期和日期类型

3.MySQL函数

COUNT():统计表中记录个数或这列中值的个数
MAX():返回某列中的最大值
MIN():返回某列中的最小值
SUM():指定列的值求和
AVG():计算指定列的平均值
LENGTH():字符串的长度
SUBSTRING():截取子字符串
YEAR():返回指定日期的年份
UNIX_TIMESTAMP():返回一个UNIX时间戳
DATE_FORMAT():将一个日期格式化
NOW():返回MySQL服务器系统的当前日期和时间

//计算表中总共有多少条记录
SELECT COUNT(*) FROM users;
//计算特定值的个数
SELECT COUNT(*) FROM users WHERE name LIKE 'J%';

//计算列最大值
SELECT MAX(salary) AS max_salary FROM emp_salary;

//计算列最小值
SELECT MIN(salary) AS max_salary FROM emp_salary;

//求和
SELECT SUM(salary) AS total_salary FROM emp_salary;

//求平均
SELECT AVG(salary) AS avg_salary FROM emp_salary;

//字符串长度
SELECT LENGTH('string in MySQL');

//截取指定长度字符串
SUBSTRING(string,pos,len);

//获取一个UNIX时间戳
SELECT UNIX_TIMESTAMP() AS timestamp;

//格式化输出日期
SELECT DATE_FORMAT AS DATE-> FROM users WHERE id=3;

4.用PHP操作MySQL数据库

步骤:
=> 建立数据库的链接
=> 选择要使用的数据库
=> 创建SQL语句
=> 执行SQL语句
=> 获取SQL执行结果
=> 处理数据结果集
=> 关闭与数据库的链接

//连接数据库
mysql_connect(string $server,string $user_name,string $password,[bool $new_link,int $client_type]);
mysql_pconnect(...)  //长久链接
$conn = mysql_connect('locolhost','root','user_pass');

//关闭数据库
bool mysql_close([resource $link]);

//执行SQL语句
mysql_query(string $sql);

//处理查询结果集的函数
mysql_affected_rows();      //取前一次MySQL操作记录行数。
mysql_fetch_row($result);  //从查询结果集中返回一行数据。$result是执行mysql_query()之后返回的资源标识符
mysql_fetch_array($result,$type);  //从结果集中返回一行作为关联数组
mysql_fetch_assoc($result);        //该函数只将结果集作为关联数组返回

//获取字段信息
object mysql_fetch_field($result [, int field_offset]);

//选择一个数据库
mysql_select_db($database);
//取得结果集的行目数
mysql_num_rows($result);
//返回最近一次MySQL操作产生的错误文本信息
mysql_error();


//PHP程序
ERROR:".mysql_error()."


产生问题的SQL
".$sql); //获取查询结果 if($result){ echo 'SQL语句:'.$sql.'
已经成功执行!'; $num = mysql_num_rows($result); //调用mysql_num_row()获取SELECT语句查询 echo '
该SQL语句查询到'.$num.'行数据'; } if($num = mysql_num_rows($result)) //判断SELECT语句查找到的行数 { $row = mysql_fetch_array($result); //mysql_fetch_array()将结果集中的一行作为数组返回 echo '
';   //格式化输出
    while($row = mysql_fetch_array($result,MYSQL_ASSOC))
    {
      print_r($row);    //输出每行数据
    }
}

mysql_close($conn);
?>

八、PHP 与 MVC开发设计模式


1.什么是MVC模型?

MVC是Model_View_Control的缩写,简单的讲Model是程序的数据模型,View是程序的视图界面,Control是程序的流程控制处理部分。

大部分的操作由Control完成,主要有两个动作:
1.根据用户界面(view)的操作完成对程序数据(model)的更新
2.将程序数据(model)的改变及时反映到用户界面(view)上

优点:程序结构更加清晰,代码稳定性更强,有利于提高开发效率,有利于控制开发速度。

2.MVC模型的核心组成:

1.模型(Model——M):既然是数据模型,那么它就携带着数据,通常还会将业务规则的实现放进模型,这意味着模型不仅仅是数据的容器,还是数据的监控者
2.视图(View——V):Web而言,视图就是用户看到的HTML页面,从程序角度来说,视图负责生成用户界面,通常根据数据模型中的数据转化成HTML输出给用户
3.控制器(Controller——C):负责协调整个应用程序的运转,对于WEB而言,就是接受浏览器的请求,并决定调用哪个模型构件去处理浏览器端发出的请求,然后确定用哪个视图来显示模型处理返回的数据。

3.PHP开发中的模板技术:

在PHP开发中,模板不可或缺。本节将首先介绍模板的基本概念和其在PHP程序中的用法,然后一个优秀的模板引擎——Smarty。

  • 什么是模板?
    模板是一组插入了HTML的PHP脚本,或者说是插入了PHP脚本的HTML文件
  • 在PHP程序中使用模板:Demo
//temp.html

  
    {pagetitle}
  
  
    {greetings}
  



//temp.php

  • Smarty模板引擎:
    PHP中有很多模板引擎可供选择,Smarty是一款易于使用且功能强大的PHP模板引擎
    Demo:
//Smarty.tpl
{* 这里是Smarty模板的注释*}


  {$page_title}



大家好,我是{$name}模板引擎,欢迎大家在PHP程序中使用{$name}。


{*模板文件结束*}


//Smarty.php
template_dir = "./templates";  //设置模板目录
$smarty->compile_dir = "./templates_c"; //设置编译目录

$smarty->left_delimiter = "{";    //设定左右边界符为{},Smarty推荐使用<{}>
$smarty->right_delimiter = "}";

$smarty->assign("name","Smarty");            //进行模板变量替换
$smarty->assign("page_title","Smarty的使用"); //进行模板变量替换

$smarty->display("Smarty.tpl");     //编译并显示位于./templates下的Smarty.tpl模板
?>

4.其他常见的基于MVC的PHP框架简介:

  • Laravel:在国外非常流行,国内用的少,适用于大项目。官网:http://laravel.com
  • thinkphp:适用于小项目,国产,在中国用的比较多。官网:http://thinkphp.cn
  • CodeIgniter:适用于中小型项目。一个小巧、但功能强大的、由PHP编写的、基于MVC的Web应用开发框架。同时也是经过Apache/BSD-style开源许可授权的免费框架。官网:http://codeigniter.org.cn
  • CakePHP:命令行代码生成工具让开发者可以快速生成应用程序框架。官网:http://www.cakephp.org
  • Zend Framework: PHP官方的框架,由Zend公司负责开发和维护。官网:http://framework.zend.com
  • FleaPHP:一款国产Web开发框架,官网:http://www.fleaphp.org

尾篇:总结了15天,终于写完了,存在很多不足,需要去完善
各位大神如果发现那里写的不对,可以私信我。
我会细心修改,
谢谢!

你可能感兴趣的:(PHP想入门? 看这个就够了)