1、 虚拟主机的配置方式有几种?
可以在一台物理服务器上运行/维护多个站点,用户通过不同的IP或域名来进行访问站点
虚拟主机的配置一共有两种方式来进行配置:
基于ip地址的配置(多个网卡来实现)
基于主机名的虚拟主机来进行配置(多个域名来映射到一个IP上)
2、PHP脚本的生命周期?
3、PHP变量的直接传值和引用传值
直接传值:拷贝传值 $a = $b
引用传值:快捷方式 &$a = $b
拓展:
写实复制:在值传递或者是引用传递的时候,当系统中两个变量的值相同的时候,系统为了节省内存空间,不会再开辟一个新的内存来保存两份相同的地址,直到其中一个变量发生改变的时候,这时系统就会开辟一个新的内存来保存此变量,就称之为写实复制
4、php变量的定义
以字母下划线数字组成,但不能以数字进行开头,区分大小写
5、print_r()、var_dump() 和echo 的区别
Echo: 可以一次输出多个值,多个值之间用逗号分隔echo是语言结构(language construct),而并不是真正的函数;
Print_r: 可以把字符串和数字简单地打印出来,而数组则以括起来的键和值得列表形式显示
Var_dump:可以使用任何变量,包括字符串,数组,数字,对象,还指明变量的类型及长度。此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构
6、删除变量 unset();
7、常量
一旦定义将不能再被修改,通常大写用来区分变量
定义:Define(‘PI’,’3.14’) 访问define(‘PI’)
定义:Const PI = 3.14 访问constent(‘PI’)
Defined() 查看某个常量是否存在
8、系统的预定义变量
a) $_POST
b) $_GET
c) $_REQUEST
d) $_SERVER
e) $_SESSION
f) $_COOKIE
g) $GLOBALS // 专门用来存储全局中所用的变量
h) $_FILES[‘filename’] // <input type=”file” name=’filename’ />/
9、系统常量
a) PHP_OS 查看服务器的运行环境
b) PHP_VERSION 查看php的版本信息
c) PHP_INT_SIZE 查看php中基本的存储单位1bety=8bits 255中状态
d) PHP_INT_MAX 查看php中最大的整型数
e) __FIFE__ 当前文件的绝对路径(包含文件名)
f) __LINE__ 获取当前的行号
g) __DIR__ 当前文件的绝对路径(不包含文件名)
h) __FUNCTION__获取函数名
10、PHP的数据类型
1)标量数据类型:
整型: 4个字节存储的值,当超过最大的整型后会自动转换为浮点型
浮点型:float:单精度 精度为7位左右 值为10^32
Double:双精度 精度为15位左右 值为10^308
可以使用E à 1.8E10科学计数法
布尔型
字符串型
2)复合数据类型:数组、对象
定界符 $str=<<<DELIMIT
// 内容
DELIMIT(需顶格书写)
3)特殊数据类型:Null resource
11、单引号和双引号的区别
在php中单引号不能解析变量,双引号可以(变量后若有字符用{}进行分隔即可)
在JS中单双引号都不能解析变量
单引号: 只能转译单引号和反斜杠
双引号: 除了单引号其他都能转译
12、运算符
算数、比较、赋值、链接、错误抑制、自操作、三目、
逻辑 && || ! (通常将与&&的false和将或||的true放在前边,效率高)
位运算
&:按位与,同为1则为1
| :按位或,有1则为1
~:按位取反,0变为1,1变为0
^:按位抑或,相同则为0,不同则为1
<<: 左移
>>: 右移
13、程序代码的执行结构
顺序结构
分支结构:if 和 switch 结构
循环结构: for foreach(JS for…in…) while do..while
14、循环控制
Continue:结束本次循环,继续执行下次循环,后边也可带参数跳出几层循环
Break:结束当前的循环体,继续执行循环体下边的内容,break后边可以带参数跳出几层循环
15、标签语法
If for foreach while
① <?php if() : ?> <?php endif ?>
② <?php foreach() { ?> <?php } ?>
16、php的编译过程
①加载源代码à编译à词法分析(parse error)à语法分析(parse error)à生成opcodeà执行opcode (fatal error)à html代码
17、函数
# 回调函数:在函数的内部使用可变变量来实现外部函数的调用,处理传递进来的参数
# 函数名不区分大小写
函数的作用域:全局和局部以函数为界限
局部访问全局: 引用传值,$GLOBALS(超全局预定义变量),global关键字
全局访问局部:global关键字,return返回值
$GLOBAL超全局预定义变量,可以在任何地方使用变量,且可以改变变量的值
Global关键字只能在函数中引入变量,并不能对其赋值,实质上就是在函数的内部创建了一个局部变量,使内存地址指向外部变量的地址,如果外部没有该变量则自己创建一个
18、静态变量
初始化一次(编译保存在代码段),通常与递归进行搭配
19、伪类型
Number Mixed callback void
20、数据类型的转换
False 0 0.0 ‘’ null array() object à 均为false
(int) (bool) (float) (string) (array) (object)
21、数据类型的判断
is_bool: 判断数据类型是否是布尔类型
is_float: 判断数据是否是浮点型
is_integer: 整型判断
is_object: 对象判断
is_array: 数组判断
is_string: 字符串判断
is_resource: 资源判断
is_scalar: 标量判断: 整型,浮点型,布尔型和字符串型都可以判断
is_null: 是否为空
is_numeric: 数值型判断(纯数值型字符串)
Gettype: 获得一个数据的数据类型:返回的字符串描述
Settype: 修改数据的数据类型(修改数据本身: 永久性)
22、empty与undefined的区别
Empty 检查变量是否为空
换句话说,””、0、”0″、NULL、FALSE、array()、var $var、未定义;以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE
Isset 检查变量是否设置
如果变量存在(非NULL)则返回 TRUE
拓展:
Null 即是一个不存在的对象的占位符
Undefined 变量已经被声明,但没用赋值
NaN 不是一个数字
23、文件包含
意义:页面布局,代码复用
向上包含:通常是为了使用其他脚本中的结构(类和函数)
向下包含:通常是为了为了当前脚本的数据在对应的HTML中进行显示
include和require的区别:在包含文件的时候处理错误的态度不一样
include只是尝试包含,给出警告,后续的代码还是会继续执行
require 是强制包含,给出致命错误,后续的代码不会继续执行
include_once只包含一次,而include执行一次包含一次
require_once 同上
24、文件路径
磁盘的绝对路径:D:/server/apache (仅限在服务器端使用,不能写入到HTML中)
网络的绝对路径:http://localhost/ (可以用于任何地方,从站点的根目录开始寻找)
./ 当前目录
../ 上层目录
/ 网站的根目录
绝对路径更加准确(__DIR__),相对路径效率高但可能出错
25、数组
1)数组的三种定义方式:
$arr = array();
$arr = [];
$arr = null; $arr[] = 1;
2) 数组的分类:
索引数组、关联数组、混合数组 (都是通过下标来进行区分)
3)count($arr)函数: 查询出数组中的所有元素
4)数组的遍历
for():只能遍历索引数组
foreach():可以遍历所有的数组,利用了数组内部的数组指针
5)Each():通过数组的指针获取数组元素的函数,能够将当前数组指针所指向的元素的下标和值都可以获取到(数组的指针刚开始处于下标为0处),以关联和索引的形式个返回一组数据,是一个具有四个元素的数组(1和value保存值;0和key保存键名)
each()是指针的操作,当访问一次数组后,数组的指针将会下移一位;当指针移出数组后将返回false,each()可以来证明当前数组的指针处于什么地方
6)List():List 函数可以批量的为变量进行赋值
List(变量列表) = 数组; 通常list是搭配each针对数组进行遍历
7)数组相关函数
key: 获取当前数组指针指向的键名
Current:获取当前数组指针指向的键值
Next: 获取当前指针的下一个元素的值,并且将指针移动到下一位数组元素
Prev: 获取当前指针的上一个元素的值,并且将指针移动到上一位数组元素
end: 获取数组的最后一个元素,并将指针移动到最后一个元素
reset:重置,将数组指针移动到第一个元素
next或者prev无法将一个已经移除数组的指针移回来
end和reset 可以将指针移回来
array_keys:获取数组的所有的下标(键名),返回索引数组
array_values:获取数组的所有的值,返回索引数组
26、数据结构模拟
数据结构:数据的存储方式
常见的数据结构:栈(先进后出) 队列(先进先出)
Array_push 向数组的后边加入一个元素
array_pop 从数组的后边弹出一个元素
array_shift 从数组的前面弹出一个元素
array_unshift 从数组的前面加入一个元素
27、数组字符串的转换
explode(‘,’,$str) 将一个字符串按照一定的方式爆炸为数组
implode(‘-’,$arr) 将数组按照一定的方式编织为字符串
28、数组的和运算
1)+ 加运算:不区分索引和关联
运算方式:保留第一个数组中的所有的元素,去寻找第二个数组中的元素,如果存在相同的下标则不管,如果不存在则添加进来
2)array_merge():首先尝试保留第一个数组中所有的元素,去寻找第二个数组中相同的下标(索引)如果存在则后边的覆盖前边的,如果不存在则保留第一个,如果后边还有索引下标对应的元素,直接添加到第一个数组的后边,索引重置
29、数组验证码
1)利用range函数得到指定范围内的一个随机数range(0,9),range(a,z),range(A,Z)
2)合并数组array_range()
3) 通过array_rand($array,$num)函数获取随机下标
4)利用shuffle()打乱下标
5)通过遍历下标从合并的数组中得到验证码
29、系统函数
字符串函数:
1)Strlen($str):获取字符串的长度
2)Substr($str,起始点,终止点)获取指定范围内的字符串,没有指定终点则到最后
3)Strtolower($str):将所有的字符串小写
4)Strtoupper($str):将所有的字符串大写
5)Strrev($str):reverse 将字符串进行反转
6)Strpos:获取指定字符的位置
7)Strrpos:从右边开始获取字符串的位置
8)Strchr($str,’|’)从匹配的地方截取字符串到最后(从左到右)
9)Strrchr($str,’.’) 从匹配的地方截取字符串(从后向前)
10) Trim() 消除字符串两边的空格或者是指定的字符
11)str_repeat:重复的输出某个指定的字符串
时间日期函数
1) time():获取当前时间的时间戳
2)Date():时间戳转日期
Date(‘Y-m-d H:i:s’) 获取当前的日期
Date(‘Y-m-d H:i:s’,time()) 同上
Strtotime():将字符串转换成时间戳
Microtime(): 获取微秒数
数学相关的函数
Abs:获取绝对值
Floor:向下取整
Ceil:向上取整
Round:四舍五入
Rand:取得一个指定区间内的随机数
mt_rand:取得一个指定区间内的随机数
30、浏览器的传值
1)浏览器的传值方式有两种:get和post即url和表单传值两种方式
2)URL的组成:http://(http协议)+localhost:80(主机)+URI(统一资源定位)
3) 表单的传值都是通过name属性名来加以区分,一旦出现同名将会被覆盖
4)$_REQUERST:不安全,会通过array_merge()函数来合并post和get数据,如果出现同名函数将会被覆盖:php.ini中request_order选项代表覆盖的顺序
31、文件上传
文件的上传分为两个部分:客户端的上传和服务器的接收
1)服务器端必须接收文件:开启php.ini中文件的上传file_uploads = on
2)修改文件上传的临时文件存放目录:upload_tmp_dir =
3)对于大文件需要用post进行传递,故提交方式为post
4) 使用表单域进行传递 <input type=’file’ name=’upfile’>
此处的name值通过$_FILE[‘upfile’]来进行接收
5) 通过get和post默认提交的数据为字符串类型,文件上传时属于二进制的形式故要使用post来帮助提交二进制数据,那么要指定提交数据类型为二进制
<form method = ‘post’ enctype=’multipart/form-data’ >
6)可以通过var_dump($_FILE)来查看文件的所有信息 mime
7)由于文件上传后保存在临时文件的目录,一旦上传完成系统将会进行回收,故需要将临时文件移动到专门用来保存资源的目录
Move_upload_file(tmp_path_filename,save_path_filename)
或者copy(tmp_path_filename,save_path_filename)
32、文件操作
文件路径操作:
读(获取路径中文件夹内的文件名)
写(增删改对文件本身的操作)
1)文件路径读取操作
Opendir():打开该路径下的文件资源
Readdir():读取该路径下的所有文件(一次读取一个需指针遍历)
closedir():关闭该路径下的文件
Scandir():读取该路径下的所有文件,一次性不用遍历进行读取
2)file_exists:判断文件是否存在
is_dir:判断是否是一个路径
is_file:判断是否是一个文件
Mkdir:创建一个文件夹
Rmdir:删除一个文件夹
Getcwd:获取的工作路径
PHP5文件内容的读取
php可以读取任何格式的数据,但只能使用字符串,不能使用二进制
1)读操作file_get_contents()和file()
file_get_contents(path_filename):可以是指定的路径和URL(模拟get请求)
file():从指定的文件中每一次读取一行数据,然后将读取到的数据保存到数组中(excel)
2)写操作
file_put_contents(targetfile,contents) 将内容写入到指定的文件中,当目标文件不存在的时候会自动的创建文件,默认情况下写入的内容会覆盖以前的内容
PHP4中对文件的读写操作(读写操作之前需要将文件资源打开)
1)文件的读操作
fopen($path,$model):打开文件资源
r/r+ : 文件指向文件头
w/w+: 文件的指针指向文件头(清除),文件不存在则创建
a/a+ : 文件的指针指向文件尾(追加),文件不存在则创建
Fgetc:一次读取一个字符,读完后指针将会下移
Fgets:一次读取多个字符,最多一行
Fread: 读取指定长度的字符串
fclose() 关闭资源
2)文件的写操作
Fwrite()/Fputs:文件的写操作,根据指针的位置来进行文件的写操作,且会覆盖文件的内容
3) 文件的指针fseek();
文件操作的函数
1) copy
2) @unlink:删除文件 当文件不存在是需要一直错误
3)Rename: 重命名
4) Filemtime:获取文件的最后一次修改时间
5)Filesize : 获取文件的大小
6)Fileperms: 获取文件的权限
33、文件下载
文件下载的原理:服务器获取文件转换成二进制流,传输给浏览器,浏览器再将二进制流转化成对应的文件格式
1)A链接下载
使用浏览器不能识别的文件,放在a链接的路径中进行下载
特点:不安全,暴露主机的ip地址; 下载文件内型的限制(txt,jpg无法进行下载)
2)PHP文件下载
a、通过http协议告诉浏览器数据为二进制流,不要解析
header(‘content-type:application/octet-stream’);
b、告诉浏览器不仅不解析,而且还要以附件的形式进行保存
header(‘content-Disposition:attachment;filename=’建议的文件名’ ”); // 伪装
c、将文件读取后传递给浏览器即可
echo file_get_contents(‘filename’);
特点:没有文件的类型限制,不会暴露文件所在的真实路径
34、算法(冒泡,快排)
35、HTTP
通过互联网之间进行数据传输是必须遵循的超文本传输的协议,通过浏览器进行数据的访问和提交都属于HTTP协议的管理范围,协议内容都是浏览器和服务器根据实际的情况自身进行构造的
1、特点
1)支持客户和服务器模式
2)简单快速:只需要请求方法和路径
3)灵活:协议之间没有给定传输的数据的内容,可以是字符串也可以是二进制流
4) 无连接:每次的连接只处理一个请求,响应完毕就会断开请求
5) 无状态:事物处理没有记忆能力,一次请求只有一个响应,多次请求间服务器是不能够识别浏览器的
2、请求
HTTP请求分为四个部分:请求行,请求头,空行,请求数据
请求行:请求方式 ,URI , 协议版本(HTTP/1.1)
content-type: post数据提交的时候才会存在,将数据进行格式转换(对中文进行转码)
故表单中提交的数据有中文的时候需要使用post进行提交
3、响应
响应分为四个部分:响应行,响应头,空行,响应数据
响应行:协议版本,状态码,状态描述
4、状态码
1xx:请求正在正在处理,但是还没有处理完
2xx: 服务器已经正确处理
200--响应完成
3xx: 重定向(服务器需要浏览器重新请求)
304--有缓存不需要重新请求 303—重新发出请求
4xx: 请求错误(发起的请求服务器无法正常解析)
403--forbidden 404—not fund
5xx: 服务器内部出错
502—服务器没有从上游获取正确的结果
fscokopen:与目标服务器建立连接
36、面向对象含义
面向过程:面向过程是一种设计思想,而不是一种技术,将一个需要实现的过程分成小节点,各个节点以函数的形式实现;最后将函数调用串起来;没有体现事务发展的操作主体(操作的对象,买家和卖家的行为没有分离)
优缺点:模块化编程,实现了代码的复用
面向对象:面向对象也是一种设计的思想,不是一种技术,将整个事务的过程分散成一个个的小节点,将小节点分散到操作事务的主体中,
优缺点:模块化编程,使用函数实现结点功能;实现代码的复用;更符合人的逻辑思维
更加的体现了操作的主体(买家的行为,卖家的行为)
不同点:面向过程效率高,开发速度快;面向对象符合人的逻辑思想,开发速度慢,后期维护方便
类:将主体上相同的一部分功能或特点抽象出来够成一个抽象体,是对象的抽象体(人类)
对象:类的一种具象(亚洲人)
实例化:将类的这种具体实例化出来(安倍)
类成员:在类中定义的内容(属性,方法,常量)
属性:在类中用来存储数据的变量
方法:类中的函数
类常量:类中定义的常量,只能使用const关键字来进行定义不能使用define函数来定义
访问修饰限定符:用来限定类成员可以被访问的作用域public/protected/private
37、类成员的访问
对象存在于类的外部,访问的属性和方法确存在于类的内部,故会受到访问修饰符的限制,公有的属性和方法可以在类的外部进行访问,而私有和受保护的属性和方法只能在类的内部进行访问
对象可以访问类的属性和方法,即便是在类的内部都需要对象来进行访问
$this:是一个只能在类的内部(方法内部)使用的关键字,当访问的对象对方法进行调用的时候,能够迅速的抓到访问方法的对象,将对象所保存的内存地址给$this,$this就代表当前访问当前方法的对象(故$this在类的内部代表所有来访的对象)
构造方法:__construct() 在类构造对象的时候会自动为新创建的对象自动调用的方法(必须为public,否则无法进行对象的实例化),构造方法的意义初始化对象的属性
构析方法:__destruce()对象即将消失的时候,对象会自动的调用方法,存在的意义是销毁资源
在脚本执行的结束的时候:删除保存对象的变量,让变量指向其他的内存地址,变量赋空值
对象传递:默认是引用传递
38、类的加载
类一般存在于其他的文件中,通常的加载形式有手动加载和自动加载
手动加载:include_once 文件的包含
自动加载:__autoload()来获取需要使用的类文件名,通过include来进行类名组装加载
38、类常量的访问
类的常量属于类,故在类外à 类名::常量名 来访问,类中à self::常量名
普通属性和方法,在类中使用$this访问,类外使用对象名来访问
39、静态属性和方法
静态属性和方法都是给类使用的
可以在构造函数中添加静态属性完成计数器
使用关键字 static 来进行定义属性和方法
类外访问 类名::属性/方法 类中访问 self :: 属性/方法
40、静态和非静态的区别
1)静态的东西(属性和方法)是给类访问
2)非静态的东西是给对象访问的
3)静态的存在:提高工作效率,不需要实例化,不需要耗费内存
4) 静态方法中不能使用$this
self 和 this 的区别
$this 只能在普通方法中使用,不能在静态方法中使用,self没有限制
$this 只能访问普通属性,self只能访问静态属性(常量)
parent 来访问继承父类的protected修饰的方法和属性
41、设计模式
1)单例模式:一个对象只能产生一个对象
三私一公
私有化构造方法:不让类在外面无限实例化对象
公有化静态方法:进入到内的内部:允许实例化
私有化静态属性:用来保存已经存在的对象(阻止产生多个)
私有化克隆方法:防止对象克隆产生新对象
2)工厂模式:为其他的类产生对象,不用产生自己的对象(配合include手动加载类然后实例化)
42、面向对象的三大特性
封装:将数据以及操作数据的方法捆绑到一起,形成对外部隐蔽的结构,私有内部结构,但是对外提供操作的接口(看做是远程访问类文件)
继承:一个类所有具有的属性和方法,另外一个类跟当前类也有点类似的功能,可以从已有的类继承过来,继承的类称为父类,被继承的类称为子类,子类在什么也没有的情况下就可以使用父类的属性和方法;继承的意义:代码的复用和代码扩展
多态:多种形态,是一种强类型的面向对象语言才具有的特性,php是弱类型语言没有多态
一个类在实例化过程中:标准类型是父类类型,得到的确实子类类型,最终产生的对象,拥有父类的形态,表现的确实子类的形态
要实现多态必须满足:继承和重写(子类拥有与父类相同的属性或方法)
43、继承与重写
基本概念:将所有子类的特点进行抽象出来,定义为属性或者方法,所有继承父类的子类将会拥有该父类的属性和方法
基本语法:class 子类 extends 父类{}
继承特性:
#继承是继承了父类的所有属性和非私有的方法(protected),但是私有的属性只能在父类的内部使用(可通过公有化的方法进行访问),protected也只能在子类的内部进行使用,而不能在外部进行使用
#虽然子类没有继承父类的私有化方法,但是可以通过父类的公有化方法进行继承并达到访问
#静态的内容属于类,也符合继承使用条件, 但是不把静态的内容称之为继承.
#一般来说继承父类的一些属性,不用做于外部的访问可以将其限定为protected来修饰,
重写:
总结:不管是继承属性还是方法,继承的本质是: 其属性的原始类都是属于父类,如果能被重写,那么就从属于子类,否则任然是父类
【继承属性】
继承父类的属性的时候是将父类的所有属性都继承过来了,在重写的时候由于private属性只能使用不能被修改,故在对象中重新创建了一个子类(本类)的属性来进行重写
【继承方法】
public 方法(如:利用父类的公有方法去访问父类的其他属性/方法) ,能被继承
protected 方法能被继承
private方法不能被继承
继承的公开/保护的方法,它们都是属于父类的,子类可以重写被继承的public/protected方法,而private不能被重写,当子类在调用父类的公有方法访问父类的其他方法时private依旧使用自己的方法
重写的规则:
子类重写父类的属性和方法的时候: 需要保证子类的权限(访问修饰限定符)要比父类的权限要小(子类对外的访问权限要比父类的要高): 如果父类是受保护Protected,子类必须是protected或者public
动态延迟绑定(self与static的区别):
self关键字从一开始永远代表自己所在的类, 不会因为方法的调用者(子类和父类)而变换:static关键字就是谁调用就代表谁(能够检测调用对象)
PHP中继承的特点:
#PHP不支持多继承: 一个类只能有一个父类
#PHP支持链式继承: 子类继承父类, 父类继承爷类
# PHP继承是双向: 子类继承父类的方法和属性,父类中也可以访问子类的属性或者方法
特殊类:
【最终类Final】
#使用Final修饰的类不可以被继承
#使用Final修饰的方法不能被重写
【抽象类abstract】
#抽象类只能被继承不能被实例化
#abstract修饰的方法为抽象方法不能有方法体,子类继承后必须实现父类的所有的抽象方法通过重写来实现,主要用于项目的规范
44、接口
定义方法:
Interface 接口名{ 接口成员 }
# 接口中不能含有变量,只能使用常量和方法
# 方法(抽象方法)不能有方法体且只能是Public修饰
# 接口只能被类实现,类必须实现接口中的所有的抽象方法
Class 类名 implements 接口列表{// 实现接口中的所有的抽象方法} //接口可以被多实现
# 接口可以被接口继承,类只能来实现接口,用来规范项目
Interface A extends B{}
# 面试题
① PHP中类能够继承多个类吗? 如何模拟?
PHP不支持多继承,但可以通过链式继承实现一个类继承多个类
② 抽象类是不是类?
抽象类是类: 抽象类中可以拥有一个正常类所能拥有的所有内容, 同时还可以拥有抽象方法(没有方法体的方法)
③ 接口是不是类?
接口不是类
④ 接口可不可以被继承?
接口不可以被继承(接口不能被类继承: 只能被类实现)
接口可以被接口继承: interface A extends B(interface)
45、重载
重载:overload,重新载入;
在面向对象中: 重载是一种允许多个同名方法存在, 参数列表和返回值可能不同: 系统在调用方法的时候,会根据参数类型或者个数自动的选择合适的方法.
在php中是不支持严格意义上的重载:当类或者对象去访问一个不存在或者权限不够的属性或者方法的时候,会自动触发的魔术方法.
属性的重载:
当对象去访问一个不存在或者权限不够的属性的时候,会自动调用的魔术方法.
__get(要获取的属性名字)
__set(要设置的属性名字,要设置的属性的值)
默认的对象可以无限制的增加属性: 增加的属性都是public
__isset(需要判断的属性名字): 判断属性:
当外部使用isset或者empty来判断对象的属性(不存在的或者权限不够的)会自动触发的方法
__unset(要删除的属性的名字): 删除属性: 当对象被使用unset删除属性的时候(没有权限或者不存在)会自动触发的魔术方法
方法的重载
当访问一个不存在的或者权限不够的方法的时候,会自动调用的魔术方法.
__call(方法名字,参数数组): 对象访问一个普通不存在或者权限不够的方法的时候会自动触发的方法
__callStatic(方法名字, 参数数组): 当类去访问一个不存在的或者权限不够的静态方法的时候会自动触发的方法
重载的意义:
如果一个类的设计只是给自己使用: 重载没有意义(没事不会自己乱用)
如果类需要提供给外部使用(接口): 就需要重载来进行容错处理,不至于系统出错
46、命名空间
命名空间的定义:namespace 空间名 、namespace 父空间/子空间名
命名空间的成员:类、函数、常量(const)[变量访问不受命名空间的限制]
命名空间的意义:在内存上进行文件的划分,可以有多个同名(函数/类/常量)的存在
命名空间的访问:
相对路径:限定名称访问和非限定名称访问
绝对路径:完全限定空间访问
非限定名称的访问:直接使用要访问的空间成员(函数,类和常量),通常情况下访问的是当前空间下的方法、常量、类
限定名称的访问:限定名称访问只适用于在当前父空间下访问子空间:在当前所在的父空间中,向下访问子空间,【子空间名字\空间成员】
完全限定名称访问:绝对路径的访问,没有空间的限制
命名空间中绝对路径的根目录是: \ 【\空间名字\访问内容;】
子空间:
在指定的命名空间下可以创建多重空间: 所有的空间都是从根目录开始创建.
命名空间1/命名空间2...;
空间的引入:
使用文件的包含include来进行引入,但是引入空间后并不能进行使用,需要使用use来进行使用;当引入的文件有命名空间,那么此空间也将会被引入
引入空间的访问:可以使用限定名称的访问和完全限定名称来访问
空间元素的引入:
空间元素的引入只能引入类 use 空间名称\类名称 as 别名
全局空间:当引入的文件没有命名空间就是全局空间,全局空间的访问可以通过完全限定的方式进行访问(绝对路径)
47、序列化
文件只能保存字符串类型的数据,而不能保存复合数据类型(数组和字符串),__toString()
可以进行转化字符串但是无法将对象还原,故使用serialize和unserialize 来进行转换
注意:在对象的还原中,需要定义一个空的对象,这样对象的还原的时候就能知道对那个对象进行还原了,可以配合__autoload()来进行载入需要的类名
资源类型是无法进行保存的:__sleep()用来监测serialize(),当进行序列化的时候,会告诉序列化什么,__week()可以监测到将对象唤醒后,对象将会执行什么操作
48、PDO
Phpdata object: 在php中将操作数据库的基本语句封装成对象,可以对多种数据库进行操作,是一种扩展机制
PDO:分为三类
PDO基础类:数据库的初始化和基本的SQL执行操作
PDOstatement类:数据库的操作类:query和prepare(预处理),结果处理等
PDOexception类:错误处理类
常用的方法:
① 通过dsn进行连接, new 一个pdo对象
② Exec 返回受影响的行数,通常搭配PDO::errorCode/PDO::errorInfo /PDO::lastInsertId()
③ Query($sql) 获取一个PDOstatement类,获取结果集
④ PDOstatement::fetch() 将结果集转化为一个数组
49、预处理
Mysql的预处理:
事先将一条要执行的SQL语句发送给服务器, 但是不执行. 当需要执行语句的时候, 发送一条执行的指令才会执行.
① Prepare 预处理名字 from ‘要执行的SQL语句’;【可使用占位符来传递参数】
如果占位符有多个,那么变量列表是自动按顺序匹配
② Execute 预处理名字;【Execute 预处理名字 using 变量 --不能直接用数据】
预处理的意义:
优化数据库: 当SQL语句复杂但是又多重复的时候, 可以先将复杂的SQL语句发送给服务器: 后期提供简单的执行指令(减少带宽)
预处理是会话级别: 当前用户当次连接有效(apache,mysql长连接)
PDO的预处理:
PDOstatement PDO::prepare()
PDOstatement::bindvalue() 值的传递
PDOstatement::bindparam() 引用传递(必须传递变量,才能在外部进行值的修改)
50、PDO事务处理
事务处理: 有多个操作(写操作)需要同时执行成功, 需要将操作不要每一步都直接同步到数据表,而是将结果临时保存到事务日志中: 最后一次性处理. 保证最后结果要么全部成功,要么全部失败.
PDO事务处理
① 开启事物处理: PDO::beginTransaction()
② 回滚点的设置: PDO::exec(‘savepoint sp1’)
③ 判断结果选择性提交:
a) PDO::commit: 同步到数据表
b) PDO::rollback: 清除操作
PDO属性处理:都是通过修改PDO的常量来进行
51、反射
52、session入库
通过session_set_save_handler(prama参数)注册进行session机制
注册机中的参数:
①字符串表示函数,如果是数组则为array(‘p1’,’p2’)
②若p1为字符串,p2为字符串则当做p1::p2()—p1类名来调用p2方法
③若P1为一个对象,则会自动识别该对象来调用p2方法
Session入库就是改写了session原来存储在文档中的机制,将其改到数据库中,
使用在外部定义的open、close、read、write、gc、destory函数来实现session的入库
注意session_set_save_handler(open,close,read,write,gc,destory)使用顺序
数据库的字段有 session_id,content,lose_time 组成