自学php笔记
1,函数名称是不区分大小写的,但是变量名称是区分大小写的, 2, 在MySql中sql执行的语句是不分大小写的,但数据库和表名是区分大小写的 3,在sql语句中,字符串要用一组单引号 ' ' 或者双引号 " " 包起来, 4, 当字段是字符串型是必须用一组 ' ' 或者 "" 包
1,函数名称是不区分大小写的,但是变量名称是区分大小写的,
2,在MySql中sql执行的语句是不分大小写的,但数据库和表名是区分大小写的
3,在sql语句中,字符串要用一组单引号 ' ' 或者双引号 " " 包起来,
4,当字段是字符串型是必须用一组 ' ' 或者 "" 包起来,否则会报错;当字段是int数值形式 标准是不用引号,但如果用了也不会报错,MySql会自动转换为相应数值型
5,mysql中的自我复制
insert into 表名1 (字段名,..,..,..)select 字段名,..,..,.. from 表名1
var_dump() 一个函数 向页面输出类型
对于 . 这个并置 的字符串运算
$m=123;
$n=23;
echo "$m"."$n";
结果依然是 字符串的链接 12323;
instanceof 判断是否属于一个类的对象;
例如:
class A{
....
}
class B extends A{
......
}
$b = new B()
$b instanceof B 返回true
$b instanceof A 返回true
$b instanceof Displayable 返回false(由于A和B 都没有实现接口)
注意:
在php中,当给函数/方法传入参数时,不能传递该参数的类型,但可以使用类类型提示,指定必须传入的参数类类型
如果传入的参数类类型不是指定的类型,将产生一个错误
function check_hint(B $b){
....
}
正确;
function check_hint(A $b){
....
}
正确,因为$b是类B的实例,但类B 继承了类A
但如果$a是类A的实例,使用下面的传入是错误的
function check_hint(B $a){
..........
}
php中没有无符号数 ,都是有符号数。
计算机底层 都是以 补码的形式进行的
正数
原码=反码=补码
负数
反码:符号位不变 ,其他各位取反
补码:在反码的基础上,加一
所以对于位运算时要注意的是:
1.计算机底层是以补码的形式运行的,所以位运算首先要写出各自的补码,然后才能进行位运算。
2.对于位运算的理解:是逐为与、或、取反等等,此时包括符号位,所以负数的~是正数:~-5 = 4;
对于左移和右移:(注意:上面所说的对于计算机底层的运行形式:补码在这里依然是这样,要以补码形式来进行位移)
1.无论是左移还是右移,符号位都是不变的
2.右移,低位溢出,高位用符号位来补
3.左移,低位补0;
php数组:
php数组中可以存放任意类型的数据类型;
* 包括 null 、数组、对象
php中的索引可以是自己指定;同时true 、false、null也是可以的 ,小数为索引是自动截断小数部分
print_r()打印关于变量的易于理解的信息,(来显示数组的有关信息)
print_r() 打印关于变量的易于理解的信息。(详细内容见php参考手册)
var_dump()打印变量的相关信息
对于print_r()和var_dump()区别:
没有明显的区别只是var_dump()打印的变量信息更多更全面,而print_r()打印的是易于理解的信息 (注意手册中的说法)
php中的数组是可以动态增长的:
$a=array(2,3); | $a=array(2,3);
$a[2]=56; | $a[3]=45;
echo $a[2]; | echo $a[3]
输出:56 | 输出:45
上面的例子说明php中的数组灵活性很大,在许多语言中上面的写法是错误的,
explode(,)对字符串拆分
定义数组 array()
可以用 array() 语言结构来新建一个 array。它接受任意数量用逗号分隔的 键(key) => 值(value) 对。
二维数组:
$arr=array(arr(....),array(....),array(....));
$arr[0]=array(.....);
$arr[1]=array(.....);
$arr[2]=array(.....);
关联数组:
$arr=array(1=>arr(....),"sd"=>array(....),"12"=>array(....));
$arr[1]=array(.....);
$arr["sd"]=array(.....);
$arr["12"]=array(.....);
注意:(数组中有很多需要注意的地方,详细要阅读参考手册)
1.如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。
// 这个数组与下面的数组相同 ...
array(5 => 43, 32, 56, "b" => 12);
// ...
array(5 => 43, 6 => 32, 7 => 56, "b" => 12);
?>
2.观察下面的数组错误:
$arr=array($a1,$a2);
$a1=array(....);
$a2=array(...);
此时的错误时上面的两个变量和下面的定义变量只是名字表面一样,而且上面的数组中给的变量没有明确,本身就有语法问题,
如果要实现就要调整位置:
$a1=array(....);
$a2=array(...);
$arr=array($a1,$a2);
这里主要注意的是:函数是顺序执行的,所以要先把$a1和$a2数组变量定义好,然后程序执行到$arr=array($a1,$a2);才能明白其中的$a1和$a2是哪个具体的数组。
******
数组中还有很多的要注意的地方,有问题要详细查看参考手册
******
关闭notice级别的错误
1.在php.ini文件中改动error_reporting
改为error_reporting=E_ALL &~E_NOTICE2.如果只是想在提示notice错误的页面禁止notice ,就需要加上这句话
error_reporting(E_ALL^E_NOTICE)
php排序
1.冒泡法
2.选择排序
3.插入排序
4.快速排序
查找:快速查找、二分查找(前提:二分查找的数组必须是一个有序数组)
php面向对象
创建类方法:
class 类名{
......}
创建对象:
$对象名 = new 类名();
$对象名 = new 类名;
访问对象属性:
$对象名->属性名;
****
现实项目中我们命名类文件的名称是遵循这样的规律:类名.class.php
****
对象在内存中的存在形式:
所以对于实例对象之间的相互赋值:$b=$a;
对于变量$a赋给变量$b,就是将变量$a存储的地址给变量$b,此时堆区中的实际对象存放地址同时被变量$a和$b指向,
但是对于数值变量:
$a=78;
$b=$a;
$b=$b+8;
echo ‘$a’;
echo ‘$b’;
输出 :78
$a=78;86
此处 $b=$a 是值传递;
$b=&$a;
$b=$b+8;
echo ‘$a’;
echo ‘$b’;
输出 :86
86
如果给函数传递的是基本数据类型(整数、小数、布尔、字符),究竟传递的是什么?
在默认的情况下传的是值,如果你想传入地址可以使用&
当给函数传入参数对象时是: 地址传递
在php中,如果给函数传递的是数组,则默认情况下是传值(值拷贝);如果希望传入地址,则应当加&(&$数组名)
成员方法(函数)
形式: 访问修饰符 function 方法名([参数列表]){
方法体;
return 结果;(此处也可以不返回,根据实际需求)
}
对比前面学过的函数,我们可以发现,他们非常的相似,这里只是多了一个 访问修饰符 和 放置的位置 不同(成员方法在类里面)
调用成员方法的机制和前面我们学习的调用函数的机制是一样的。
注意:虽然php中的类定义方式和java中的很相似,但是php中的成员方法和java中的成员方法在定义时是有区别的:function,在java中是不需要这个关键字的。
文件代码的引入:
require 'object.php'
require_once 'object.php'
include 'object.php'
include_once 'object'
变量的作用域:
作用域指的是在一个脚本中某个变量可以使用或可见的范围,php具有6项基本的作用规则
1.内置超级全局变量可以在脚本的任何地方使用和可见
2.常量,一旦被声明,将可以在全局可见,他们可以在函数内外使用
3.在一个脚本中声明的全局变量在整个脚本中是可见的,但不是在函数内部
4.函数内部变量声明为全局变量时,其名称要与全局变量名称一致
5.在函数内部声明的静态变量,函数外部是不可见的,在函数的多次 执行过程中保存该值
6.函数内部创建的变量对于函数来书是本地的,当函数终止时,该变量也就不存在了。
超级全局变量:
$GLOBALS[''] 全局变量数组,键值就是变量名($GLOBALS['var'] 等效于 global $var)
$_GET['']
$_POST['']
$_SESSION[''] 会话变量数组
$_COOKIE[''] cookie变量数组
$_REQUEST[''] 所有用户输入的变量数组,包括$_GET $_POST $_COOKIE 所输入的内容
$_SERVER['']
$_FILES['']
$_ENV['']
当成员方法中使用全局变量:$GLOBALS['var'] global $var $this->var
php构造方法:具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。
特点:1,没有返回值
2,当创建一个类的新对象时,系统会自动调用该类的构造方法完成对新对象的初始化
3,可以重载(重载只是一种语法规则),不能覆盖
形式:
php 4中:
class 类名{
public function 类名(参数列表){
......
}
}
php 5中:
class 类名{
public function __construct(参数列表){
....
}
}public function 类名(参数列表){
......
}
当上面两个构造方法同时存在于一个类中时,优先选择第一个第一个function __construct(){},并且一个类中只能有一个构造方法起作用,之所以一个类中写两中主要是为了考虑兼容。
php析构方法:
析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
主要用于释放资源
形式:
function __destruct(){
......
}
析构方法自动调用
析构方法主要用于销毁资源
析构方法调用的顺序,先进后出 也就是栈
析构方法什么时候被调用:
1.程序退出时2.当一个对象成为垃圾对象(没有任何变量再引用该对象)时,该对象的析构方法就会被调用一旦一个对象成为垃圾对象,析构方法就会立即调用3.一个类只有一个析构方法,并且析构方法没有参数列表
php静态变量(static),也称类变量类方法
定义静态变量:
访问修饰符 static 变量名;
访问静态变量:
注意:在类外部:类名::$类变量名
在类内部:sel::$类变量名 或者 类名::$类变量名
静态变量和方法可以不实例化类直接访问,不能通过类对象访问其中的静态成员(除静态方法外)为兼容php版本,如果没有说明可见性,默认是public不能用非静态的 对象名->操作符 这种方式访问静态变量同样不能使用::来访问一个非静态的
php静态方法(类方法)
形式:
访问修饰符 static function 方法名(){......}
访问静态方法:
在类外部:类名::类方法名 或者 对象名->类方法名
在类内部:sel::类方法名 或者 类名::类方法名
当我们操作静态变量的时候,我们可以考虑静态方法
注意:
静态方法中不能访问非静态方法
由于静态方法不需要通过对象即可调用,所以伪变量$this在静态方法中不可用
非静态方法既可以操作非静态变量也可以操作静态变量
静态方法只能操作静态变量
php面向对象三大特征:继承、封装、多态
一、封装:就是把抽象出来的数据和对数据的操作封装在一起,数据被保护在内部,只有通过成员方法才能对数据进行操作
封装中重要的访问控制符:
以*问修饰不写时,默认是public
** 那么如何访问这些限制符修饰(protected、private)的数据?
php为我们提供一对方法(‘魔术’方法/函数--详细见参考手册:类与对象->魔术方法):
__set()
__get()
上面的方法管理了所有的 ,现在已经不建议使用。
建议使用自己写的特定的方法:
public function setXxx(参数列表){
...
}
public function getXxx(){
...}
二、继承:对已存在代码的扩展,实现代码的复用
三、多态:简单的概括为“一个接口,多种方法”,在程序的运行中才决定调用哪个方法/函数。多态是允许你将父对象设置成为和它的一个或更多的子对象相等的技术,赋值后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作
*** php成员方法中相互调用时前面加 $this->test();***
php继承()
形式 :
class 类名 extends 父类名{
.....
}
根据上面的访问修饰符我们就可以知道,在继承中:子类只能继承父类中的由public、protected修饰的变量和方法;而被private修饰的变量和方法是不能被继承的。
php中的继承是单继承,意思就是说只能有一个父类,
但是可以b继承a,c继承b,此时c中就有一些a中的属性或方法,当然这种连续的继承可以不限次数(当实在需要多重继承时,我们可以勉强使用这种方法来替代,但这种实现方式和多继承是不一样的,如果想试想“多重继承”我们可以使用接口)
当创建子类对象时默认不会自动调用父类的变量和方法
如果我们想在子类中调用父类的构造方法或者其他方法,形式:
类名::方法名()
parent::方法名() //此处的parent不能大写 当在子类中调用父类方法时,里面的$this->变量 指的是当前子类重写的那个同名变量值
php多态
php方法的重载(overload)
方法的重载是多态的一种实现,重载指的是:多个方法具有相同的方法名,但是参数列表个数、类型会有不同,通过参数列表的不同来区分这些具有相同名称的方法。
注意:
php5虽然可以支持重载,但在具体的实现上与其他语言有较大的差别。如果试图定义多个同名的方法,那么程序运行将会报错重载实现:(第73讲)
1.php5 默认情况下不直接支持方法重载2.可以使用‘魔术’方法:__call 具体形式见参考手册 类与对象->重载(不推荐这样用) 来模拟重载的效果
php方法的覆盖/重写(override)
重写/覆盖试想:具有相同的 方法名(参数列表)和参数列表 注意:但是这里的参数名称是可以不一样的
子类方法的访问修饰符必须 >= 父类方法的访问修饰符
php多态体现:
若果子类覆盖父类的方法,就调用子类方法;如果子类没有覆盖父类的方法,则调用父类的方法
php抽象类:(本身不能被实例化,主要是为了继承,抽象类可以继承实体类和抽象类3)
形式:
abstract class 类名{
$变量名=xx;
abstract function 方法名(参数列表){
。。。。
}
}
注意:
1.抽象类和抽象方法前面必须加 abstract
2.当一个方法被abstract修饰时 此时它所在的类也必须是抽象类
3.抽象类不一定必须包含抽象方法,也就是说抽象类可以没有抽象方法
4.抽象类中也可以有不是抽象方法的方法(正常的方法),也就是说抽象类中可以由抽象方法、也可以有正常方法;但是有抽象 方法的类必须是抽象类
5.当子类继承一个抽象类(父类),此时要求子类要么声明为抽象类,要么实现父类中的所有抽象方法,否则会报错。
6.抽象类是可以继承实体类,但前提是实体类必须有明确的构造函数
php接口:接口的作用就是定义一些方法,等着其他类来实现它;接口体现了编程中的搞内聚,低耦合
接口使用的基本语法:
interface 接口名{
属性(默认是public,必须是常量,此常量调用:接口名::常量名);方法头;
}
注意:
1,接口中的方法都不能有方法体
2,可以同时实现多个接口3,实现接口需要实现接口中的所有方法,4,接口都不能被实例化5,接口的方法必须都是public,默认就是public6,接口不能继承类,但接口可以继承接口(接口继承接口是多重继承),类和接口之间是实现(抽象类也能实现接口)
class 类名 implements 接口名【可以同时实现多个接口】{
......
}
什么时候使用接口?
1,定规范
2,定下规范,让别的程序员来实现
3,当多个类之间是平级的(没有继承关系),这些类都要实现某些功能,只是实现的这些功能在各个实现类中的方法体操作不同(比如添加学生信息到数据库和添加到xml中,都是添加学生信息,但具体的添加操作却在不同类中不一样)
php中继承和实现的比较:
1,我们可以认为实现接口是对单一继承功能上的补充
2,在不破坏类层级关系的前提下,对某个类功能扩展
什么时候使用抽象类?什么时候使用接口?
1.接口里面方法都是没有实现的,
抽象类里面可以有部分是实现的方法
2.由于1中提到的接口和抽象类的区别我们可以想到:当我们在许多子类中有一些共同的方法时,我们可以在抽象类中实现这个方法,然后集成的子类中就可以用,而不用每个中的去实现它(这就是抽象类中允许出现实现的方法),而接口更多时是提供给我们方法,但要求我们自己实现,具体看下面例子:
比如做一个画面的功能。定义一下画图的接口,一个画的方法。这样,你可以有子类画矩形,画圆。。。。但这样,你不能做一些共通的功能。如果是一个抽象类就好一些。定义一个画图的抽象,一个抽象的画的方法。一个清除的友好方法。这样你的子类都可以调清除方法。来清除画过的东西。
3,开发过程中,用的比较的多的还有一种是接口和抽象的结合使用,
写一个接口,然后再写一个抽象类(implements 此接口), 在抽象类中实现部分方法,具体类继承此抽象类,实现此接口。
php关键字final
PHP 5 新增了一个 final 关键字。
1.如果父类中的方法被声明为final,则子类无法覆盖该方法(但是可以继承,继承下来不覆盖,就是说你可以调用父类中的这个方法,使用。但是不能覆盖重写方法体);
2.如果一个类被声明为final,则不能被继承。
3.final不能修饰变量
php关键字const
const 常量名(大写,不能有&且不能有修饰符)=初始值;
调用:类名::常量名 或 sel::常量名 (不能使用$this->常量名)
接口::常量名
注意:
1,常量默认是全局可见的,并且系统规定了,不能修改,所以常量前面不能有修饰符2,常量一定定义,就要立即初始化(赋值)。并且常量初始化完成后就不能在修改(常量不是属于某一个实例的,所以不能修改,知道常量在内存中的存在就很好理解,见下图)3,define['常量名',值] 和这里的const是一样的效果,提倡使用const
php错误和异常处理:
php错误处理三种方式:
1,使用简单的die()
2,创建自定义错误函数(处理器) 这是针对系统错误的
语法:(下面的函数名可以改)
error_function(error_level,error_message,error_file,error_line,error_context)
错误级别:
错误处理程序或错误处理句柄:set_error_handler(设置处理错误的回调函数【例如上面处理错误的函数error_function】,【错误的级别】)
使用例子:
输出:Error: [$errno] $errstr"; } //set error handler set_error_handler("customError"); //trigger error echo($test); ?>
Error: [8] Undefined variable: test
3,错误触发器(trigger_error()) 针对处理逻辑错误
类似与上面2的处理机制,修改处理句柄和处理函数,只是处理句柄中的错误级别分别是E_USER_ERROR 、E_USER_WARNING、 E_USER_NOTICE形式:
调用错误触发器的时候同时指定错误级别(E_USER_ERROR 、E_USER_WARNING、 E_USER_NOTICE【默认】)
trigger_error(“错误输出信息”,错误级别)
php错误日志保存
error_log($err_info."\r\n",3,"myerr_info.txt");
php异常处理(php中的异常需要手动throw抛出,无法想java一样当try块内出现异常时系统自动抛出异常)
1.进行异常处理的代码放在try代码块内,每个try后至少有一个catch捕获异常,可以有多个catch捕获不同的异常2,当捕获到一个异常后,try{}块里面的后续代码不继续执行3,当抛出一个异常,但没有catch捕获,则提示一个Uncaught Exception....(未捕获异常)4,当catch一个异常时,在catch块里可以处理异常也可以不处理异常5,php允许catch块内再次抛出(throw)异常6,可以自定义异常类
class myException extends Exception{
.......
}
自定义*异常(就是修改系统默认的异常)
1,异常处理函数(异常处理器)
function myException($exception){
......
}2,异常处理句柄
set_exception_handler("异常处理函数名");
错误和异常:
php中的异常需要手动throw抛出,无法想java一样当try块内出现异常时系统自动抛出异常
php中的错误发生时可以自动调用错误处理器
php进阶
http协议(83-88)
1,http协议是建立在 tcp/ip协议的基础上2,我们的web开发,数据的传输都是建立在http协议上的3,http协议全称超文本传输协议
超全局变量$_SERVER
$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。(在这个超全局变量$_SERVER['此处有数组索引(具体索引意义看手册)'])
页面的跳转:
header(“Location:demo.php”)
http中的请求方式:
GET、POST、HEAD、OPTIONS、DELETE、TRACE、PUT,其中最常用的时候GET和POST
GET和POST的区别:
1,安全性上,GET请求的数据会显示在地址栏中,POST请求的数据会放在http消息体里
2,可以从提交数据的大小看
3,由于上面提到的GET请求数据会放在地址栏中,所以需要收藏书签时使用GET请求会更好些2.1,http协议本身是没有限制数据的大小的
2.2,限制数据的大小是浏览器对GET和POST的限制,一般上限制GET请求数据为:2K+35,对POST没有限制,因为POST请求数据是放在消息体中的而GET请求数据是放在地址栏中的,所以浏览器对GET请求的数据做出了大小限制
http状态行(状态码)
php数据库编程
php有三种方式操作mysql数据库
1,mysql扩展库:
mysql扩展库是php程序中的一个专门存放操作mysql数据库函数的库
2,mysqli扩展库
3,pdo
环境搭建:
启用mysql扩展库,在php.ini文件中去配置mysql扩展库(extension=php_mysql.dll即为启用 ;extension=php_mysql.dll为没有启用)
可通过函数phpinfo()--输出关于php的配置信息
对于下载http表头信息设置
drop database database1 //删除整个数据库
drop table test //删除表的数据和结构
delete table test //删除表的数据
MD5(‘xxx’) 加密
对于mysql客户端汉字添加乱码处理
SQL语句不区分大小写,但数据库和表的名称是区分大小写的
php连接数据库:
mysql扩展库操作mysql数据库步骤如下:
1,获取链接$conn=mysql_connect("localhost/127.0.0.1","root","root");
第一参数:MySQL 服务器名称。可以包括端口号,例如 "hostname:port",第二个参数:mysql服务器用户名第三个参数:用户密码例如:
$conn=mysql_connect("localhost","root","root");if(!$conn){
die("连接失败".mysql_error()) //mysql_error()函数显示连接失败错误信息
}else{
echo "连接成功";
}
2,选择数据库
$ret=mysql_select_db("数据库名",[$conn])
mysql_select_db() 设定与指定的连接标识符所关联的服务器上的当前激活数据库。如果没有指定连接标识符,则使用上一个打开的连接。如果没有打开的连接,本函数将无参数调用 mysql_connect() 来尝试打开一个并使用之。
第一个参数:数据库名第二个参数:可以不写,MySQL 连接。如不指定连接标识,则使用由 mysql_connect() 最近打开的连接。如果没有找到该连接,会尝试不带参数调用 mysql_connect() 来创建。如没有找到连接或无法建立连接,则会生成E_WARNING
级别的错误。
3,设置操作编码mysql_query("set names utf8");保证我们php程序是按照utf-8码操作的4,发送指令sql(ddl 数据定义语句,dml 数据操作语言 【update、insert、delete、】,dql(select),dtl 数据事物语句 rollback,commit....)$sql="select * from 表名 where xxx=xx";$res=mysql_query($sql,[$conn]); //mysql_query — 发送一条 MySQL 查询
第一个参数:sql语句第二个参数:选填,可以不填,和上面的意思一样;例如:
$result = mysql_query("SELECT my_col FROM my_tbl")
or die("Invalid query: " . mysql_error());
5,接受返回结果6,释放资源,必须当$res是资源类型时mysql_free_result($res)关闭连接mysql_close($conn); //可以没有,建议有,如果有和没有系统都会在一段时间后关闭
2,mysqli扩展库:mysql(mysql improve )mysql 扩展库的增强版
1,mysql扩展库 和 mysqli 的比较
1.1,mysqli 的稳定性、安全性和效率有所提高
1.2,mysqli 支持面向对象编程,同时也向前兼容 提供了面向过程的编程;也就是说以前的mysql 是面向过程的
mysqli 提供了两套库:面向对象函数库 和 面向过程函数库;其中的函数都是每每对应;
2,mysqli 的入门案例
2.1,配置php.ini 文件 让php支持mysqli扩展库
extension=php_mysqli.dll2.2,建库、建表
程序中的$res代表sql语句执行的结果使用以前的数据库2.3,编写代码
如果执行的是DML语句,则返回bool值如果执行的是DQL语句,则返回的是MySqli_Result结果集对象
mysqli 扩展库中提供四种方式来获取mysqli_result结果集
面向对象 / 面向过程 mysql扩展库
mysqli_result::fetch_row / mysqli_fetch_row mysql_fetch_row
mysqli_result::fetch_assoc / mysqli_fetch_assoc mysql_fetch_assoc
mysqli_result::fetch_array / mysqli_fetch_array mysql_fetch_array
mysqli_result::fetch_object / mysqli_fetch_object mysql_fetch_object
mysqli 中释放结果和内存有三种方式:
面向对象
void mysqli_result::free ( void )
void mysqli_result::close ( void )
void mysqli_result::free_result ( void )
面向过程:
mysqli_free_result
php 中超全局变量:9个
$_GET 通过GET方法传递给该脚本的变量数组
$_POST 通过POST方法传递给该脚本的变量数组
$_REQUEST 所有用户输入的变量数组,包括$_GET、$_POST、$_COKIE
$_FILES 与文件上传相关的变量数组
$_ENV 环境变量数组
$_COKIE cookie变量数组
$_SESSION 会话变量数组
$_SERVER 服务器环境变量数组
$GLOBALS 所有全局变量数组
1,$_GET
1.1,检查是否接受到数据时,使用isset()或empty()函数,最好使用empty()
例如:if(empty($_GET['name'])){
。。。
} else{。。。。。}
1.2,注意汉字在不同浏览器中乱码,特别是IE5.5、IE6
3,$_REQUEST 所有用户输入的变量数组,包括$_GET、$_POST、$_COKIE
由于$_REQUEST可以接受上面三种方式提交的数据,$_GET方法还可以在地址栏中注入,所以得到的这个变量数据不可信
当不清楚页面是以什么方式提交的时,我们可以使用$_SERVER['REQUEST_METHOD']方法来判断
不过一个来说我们是清楚自己的页面是什么方式提交的,很少用到
MVC设计模式
控制器(Control)设定原则:
我们没有必要每一个请求,就对应一个控制器,可以把同一逻辑的请求,提交给一个控制器即可
session和cookie是最重要的用户行为跟踪技术
cookie:
bool setcookie ( string $name
[, string $value
[, int $expire
= 0 [, string $path
[, string $domain
[, bool $secure
= false [, bool $httponly
= false ]]]]]] )
1,第一个参数$name 第二个参数 $value 也就是 一个key对应一个value cookie可以保存多个keyvalue对
2,cookie 第三个参数(time()+3600) time()表示格林威治时间,加上一个预定结束cookie的时间秒数,
注意:如果没有正确设置时间或者没有设置时间,cookie是不会保存到客户端的
3,cookie能够保存的信息就是字符串
4,cookie保存是以明文的方式保存,所以一些敏感信息使用cookie不好
5,cookie保存的中文文件会使用url进行编码,所以在保存的文件中看不到中文,可以使用urldecode进行解码
6,对于多个
setcookie("","",time()+3600);
setcookie("","",time()+600);
setcookie("","",time()+60);
虽然保存在同一个网站的cookie文件中,但是每一个失效的时间可以不一样,根据自身的设置;
session是服务器端的技术
使用session前必须首先初始化:session_start()
session_start();
session_unset();
session_destroy(); //如果没有安全退出(手动退出) 服务器端的session会等待垃圾回收机制 删除
session默认1440s失效 也就是24min 可以在php.ini中配置