PHP基础
一、初识PHP
PHP是与HTML混合使用的嵌入式语言。
1、PHP标记
默认标记<?php ?> 短标记<? ?>,需在php.ini中将short_open_tag选项开启 短标记和其他标记不提倡使用
2、关键字不区分大小写,用户自定义的类名和函数名不区分大小写,变量名区分大小写
3、输出
boolean print(参数) 返回布尔值
void echo(参数) 无返回值echo的效率要高一点
二、数据类型
1、比较两个浮点数的通常方法是先移动若干小数位,然后转换为整型数据再进行比较。
2、双引号做分隔符的字符串支持变量名解析,单引号做分隔符的字符串不支持变量名解析。
$name="张三";
"$name"=>张三 || '$name'=>$name || "$name先生"=>空 || "{$name}先生"=>张三先生 || "${name}先生"=>张三先生
3、字符串定义的方式:单引号,双引号和heredoc(<<<heredoc_markheredoc_mark)
4、对象类型必须显式的进行声明。类用关键字class定义,使用关键字new生成这个类的实例,使用->符号类访问类中的属性和方法
class car{public $cololr;function beep(){}}$mycar = new car; $mycar->color='red'; $mycar->beep();
5、PHP是一种弱语言类型,变量的类型会根据赋予的值自行确定,而且往往在变量声明的同时进行变量初值的赋值。
6、数据类型强制转换时,只须将需要的类型名写在变量前的括号内即可。
三、常量和变量
1、定义常量 define("常量名",表达式或值) 常量名建议全大写,但不是必需的
使用常量 直接使用定义的常量名,无须在常量名前加"$"
预定义常量:_FILE_当前PHP程序文件名 _LINE_当前PHP程序所在的行数(在哪指哪)
2、变量不需要显式的声明,在对变量赋初值时就对变量进行了声明。如果变量没有被设置初值,则其初值即为NULL。
3、变量的赋值:传值赋值和引用赋值。如$a=&$b; 即b原来指向了一个存储位置,引用赋值后,a也指向了这个存储位置,这时,
a或b的销毁都不会对对方造成任何影响,但是如果其中一个的值改变了,则另一个也会作出相同的改变。
4、访问预定义变量之使用超全局变量,总共9个超全局变量
5、局部变量:在函数内定义的变量 只能在函数内使用
全局变量:在函数外定义的变量 默认只能在函数外使用
要想在函数内使用全局变量,需要在函数内将变量用global声明,或者使用超全局变量数组&GLOBALS["变量名"]
在PHP中,只有函数能提供局部作用域。
超全局变量$GLOBALS包含了全部的变量
静态变量的特点:只有在第一次被调用时进行初始化,函数结束后不销毁,并且下次使用时,该变量还保留原来的值。
静态变量只能在函数内定义和使用。
可变变量:将变量的名字也作为一个变量来使用。$a=b;$b=c;$$a=$b=c;
外部变量:使用GET方式能传递的数据最大为256字节,使用POST最大为2MB
四、流程控制(仅写与java等其他语言的不同)
1、交互格式(冒号语法) 不建议使用,经典的比较直观
2、foreach():该语法是专门为数组设计的
第一种格式foreach(target_array as $value) statement
第二种格式foreach(target_array as $key=>$value) statement
3、break 数字:要跳出的结构的层数
contiue 数字:要跳出的结构的层数
4、exit语句可以结束当前整个脚本的执行,通常用于错误检查。
exit; exit("错误原因");
die()是exit的别名 $conn=mysql_connect("localhost","root","") or die("无法连接到MySQL服务器");
五、数组
1、关联数组与数字索引数组唯一的区别在于索引的类型。
2、数字索引数组
初始化:直接为数组元素赋值array()函数
如果数组不存在,那么为数组元素赋值的同时即可创建该数组
如果数组元素是按顺序排列的数字,则在对数组进行初始化时,可以使用range()函数
range()有3个参数,第一个参数指定初始值,第二个参数指定终止值,第三个参数可选,用于指定步长
3、关联数组
初始化:直接为数组元素赋值array()函数
4、与数组相关的运算符
+ 联合 $a+$b 将$附件到$a之后,但是任何索引值冲突的元素将不会被添加
== 等于 $a==$b 如果$a和$b包含相同元素,返回true(索引值和元素必须都相同) 除了顺序,其他必须完全一样
!= <> 不等于
=== 恒等 如果$a和$b包含相同顺序的相同元素,返回true(索引值和元素必须都相同) 必须完全一模一样
!== 不恒等
5、数组的排序
boolean sort() 按数字和字母顺序排列 排列后会赋予新的索引值,原有索引值被删除
void asort()按升序对数组进行排序 排列后保留原来的索引关系
integer ksort() 按索引值升序进行排列
usort(数组,方法名)按用户自定义方法进行排序
array_multisort() 一次对多个数组进行排序
natsort() 按自然顺序排序,排序后保留原有的索引关系
natcasesort() 自然排序,不区分大小写
6、数组的反向排序
rsort() 对数组元素按降序排列
arsort()
krsort()
7、对数组进行重新排序
boolean shuffle() 对数组进行随机排列
array array_reverse() 将数组中的元素逆置
array array_flip() 将数组中的索引与其元素值兑换
8、数组的遍历
current() 获取数组中当前指针所指的元素值
next()将数组的指针向后移动一位,返回移动后指针所指向的元素的元素值
prev()将数组的指针向前移动一位,返回移动后指针所指向的元素的元素值
reset()指针设置回数组的起始位置
end() 将指针移动到数组的最后一个元素处
each()返回数组中当前指针所指向的“索引/元素值”对,并将数组指针向后移动一位
返回一个包含4个元素的数组,且该数组的索引分别为0,key,1,value
key() 返回数组当前指针所指向的索引值
array_walk()以相同的方式对数组中的每一个元素进行处理
array_reduce() 将自定义函数依次应用于数组的每个元素
9、其他的数组操作函数
list()从一个数组中一次提取多个值,并同时赋值给多个变量
count()/sizeof()计算数组中元素的个数
六、PHP中的字符串
1、访问字符串中的字符
字符串的三种定义方式:单引号、双引号和Heredoc方式
可以将字符串视为数组来处理。$test="hello"; $test{0}="h";推荐使用大括号,以免与数组混淆
2、字符串的格式化
字符串的格式化处理通常包括:去除字符串中多余的空格、大小写转换、加入和删除反斜杠和HTML格式化四部分
去除空格和其他符号
string trim(待处理的字符串,过滤字符串)
如果不指定过滤字符串,则默认去掉空格、Tab字符、换行符、回车符、字符串结束符和垂直制表符
可以使用“..”指定需要去除的一个范围,例如“a..f” 表示去掉a、b、c、d、e和f
只对字符串首尾字符进行过滤,即使指定了过滤字符串,字符串中间部分也不会参与过滤
string lrtim(待处理的字符串,过滤字符串)
去除字符串左边的空格和其他特殊字符
其他同trim()
string rtrim(待处理的字符串,过滤字符串),别名函数chop()
去除字符串右边的空格和其他特殊字符
其他同trim()
对字符串大小写的转换
strtolower(待处理的字符串)将指定字符串中的所有字符转换为小写
strtoupper(待处理的字符串)将指定字符串中的所有字符转换为大写
ucfirst(待处理的字符串)检查指定的字符串,如果指定字符串的第一个字符是字母,则将其转换为大写
ucword(待处理的字符串)将指定字符串中的每个单词的首字母转换为大写
加入和删除反斜杠
在将任何字符串保存到数据库中之前,应该使用addslashes()函数添加反斜杠;
在显示用户数据之前,应该调用stripslashes()函数去除反斜杠
addslashes(待处理的字符串)添加反斜杠
stripslashes(待处理的字符串)删除反斜杠
HTML格式化
nl2br(待处理的字符串)可以将字符串中的换行符转换成HTML中的标签"<br>",从而在浏览器中实现换行
htmlspecialchars(待处理的字符串,是否转换双引号和单引号,字符集)
可以使一些特殊的字符被当成普通的文本输出,而不会再进行HTML解析
第二个参数:默认只对双引号进行转换,ENT_COMPAT只转换双引号 ENT_QUOTES都转换
ENT_NOQUOTES 不进行转换
第三个参数:指定了转换时所使用的字符集,默认为ISO-8859-1
hemlentities(待处理的字符串,是否转换双引号和单引号,字符集)
功能同上,但可以转义更多的特殊字符
heml_entity_decode(待处理的字符串,是否转换双引号和单引号,字符集)
可以对显示字符串进行反向转换,转换后的字符串能够按HTML标签进行解析
strip_tags(待处理的字符串,允许保留的HTML标签)
去除所有的HTML和PHP标记
3、字符串的连接和分割
explode(分隔符,字符串,被分割的字符串片断的数量)按指定的分隔符将一个字符串分割
如果分隔符是字符串,函数会根据字符串中的每个字符来进行分割,而不会根据整个分割字符串来分割
implode(连接符,需要连接成字符串的数组)将一些字符串通过指定的连接符连接成一个字符串
join(连接符,需要连接成字符串的数组)功能同implode()
substr(字符串,开始位置,提取长度)从某个字符串中提取一部分子字符串
开始位置为负,将得到一个从原字符串尾部开始,长度为该负数绝对值的子字符串
提取长度为负,子字符串取到倒数第“length”个字符前
这个不难理解,-就表示从后面开始
strtok(字符串,分隔符)从指定字符串中取出一个字符串片段
如果分隔符是字符串,函数会根据字符串中的第一个字符来进行分割,而不会根据整个字符串来分割
在调用该函数对字符串进行连续分割时,只有第一个分割时需要指定参数str,第一个分割后,系统会自动
记录字符串及第一个分割后的指针位置,继续调用该函数,则会继续从该字符串指针的当前位置进行分割
。如果希望重置指针到字符串起始位置,只需将字符串重新作为参数传递给该函数即可。
split(分隔符,字符串,返回字符串个数)将一个字符串按指定的分隔符分解为多个子字符串
4、字符串的比较
可以使用==直接对字符串进行比较
strcmp(字符串1,字符串2)按字典顺序,排在后面的大。如果相等,返回0,如果str1大于str2,返回正数,否则负数
区分大小写
strcasecmp(字符串1,字符串2)同上,不区分大小写
strnatcmp(字符串1,字符串2)按自然顺序进行字符串比较,等于返回0,大于返回正数,小于返回负数,区分大小写
strnatcasecmp(字符串1,字符串2)按自然顺序进行比较,不区分大小写
5、字符串的查找和替换
strstr(被查找的字符串,要查找的关键字)在一个字符串中查找匹配的字符串或字符,如果查找到,则返回从str字符中该key开始到字符串结尾的子字符串,如果没有查到,则返回false,如果不止一个,则返回从第一个匹配到结 尾的子字符串
strisstr()功能同上,区别,该函数不区分大小写
strchr(被查找的字符串,要查找的关键字)在一个字符串中查找要匹配的子字符串或字符,该函数从字符串末端开始查找,如果找到一个,则返回从该key开始到字符串结尾的子字符串,如果多于一个,则返回从尾端开始的第一个匹配,如果没有匹配,则返回false
strpos(要查找的字符串,要查找的子字符串或字符,从原始字符串的第offset个字符开始查找)
如果找到一个,则返回位置,从0开始,如果不止一个,返回第一个,如果没有,返回flase
offset不能为负,否则无法开始查找
strrpos(要超找的字符串,要查找的关键字,从原始字符串的第offset个字符开始查找)
从字符串末端开始查找,如果不止一个,返回倒数第一个匹配
strripos(要查找的字符串,要查找的关键字,从原始字符串的第offset个字符开始查找)
功能同strrpos(),区别不区分大小写
stripos(要查找的字符串,要查找的关键字,从原始字符串的第offset个字符开始查找)
功能同strpos()区别不区分大小写
str_replace(被替换的字符串或数组,替换后的字符串或数组,源字符串或数组,被替换的次数)
searchreplacesubject
把subject中的search替换为replace
如果search是数组,replace是字符串,在replace会替换search数组中的所有元素
如果search和replace都是数组,在replace中的元素会替换search中对应的元素
如果search数组中的元素个数多余replace,则多余的search数组中的元素会被空字符串替换
substr_replace(被操作的原始字符串,用于替换的字符串,要被替换的原始字符串的起始位置,被替换的原始字符串 中字符的个数)用于在指定位置中查找和替换字符串中特定的子字符串
起始位置:如果为正,从头开始计算,如果为负,从尾开始计算
长度:如果为正,表示从start开始的连续length个字符被替换,
如果为负,表示从start开始到倒数第length个字符被替换
str_ireplace()功能同substr_replace(),但是该函数不区分大小写
6、其他常用字符串函数
strlen(字符串)用于计算指定字符串的长度
md5(字符串,标志)将一个字符串进行MD5算法加密
第二个参数如果为true,将返回一个16位的二进制数;如果为false,则返回一个32位的十六进制字符串,默认为false
七、PHP中的面向对象编程技术
1、对象的特性
封装:对象是封装的最基本单位,是以对象名封装的数据结构以及可施加在这些数据上的操作的集合。
就像一个盒子,我们不需要知道盒子里面有什么东西,只需知道它有哪些用途即可。
继承:PHP不支持多重继承,继承本质上就是代码重用,继承是指子类可以自动地拥有父类的全部特性,而无须从零开始构建。
多态:能够使用类的上下文来重新定义或改变类的行为。多态性使得对象能够根据所得到的参数决定具体执行哪个行为或方法,而对外却可以提供统一的接口。
2、类的结构
class 类名
{
//定义属性,使用关键字var
var $var1;
var $var2;
...
//定义方法,使用关键字function
function method1(...){...}
function method2(...){...}
...
} 不可以将一个类分开定义到多个PHP标记对中,更不可以分开定义到多个文件中。
3、类的实例化
使用关键字new来创建类的实例
$实例名=new 类名;
4、使用类的属性
若要使用类中定义的属性或方法,只需使用运算符"->"即可。如果在类定义时需要访问类内部自身定义的属性或方法,则需要使用$this指针。
一般来说,从类的外部直接访问类的属性存在一定的风险,为此PHP对于访问类属性提供了一些保护措施。__set(),__get(),当视图引用一个
类中不存在的属性时,就会调用这些方法进行相应的处理。
5、类的访问控制 控制类的属性和方 法
如果对类的属性指定了访问控制类型,则关键字var需省略
public 在类的内部和外部都可以访问。该选项是默认选项。
使用“::”运算符可以在没有创建任何类的实例的情况下访问类中的函数或者变量
格式如下:类名::函数类名::变量
private 只能在类的内部进行访问
protected 只能在该类和其子类中使用
6、构造函数
构造函数在一个类被实例化时自动调用。PHP不支持多个构造函数。
构造函数的语法格式如下:function __construct(参数1,参数2,...){}
7、析构函数
析构函数会在类对象被销毁前调用,通常用来设定对象被销毁前需要完成的一些操作。销毁对象最简单的方法是直接对其赋值NULL
析构函数语法:function __destruct(){}
脚本在执行结束时,PHP会自动销毁内存中的所有对象。因此,对于一般的类对象不需要显式地定义析构函数。
但是如果类对象在实例化时创建了不太容易销毁的数据,如果数据存储在数据库中而不是内存中,就应当定义一个析构函数,在类
对象销毁时使这些数据能够正常被销毁。
8、静态属性和方法
静态属性和方法需要使用关键字“self::”来引用,其他介绍前文已有
9、类运算符instanceof
可以判断一个对象是否是一个类的实例
10、继承已有的类
继承使用关键字extend
11、类的重载
重载是指在子类中再次定义与父类相同的属性和方法。类的重载使得在子类中可以给某个属性赋予一个与其父类中不相同的值,
也可以给某个方法指定一个与其父类中不相同的功能。
12、访问父类中的属性和方法
一个子类可以通过继承和重载得到父类中的属性和方法,并能够重写所继承的属性和方法。但有些时候,在子类中会需要直接
调用父类中的方法。在PHP中可以使用关键字“parent::”来实现对父类中属性和方法的访问。
13、使用final关键字禁止继承和重载
当在一个函数定义前面使用关键字“final”时,表示该函数将不能被任何子类重载。
如果不希望让一个类继承,只需在定义类时为其添加“final”关键字
如果一个类中的属性或方法被指定为“private”,则该属性或方法将不能被继承
如果一个类中的属性或方法被指定为“protected”,则该属性或方法可以被子类继承,但不能在类外部直接访问
如果一个类中的属性或方法被指定为“public”,则该属性或方法不仅可以被子类继承,而且在任何地方都可以被访问
14、抽象类和抽象方法
抽象类是不能实例化的类,只能作为其他类的父类使用。所以继承抽象类的子类都必须实现所有的抽象方法。
在PHP中使用关键字“abstract”定义一个抽象类和方法。
15、接口
接口是一种特殊的抽象类,这种抽象类中通常只包含抽象方法,不定义属性。属性的定义和抽象方法的实现交给实现接口的类来完成。
定义接口使用关键字“interface” 实现接口使用关键字“implements”
16、实现多个接口
PHP中的类不允许多重继承,但允许实现多个接口
17、对象的赋值
目标对象 = clone 原对象; 复制后两个对象完全一样,但互不干扰
在PHP中还可以使用__clone()方法调整对象赋值的行为。默认情况下,该函数将建立一个与原对象拥有相同属性和方法的对象,如果希望
在赋值后改变原对象中的某些内容,只需在方法中重写原对象中的相应的属性和方法即可。该方法可以使用$this指针
18、自动加载类
PHP专门提供了__autoload()函数,来自动加载所需的类。
在需要加载时,该函数会自动被调用,同时类名会以参数的形式传递给__autoload()函数
19、处理不存在方法调用
当调用类中一个不存在的方法将会产生致命错误,PHP提供了__call()方法可以对这种类型的错误进行处理。
20、对象的序列化
为了方便变量的传输和存储,通常会在传输和存储变量前将其转化成为字符串的字节流形式,在需要使用这些变量时,再将其还原为
原来的变量,这个过程成为序列化和反序列化。
为了方便传输和存储类对象,也可以对齐进行序列化和反序列化处理。PHP中使用函数serialize()来序列化一个对象,其参数为对象名,
返回值为序列化后得到的字符串。反序列化使用unserialize()函数,其参数为字符串,返回原来的对象。
对象在序列化的时候,会自动调用一个名为__sleep()方法,完成一些睡前的事情,该方法不接收任何参数,但会返回一个数组,数组中
指定需要序列化的属性,未被包含的属性将在序列化时被忽略。如果没有指定__sleep()方法,PHP将对所有的属性进行序列化。
对象在反序列化时,会自动调用一个名为__wakeup()的方法,做一些对象醒来就要做的动作。
八、PHP访问MySQL数据库
1、数据库操作的基本步骤
链接数据库服务器mysql_connect(MySQL服务器主机名,用户名,密码);
选择一个数据库mysql_select_db(数据库名,资源标识);
对数据库进行操作mysql_query(数据库语句,资源标识);
对数据记录进行处理 mysql_fetch_row(资源标识);
2、连接和关闭数据库
$connect = mysql_connect("localhost","root","123456");
在结束对数据库的操作之后,mysql_connect()会自动断开连接,也可以显式地使用mysql_close()断开连接。
mysql_pconnect()建立的是一种持久连接,一旦建立连接,连接将被放到连接池中,即使数据库操作结束也
不会自动关闭连接,而是留待以后使用。即使使用mysql_close()函数也无法关闭由函数mysql_pconnect()建立
的连接。
完成数据库操作后,应当关闭连接。但关闭不是必需的,因为PHP具有垃圾回收功能,会自动对不用的连接进行
处理。当然可以显式地关闭连接,关闭连接需要资源标识号,如果没有指定,则默认关闭最近打开的连接。
mysql_close(资源标识号);
3、选择数据库
选择数据库mysql_select_db(数据库名,资源标识号);
4、查询数据库
执行查询操作的函数有mysql_query()和mysql_db_query()。其中函数mysql_query()直接执行一个SQL语句,
而函数mysql_db_query()可以在指定数据库上执行SQL语句。
mysql_query(SQL语句,资源标识号):
如果SQL语句是select、show、expllain、describe等查询语句,则执行成功时将返回一个资源标识号,失败时返回false
如果SQL语句是其他语句(insert、update、delete等),成功时返回true,失败时返回false。
mysql_db_query(数据库名,SQL语句,资源标识号)功能同上,此句相当于mysql|_slect_db()和mysql_query()的组合。
5、获取和显示数据
mysql_fetch_row(资源标识号)以数组的形式返回查询结果集中的当前记录行,并在调用后将结果集中的当前行指针下移一行
mysql_fetch_array(资源标识号)以数组的形式返回查询结果集中的当前记录行,并在调用后将结果集中的当前行下移一行
NOTE:mysql_fetch_row()返回的结果数组只能使用数字下标进行访问,mysql_fetch_array()返回结果数组可以使用数组下标,
也可以使用字段名进行访问,不过mysql_fetch_row()可以得到最快的执行速度
mysql_fetch_assoc(资源标识号)以关联数组的形式返回查询结果集中的当前记录行,并在调用后将结果集中的当前行指针下移一行
mysql_fetch_object(资源标识号)以对象的形式返回查询结果集中的当前记录行,并在嗲用后将结果集中的当前行指针下移一行
mysql_result(资源标识号,行号,字段)字段可以使用数字索引,也可以使用字段名。数字索引下标从0开始
该函数返回指定记录行的指定字段的值
mysql_num_rows(资源标识号)返回符合查询条件的记录行数
mysql_field_seek(资源标识号,定位的行号)定位到要查询的行
mysql_fetch_length(资源标识号)以数字索引数组的形式返回,且每个数组元素值对应一个字段的字节数
6、数据的增删改及相关操作
使用mysql_query()完成数据的增删改操作
int mysql_affected_rows(资源标识号)返回受insert、update和delete影响的记录数
mysql_num_rows()仅对select语句有效