php是一种服务器端解释的脚本语言。
什么是PHP
PHP是一种服务器端脚本语言,他是专门为Web而设计的。
第一篇 使用PHP
连接操作符(.)将其编写在一行代码中。
1.3在html中嵌入PHP
服务器端脚本语言:PHP脚本在Web服务器上被解释和执行,这与在用户机器上的Web浏览器中解释并执行。
的JS及其他客户端技术是不同的。
1.3.2
echo 语句:将传递给其自身的字符串打印到浏览器窗口中。
在双引号内,用一个字符串的内容代替一个变量的操作就是插值。
echo “$tirequly tires<br />”;
单引号, echo $tirequly 'tire<br />';
在单引号中,变量名称,或者任何其他文本都会不经修改而发送给浏览器。
1.5.3 变量和文本
在示例脚本中,每一个echo语句中连接在一起的变量和字符串是完全不同的。变量是表示数据的符号
字符串是数据本身。
三种字符串类型: 具有双引号: 其中变量会被替代
单引号:文本值
heredoc语法(<<<),通过制定一个用来结束字符串的结束标记。
echo <<<theEnd
line1
line2
line3
theEnd
1.6 理解标识符
标识符是变量的名称。
他不要求在使用变量之前声明变量。当第一次给一个变量赋值时,你才创建了这个变量。
1.7 检查变量类型
1.7.1 变量类型
特殊的类型:NULL和resource
NULL:没有被赋值、已经被重置或者被赋值为特殊NULL的变量
resource: 特定的内置函数(例如数据库函数)将返回resource类型的变量。他们都代表
外部资源(例如数据库连接),基本上不能直接操作一个resource变量,但是它通常被函数
返回,而且必须作为参数传递给其他函数
1.7.2 类型强度
弱类型语言,或者动态语言。
1.7.3 类型转换
$abc=(float)$bdc;
1.7.4 可变变量
可变变量允许我们动态地改变一个变量的名称。
原理:用一个变量的值作为另一个变量的名称。
$varname='tireqty';
$$varname=5; 等价于 $tireqty=5;
1.8 声明和使用常量
define('TIREPRICE',100);
常量由大写字母组成。
使用时无$符号。
echo TIREPRICE;
了解预定义常量: phpinfo()函数。
1.9 理解变量的作用域
1.内置超级全局变量可以在脚本的任何地方使用和课件
2.变量,一旦被声明,将可以在全局可见;也就是说,他们可以在函数内外使用。
3.在一个脚本中声明的全局变量在整个脚本中是可见的,但不是在函数内部。
$_GET和$_POST数组,这些被称作超级全局变量,可以在任何地方使用和可见
1.10 使用操作符
若类型转换,是字符串转换成数字,如果其中包含‘e’和’E‘字符,它就会被当做是科学
表示法并被转换成浮点数。PHP会在字符串开始处寻找数字,没找到,则为0.
1.10.2 字符串操作符
. 连接符
1.10.3 赋值操作符
4.引用操作符
&可以在关联赋值中使用。
请记住,引用就像一个别名,而不是一个指针。都指向内存相同的地址。
可以通过重置来改变所指向地址: unset($a);
1.10.4 比较操作符
=== 恒等操作符, 操作数相等并且具有相同的数据类型
1.10.5 逻辑操作符
$a x or $b 异或, 不同为true, 同为false.
1.10.6 位操作符
1.10.7 其他操作符
new和->,他们分别用来初始化类的实例和访问类的成员。
错误抑制操作符
@可以在任何表达式前面使用,即任何有值的或者可以计算出值的表达式之前。
$a=@(57/0)
如果没有@,这一行代码将产生一个除0警告,若使用@会被抑制。
如果使用这种方法抑制了一些警告,一旦遇到一个警告,就要写一些错误处理代码。
如果启用了php配置文件中的track_errors特性,错误信息将会被保存在全局变量$php_errormsg中。
3.执行操作符。
执行操作符实际上是一对操作符,是一对反向单引号。(``)
php将试着将反向单引号之间的命令当做服务器端的命令行来执行。表达式的值就是命令的执行结果。
4.数组操作符
数组操作符([])允许访问数据元素。 也可以使用=>操作符。
5.类型操作符
只有一个类型操作符:instanceof:检查一个对象是否是特定类的实例。
1.13 使用可变函数
1.13.1 测试和设置变量类型
使用gettype(),传递一个变量,他将确定变量的类型并且返回一个包含类型名称的字符串。
1.13.2 测试变量状态
isset():若存在,则返回true.
empty():它的值是否为非空和非0.
1.13.3 变量的重解释
可以通过调用一个函数来实现转换变量数据类型的目的。
intval(var,int base) base 为进制
intfloat(var)
strval(var)
1.14 根据条件决策
条件结构和重复结构
1.14.3 else语句
1.15.2 for和foreach循环
for($i=1;$i<=$numname;$i++){
$temp=$name$i;
echo $$temp.'
';
}
1.16 从控制结构或脚本中跳出
switch break
for continue;
结束整个php脚本的执行,可以使用exit语句。
eg:
if($totalqty==0){
echo 'exit
';
exit;
}
1.17 使用可替换的控制结构语法
endif\endswitch\endwhile\endfor\endforeach
eg:
if($toatl>0):
exit;
endif;
1.18 使用declare。
php的另一个控制结构是declare结构,他没有像其他结构一样在日常编程中使用
declare(directive){
//block
}
设置代码块的执行命令--后续代码如何执行的规则。
第二章 数据的存储和检索
2.1 保存数据以便后续使用
保存到文件或保存到数据库
2.2 存储和检索Bob的订单
$_POST['address']
在本章中,我们将所有订单都写入同一个文件中。
2.3 文件处理
写入文件
1.打开文件
2.读取数据
3.关闭文件
2.4打开文件
fopen()函数,参数指定文件模式,即如何使用它
2.4.1 选择文件模式
1.打开文件为了只读、只写或读和写
2.如果要写一个文件,可能希望覆盖或者追加。若存在,也可以终止执行
3.如果希望在一个区分了二进制方式和纯文本方式的系统上写一个文件,还必须指定采用的
方式。
w
2.4.2 使用fopen()打开文件
$DOCUMENT_ROOT=$_SERVER['DOCUMENT_ROOT'];
$fp=fopen("$DOCUMENT_ROOT/../orders/d.txt",'w');
路径 模式
DOCUMENT_ROOT代表文档根目录。为了安全,将它放我在文档树外部
第一个参数:路径
第二个:文件模式
第三个:在include_path中搜索。 true\false
第四个:远程位置打开文件
2.4.3 通过FTP或HTTP打开文件
2.4。4 解决打开文件时可能遇到的问题
权限问题:根据服务器设置的不同,该脚本可能是作为web服务器用户或者脚本所在目录的拥有者
运行的。
2.5 写文件
fwrite()或者fputs()
fputs()是fwrite()的别名函数。
fwrite($fp,$outputstring);
fwrite()函数的替换是:file_put_contents(filename,data,int flag,resource context)
2.5.1 fwrite()参数
fwrite($fp,$outputstring,length);
最大字符数
strlen()函数:获取字符串的长度
2.5.2 文件格式
记录之间用\n分隔
数据域之间用\t分隔
2.6 关闭文件
fclose($fp);
2.7 只读模式打开文件 fopen('../a.txt','rb')
2.7.2 知道何时读完文件 feof()
while(!feof($fp))
{
$order=fgets($fp,999);
echo $order.'
';
}
feof() 唯一参数是文件指针,若文件指针指向文件末尾,将返回true
2.7.3 每次读取一行数据: fgets() \fgetss()\fgetcsv()
$order=fgets($fp,999);
fgetss(fp,length,[allowable_tags])
它可以过滤字符串中包含的PHP和HTML标记,想留下的写在allowable_tags里面
fgetcsv()函数: $order=fgetcsv($fp,100,'\t').
以上代码将从文件中读取一行,并且在右制表符(\t)的地方将文件内容分行,
返回一个数组。
2.7.4 读取整个文件: readfile()\fpassthru()和file()
readfile() 可代替前面写的所有脚本
readfile(pathname,include_path,context);
fpassthru()
$fp=fopen('path','rb');
fpassthru($fp);
file() 结果发送到一个数组。
$filearray=file('path');
一行一个元素保存在数组中。
2.7.5 读取一个字符:fgetc()
从文件中一次读取一个字符。
while(!feof($fp)){
$char=$getc($fp);
if(!feof($fp)) //getc()会返回EOF
echo ($char=='\n' ? '
':$char);
}
2.7.6 读取任意长度:fread()
2.8 使用其他有用的文件函数
文件是否存在 file_exists(pathname)
文件大小 filesize(pathname)
删除文件: unlink(pathname)
n12br() 将\n转化成html的换行符
再文件中定位:rewind()\fseek()\ftell()
对文件指针进行定位,看它在文件中的位置
rewind() 定位到文件头
ftell() 现在的位置
fseek() 将文件指针指向某个位置
2.9文件锁定
flock(fp,operation)
LOCK_SE 读锁定
_EX 写锁定
_UN 释放锁定
_NB 防止在请求加锁时发生阻塞
2.10 更好的方式:数据库管理系统
第3章 使用数组
数组索引数组、关联数组
3.2.1 数组索引数组 初始化
$products=array('titre','oil');
$products=range(1,10); 1-10的数字数组
3.2.2 访问数组的内容
$products[0]
3.2.3 使用循环访问数组
foreach($producets as $current){
echo $current.' ';
}
3.3 使用不同索引的数组:关联数组
$price=array('tire'=>100,'oil'=>10,);
访问: $price['tire'];
循环访问:
foreach($prices as $key =>$value)
{
echo $key.'='.$value.'<br />';
}
while($element=each($prices))
{
echo $element['key'].'='.$element['value'];
}
while(list($product,$price)=each($price)){
echo "$product - $price<br />";
}
each()函数,数组将记录当前元素,如果希望再次使用使用reset($price);重置到
数组开始出。
3.4 数组操作符
3.5 多维数组
3.6 数组排序
sort函数: 默认按升序排列。
asort()函数 和ksort()函数对关联数组排序
asort()根据元素值进行排序。 value
ksort()根据关键字进行排序 key
反向排序: rsort\arsort\krsort\ 降序
3.7 多维数组的排序
用户定义排序
usort() 告诉如何比较
function compare($x,$y){
if($x[1]==$y[1]){
return 0;
}else if($x[1]<$y[1]){
return -1;
}else
return 1;
}
usort($produts,'compare');
3.8 对数组进行重新排序
shuffle(array)将数组各元素随机排序。
array_reverse()给出一个原来数组的反向排序。
$number=range(1,10);
$number=array_reverse($number);
3.9 从文件载入数组
$orders=file(pathname);
$number_of_orders=count($orders);
for($i=0;$i<$number_of_orders;$i++){
$line=explode('\t',orders[$i]);
$line[1]=intval($line[1]);
$line[2]=intval($line[2]);
$line[3]=intval($line[3]);
}
3.10 执行其他数组操作
each()
current()
reset()
end()
next()
pos()
prev()
3.10 对数组的每一个元素应用任何函数 array_walk()
array_walk(array,func,userdata)
函数名 传参入函数
函数可自带数组的关键字和值。
function my_print($value){
echo "$value<br />";
}
array_walk($array,'my_print');
function my_multiply(&$value,$key,$facotr){
}
array_walk($array,my_multiply,3);
3.10.3 统计数组元素的个数:
count($array) 元素个数
sizeof($array) 元素个数
array_count_values($array) 统计每个特定的值在数组中出现的次数,
返回包含频率表的关联数组
3.10.4 将数组转换成标量变量 extract(array,extract_type)
将关联数组转成标量变量,变量名称是key,变量值是value.
第4章 字符串操作与正则表达式
4.2 字符串的格式化
4.2.1 字符串的整理 :trim()\ltrim()\rtrim()
清除多余空格
trim(string,operation):除去开始和结束位置的空格
opertation:要过滤的特殊的字符
ltrim() 左边空格
rtrim()右边空格
4.2.2 格式化字符串以便显示
1.html格式化::n12br():
代替换行符
2.为打印输出而格式化
和echo相同: print()\printf()\sprintf()
printf() 格式化、输出浏览器
sprintf()返回格式化字符串
printf(“%s”,$toal);
想打印“%”,使用%%
printf(“%2\$s”,$toal,$toas); 2/$ 表示用列表中第二个参数替换。
这个方法可以在重复参数中使用
3.改变字符串字母大小写
strtoupper()
strtolower()
4.2.3 格式化字符串以便存储:addslashes()和stripslashes()
PHP提供了两个转义字符串的函数
add 增加
strip 移除
4.3 用字符串函数连接和分隔字符串
4.3.1 使用函数explode()\implode\join()
explode(separator,string,limit)
implode()和join()类似,和explode相反的作用,粘连在一起。
implode('@',array);
4.3.2 使用strtock()函数
从字符串中取出片段。
strtock(input,separator)
separator可是字符,也可是字符串。根据separator的每个字符进行分割
我们仅在第一次调用 strtok() 函数时使用了 string 参数。在首次调用后,该函数仅需要 split 参数,这是因为它清楚自己在当前字符串中所在的位置。如需分割一个新的字符串,请再次调用带 string 参数的 strtok():
4.3.3 使用substr()函数
substr(string,start,length)
4.4 字符串比较
部分匹配和其它情况
4.4.1 字符串排序:strcmp()\strcasecmp()\strnatcmp()
strcmp(str1,str2) 返回0 相等
1 str1>str2
strcasecmp 不区分大小写
strnatcmp 不区分大小写 且自然排序,eg:2>12
4.4.2 使用strlen()函数测试字符串长度
4.5 使用字符串函数匹配和替换子字符串
4.5.1 在字符串中查找字符串:strstr()\strchr()\strrchr()\stristr()
strstr() 查找匹配的字符串或字符
strchr\strstr 完全一样
strstr($feedback,'shop'); 从找到位置到末尾的字符串
无返回false.
stristr 不区分大小写
strrchr 最后出现目标关键字的剩下的所有字符
4.5.2 查找子字符串的位置:strpos()\strrpos()
推荐这个。
strpos(string,needle,offset) 第一次出现位置 offset 偏移量
strrpos 最后出现的位置
失败返回false
要注意false在弱语言中等于0,而0是字符串的一个字符。故使用===
if(strpos(string,'H')===false)
4.5.3 替换子字符串:str_replace()\substr_replace()
str_replace(needle,new_needle,string) 返回替换后的结果
substr_replace(string,replacement,start)
4.6 正则表达式
4.6.2 字符集和类
[a-z]at [aeiou] [a-zA-Z]
任何包含在方括号中的内容都是一个字符类--一个被匹配的字符所属的字符集合。
只匹配一个。
[^a-z] 不属于a-z之间的字符 ^表示否
4.6.3 重复
表示某个字符串不止一次的出现
*代表可重复0或多次
+代表 1或多次
[a-z]+ 最少匹配一次的a到z之间的字符
4.6.4 子表达式
将一个表达式分隔成几个子表达式。圆括号表示
(very )*large
匹配: large、 very large、 very very large
4.6.5 子表达式计数
表达允许重复的次数
(very ){1,3} 重复1-3次
(very ){3} 重复3次
([a-z]at){2,} 至少重复2次
([a-z]at)+ 至少重复一次
4.6.6 定位到字符串的开始或末尾
^ 用于开始
$ 用于末尾,表示子字符串必须出现在字符串末尾
4.6.7分支
可以用竖线表示一个选择
com|edu|net
4.6.8 匹配特殊字符
如果要匹配特殊字符。如,.等, 需要加反斜杠\
正则表达式模式必须包含在单引号的字符串中。
表示双斜杠使用 \\
如果双引号引用的PHP字符串使用反斜杠字符, 需要写 \\\\
$ \\\$
eg: ^([abc]*d){1,3}\.;|$
4.7用正则表达式查找子字符串: ereg()\eregi()
ereg(pattern,search,array match). 把匹配结果放在match中
eregi 不区分大小写
4.8 用正则表达式替换子字符串
ereg_replace(pattern,replacement,search)
4.9 使用正则表达式分隔字符串
split(pattern,search)
!!和正则表达式相比,尽量使用字符串函数效率高。
第五章 代码重现和函数编写
5.1 代码重用的好处
1.成本
2.可靠性
3.一致性
5.2 require()和include()函数
允许重新使用任何类型的代码
require()和include()可以将一个文件载入到php脚本中
类似于#include语句
使用require()和include()引入函数库,非常有用。防止错误引入同样的函数库
2次。
5.2.1 文件扩展名和require()函数
require('resuable.php');
使用require()语句时,必须注意处理文件扩展名和PHP标记的不同方式。
5.2.2 使用require()制作web站点的模版
如果web页面具有一致外观,可以在php中使用require()语句将模版和标准元素加入。
一个常见的约定就是调用那些包含在其它文件something.inc中的部分文件代码,这些文件代码
若不被调用,将会停止执行。
这个文件可以包含任何希望在一个脚本中输入的内容,其中包括php、文本\标记
当需要一个文件时,可以使用require()语句。将被请求的文件内容代替,然后执行脚本。
这就意味着,让载入main。php。
当使用require()语句时,必须注意处理文件扩展名和php标记的不同方式。
PHP并不会查看所需文件的扩展名。这就意味着,只要不想直接调用这个文件,就可以任意
命名该文件。当使用require()语句载入语句时,它会作为php文件的一部分被执行。
通常,如果PHP语句放在一个HTML文件中时,他们是不会被处理的。PHP通常解析扩展名被
定义为.php文件。但是,如果通过require语句载入page.html,文件内的任何PHP命令
会被处理。
require()语句调用时,它会被执行。
文件时.html的,不处理。
文件时.php,才会处理。
但是通过require(),.html也会被处理。
但是一般扩展名是 .inc或 .php。
需要注意,扩展名为.inc或其它一些文件保存在web文档树内种,而且用户可以在直接在如,
用户将以普通文本的形势,
5.3 在php中使用函数
函数是一个给出了调用接口的自包含模块,它可以执行一些任务,还可以返回结果。
5.3.1 调用函数
fopen(string[,resource context])
方括号指明了这个参数是可选的。
5.3.2 调用未定义的函数:出错
5.3.3 理解字母大小写和函数名称
函数调用不区分大小写。 函数命名:都用小写字母
函数名称和变量不一样,变量分大小写,函数不区分。
5.4 理解为什么要定义自己的函数
5.5 了解基本的函数结构
希望在一个函数中退出php并输入HTML脚本:
<?php
function my_function(){
?>
my function was call;
<?php
}
?>
函数的命名
php不支持函数的重载。
!!可变函数:$name();
根据$name的值确定,取出$name中的值,寻找具有那个名称的函数,并且
调用该函数。
5.6使用参数
function create_table($data){
echo '<table border="1">';
reset($data);
$value=current($data);
while($value){
echo $value;
$value=next($data);
}
}
5.7 理解作用域
这块可以翻回来看一下
函数内部和外部声明同一个变量名是合法的,互不影响的。当在函数内部第一次调用的时候,
它会声明,和外部的无关,函数调用结束后,删除。
作用域:
函数外的变量到了函数的内部,无法访问的。如果能够访问的话。还需要传值做什么。传值就是为了让函数接受参数。
超级全局变量哪都能访问。
静态变量会累加。 外部访问不到。
全局变量在函数外声明,想要在内部访问,需要提前声明一下,才能使用。
外部声明variable, 函数内部第一次调用输出时,会创建一个新的变量, 所以输出0
require 在函数内部,就是函数作用域。
外部,就是全局作用句。
5.8 函数的引用传递和值传递
function myfun(&$value){
}
5.9使用return 关键字
5.10 实现递归
第6章 面向对象的PHP
面向对象的开发方法试图在系统中引入对象的分类、关系和属性
6.1.1 类和对象
对象的属性是于对象相关的特性或变量。
对象的操作是对象可以执行的方法。
!对象的操作也就是对象的接口
对象是一个保存数据和操作这些数据的操作方法的唯一、可标识的集合。
数据封装
6.1.2 多态性
指不同类的同一操作可以有不同的行为。
6.1.3 继承
6.2 在php中创建类、属性和操作
6.2.1 类的结构
class classname{
public $attribute;
function operation(){
}
}
6.2.2 构造函数
class classname{
function __constrct($param){
}
}
6.2.3 析构函数
function __destruct(){}
6.3 类的实例化
$a=new classname();
6.4 使用类的属性
$this->attribute
使用__get()__set()
class classnae{
public $attribute;
function __get($name){
return $this->$name;
}
function __set($name,$value)
{
$this->$name=$value;
}
}
我们并不直接访问__get()\__set(),而是使用
$a->attribute=5;
$a->attribute
通过编写get\set方法,可以控制访问的入口,设置边界检查,确认数据是否正确。
或者我们需要从数据库取出数据,只需修改get和set即可。
6.5 使用private和public关键字控制访问
protect修饰,只能类内部访问,但是可被继承,继承后只能内部使用。
而private 无法继承。
默认是public,如声明类时,不写public
6.6 类操作的调用
$a->operation1();
6.7 在PHP中实现继承
class B extends A{
}
6.7.1 通过继承使用private和protected访问修饰符控制可见性
!!!protect可以被继承,但继承后,只能在类内部使用。
6.7.2 重载(java中叫做重写,覆盖父类)
如果想使用父类的最初版本: parent::opertaion();
A:operation();
6.73. 使用final关键字禁止继承和重载
当在一个函数声明前面使用这个关键字时,这个函数将不能在人恶化子类中
被重载。
也可禁止类被继承。
6.74 理解多重继承
PHP支持单一继承
6.7.5 实现接口q
接口的思想是指定一个实现了该接口的类必须实现的一系列函数。
implements
6.8类的设计
web开发中可能使用的类可能包括网页、用户界面组件、购物车、错误处理、商品分类
顾客。
6.9 编写类代码
class page{
public $content;
public $title="TLA";
public $keyword="dsd";
public $button=array(
"Home"=>"home.php",
"Contant"=>"contact.php"
);
function __set($name,$value){
$this->$name=$value;
}
function Display(){
echo '<html>\n<head>\n';
$this->DisplayTitle();
$this->DisplayKeyWords();
$this->DisplayStyles();
echo '</head>\n<body>\n';
$this->DisplayHeader();
$this->DisplayMenu($this->buttons);
echo $this->content;
$this->DsipalyFooter();
echo "</body>\n</html>\n";
}
function DisplayTitle(){
echo '<title>'.$this->title.'</title>';
}
function DisplayKeywords(){
echo '<meta name=\"keywords\" content=\''.$this->keywords.'\'/>';
}
public function DisplayStyles(){
?>
<style>
</style>
<?php
}
public function DisplayMenu($buttons){
$width=100/count($button);
while(list($name,$url)=each($buttons)){
$this->DisplayButton($width,$name,$url,!$this->IsURLCurrentPage
($url));
}
}
}
<?php
require("page.inc");
$homepage=new Page();
$homepage->content="";
$homepage->Display();
?>
6.10 理解PHP面向对象的高级功能
6.10.1 使用Per-Class常量
PHP提供了Per-Class常量
<?php
class Math{
const pi=3.14;
}
echo 'Math::pi='.Math::pi.'\n';
6.10.2 实现静态方法:
PHP允许使用static关键字。
静态方法,不能使用this关键字。
class Math{
static function squared($input){
return $input;
}
}
ehco Math::squared(8);
6.10.3 检查类的类型和类型提示
instanceof关键字允许检查一个对象的类型。
function check_hink(B $someclass){ //传入的必须是B的实例。
}
6.10.4 延迟静态绑定
该特性允许在一个静态继承的上下文中对一个被调用类的引用。
class A{
public static function who(){
echo __CLASS__;
}
public static function test(){
static::who();
}
}
class B extends A{
public static function who(){
echo __CLASS__;
}
}
B::test();
输出: B
6.10.5 克隆对象
PHP提供clone关键字。允许复制一个已有的对象。
$c=clone $b;
__clone()方法中的一个很好特性就是在使用默认行为创建一个副本后能够被调用。
这样,在这个阶段,可以只改变希望改变的内容。
在__clone()方法中添加的最常用功能就是确保作为引用进行处理的类属性能过正确复制。
如果要克隆一个包含有对象引用的类,可能需要获得该对象的第二个副本,而不是该对象的
第二个引用。
6.10.6 使用抽象类
类不能被实例化,类方法也没有实现,只提供类方法的声明,没有实现。
6.10.7 使用__call()重载方法
__call()方法,该方法用来实现方法的重载。
public function __call($method,$p){
if($method=='display'){
if(is_object($p[0])){
$this.displayObject($p[0]);
}else if(is_array($p[0])){
$this->displayArray($p[0]);
}
}
}
$ov=new overload();
$ov->display(array(1,2,3));
$ov->display('cat');
6.10.8 使用__autoload()方法
另一个特殊的函数是__autoload().单独的函数
会自动调用你所需要实例化的类文件。
function __autoload($name){
include_once $name.'.php';
}
7.1 异常处理的概念
手动抛出异常
try{
throw new Exception("A",43);
}catch(Exception $e){
echo "ss".$e->getCode();
}
7.3 用户自定义异常