PHP
php教学笔记
========================================
学习章节:
变量
常量
运算符
流程控制
函数
数组(超全局数组)
字符串
正则表达式
类与对象(面向对象)
名字空间
gd库
文件操作
mysql
数据库驱动
cookie
session
memcache
laravel框架
----------------------------------------------
变量
$name="zhilei";
1)变量的命名规则
2)变量的数据类型(8种)
一.标量
string
int
flat
boolean
二复全类型
array
object
特殊类型
source
null
变量的判断:
is_int()
is_string()
is_array()
is_object()
is_float()
is_null();
is_boolean()
is_callback()
变量的数据类型转换
1.自动转换
1)if(){} 放到if()中的话都会转为boolean类型
2)运算 $name="10abc" echo $name+10; 则会将$name转为整型
3)字符串运算符"." 自动转为字符串
2.强制转换(复制性的操作,转生成一个新的数据,只不过值是相同的,但数据的类型不同)
$str="zhilei";
(int)$str
(string)$str
(float)$str
(object)$str
(array)$str
(boolean)$str
3.变量的引用
$name="zhilei";
$newname=&$name;
$newname="zongbin";
echo $name; //zongbin
echo $newname; //zongbin
常量:
(常量的声明:名称一定要大写)
1.声明:
define("NAME","zhilei");
echo NAME;
2.确定常量是否存在
defined();
var_dump(defined("HOST"));
预定义常量:(1.系统定好2.随环境变化而变化)
1.__LINE__
2.__FILE__
3.__DIR__
4.__FUNCTION__
5.__CLASS__
6.__METHOD__
7.__NAMESPACE__
运算符:
分类:
1)一元运算符
2)二元运算符
3)三元运算符
1.一元运算符
$a++
++$a
$a--
--$a
$a+=3
$a-=3
$a/=3
$a*=3
$a%=3
2.二元运算符
1)算术运算符
+,-.*,/,%
2)赋值运算符
= != += -+ /= %= *=
3)比较运算符
> < >= <= != === !==
4)字符串运算符
.
5)逻辑运算符
&& || !
6)运算符优先级
1.遵守运算规则
2.()可以改变优先级
3.三元运算符
$name=$name?$name:"zhilei";
流程控制:
if(){}else{}
switch(){}
while()
for()
foreach()
include / include_once
require / require_once
goto
计算数组的长度
count($arr);
函数篇:
自定义
参数
返回值
匿名函数
判断是不是一个函数
变量的作用域
引用函数
递归函数
闭包函数(closures) use关键字
静态变量
回调函数
自定义函数
function(){}
函数参数
funciton($a,$b);
可变参数
func_get_args();
func_get_arg();
func_num_args();
反回值
function (){reutrn "aaaa";}
判断一个函数是否存在
function_exists("函数名");
变量的作用域
1.局部变量
声明在函数内部的变量称为局部变量
2.全局变量
声明在函数外部的变量叫全局变量
3.如果局部变量想引入全局变量的话
global(关键字)
引用函数:函数的参数为一个变量的引入.这要的话,实参与形参会一起发生变化
function one(&$a){
$a++
}
$num=100;
one($num);
echo $num; //结果为101
静态变量
1)在函数的内部用static修饰一个变量,则这个变量的值为持续保存的初使化静态段中
2)功能:通过用来测试函数被调用的次数
回调函数:一个函数参数是一个匿名函数
声明:
function test($a,$b,$c){
return $c($a,$b);
}
调用:
echo test(10,23,function($i,$j){
return $i+$j;
});
递归函数:
1)递
2)归
例:
function one($i){
echo $i."<br>";
if($i>0){
one($i-1);
}else{
echo "<hr>";
}
echo $i;
}
$num=10;
one();
闭包函数
定义:函数内部的匿名函数调用该函数内部的变量
使用关键字:use
function test(){
$a=100;
$one=function($str) use(&$a){
echo $str."<br>";
$a++;
};
return $one;
}
$fun=test();
相当于$fun=$one();
$fun();
这样的话函数内部的变量没有被释放掉 [重点]
数组篇:
数组定义与数组赋值
数据遍历
超全局数组
数组键值操作与排序函数
数据拆分,合并,格式化
数组定义:
1.$arr=array();
2.$arr[]="user1";
3.$arr=[3,4,5];
数组的种类
1.索引数组
下标为数字的
2.关联数组
下标为英文字母的(类似于json)
数组的取值(数组取舍一定要带下标)
$arr=array(3,34);
echo $arr[0];
下标规则:
如果一个混合的数组,索引部分元素的下标是前一个索引元素下标+1
数组元素删除:
unset($arr[0])
数组遍历
for()
foreach()
list() 只能将索引数组中的值取出来
each();
数组的整体输出
print_r();
var_dump();
所有引用的数组的函数(就是将原来的值也改变了)
1.array_splice();
2.sort();
数组中元素增删改查
数组尾操作
array_pop($arr) //返回值
array_push($arr,""); //返回总元素的个数
数组头操作
array_shift($arr); //返回值
array_unshift($arr,"");//返回元素的总个数
数组元素的查找
array_slice() //起点下标到终点下标,但不包括终点
array_splice(); //起点下标然后
arrar_serch();
超全局数组
$_POST
$_GET
$_SERVER
$_REQUEST
$_FILES
$_SESSION
$_COOKIE
$GLOBALS
传值
$_GET
$_POST
超全局数组$_SERVER (注意:这个下标必须是大写)
服务器的域名
SERVER_NAME
服务器的ip地址
SERVER_ADDR
服务器的端口
SERVER_PORT
请求的方法
REQUEST_METHOD
请求的url
REQUEST_URI 注意:是大写的i而并不是L
请求的时间
REQUEST_TIME
请求的客户端的cookie
$_SERVER["HTTP_COOKIE"];
请求的客户端的浏览器
$_SERVER["HTTP_USER_AGENT"];
请求的缓存的时间
$_SERVER['HTTP_CACHE_CONTROL'];
远程ip
REMOTE_ADDR
服务器端所有的信息
$_SERVER['SERVER_SIGNATURE'];
接收的字符集
$_SERVER['HTTP_ACCETP_LANGUAGE'];
请求的连接方式
$_SERVER['HTTP_CONNECTION'];
将,?\转义
addslashes()
去掉转义
stripslashes();
将html当正常的文本输出,并不会产生标签的作用
htmlspecailchars("<h1>监控中心</h1>")
将字符串的标签显示作用
htmlspecialchars_decode("<h1>监控中心</h1>");
将字符串的中\n换行转换成<br>
nl2br("this\nnien");
超全局数组$_COOKIE与$_FILES和$_SESSION $GLOBALS
$_FILES
追踪用户信息(其实就是让一个数组在多个页面中调用)
$_COOKIE
$_SESSION
$GLOBALS
1.全局的数组.时面包含$_COOKIE,$_SESSION,$_GET,$_POST,变量等
2.变量名作为一它的一个键
_GET
_POST
_COOKIE
_FILES
_ENV
_SERVER
_REQUEST
[GLOBALS]
如声明一个变量$username 则username会变成$GLOBAS一个键
数组过滤与排序
array_count_values() //统计数据中值出现的个数
array_unique() //删除数组中的重复值,相当于sql中的distinct
数组的拆分,合并,分解
1.过滤
array_filter($arr,$callback);
2.对于数组内每人元素进行操作如乘除这样,如果是两个数组,则是对两个数组的中和每一对元素进行操作,回调函数放在前面
array_map($callback,$arr,$arr1);
3.数组合并
一.array_merge();
1)如果是关联的数组,键名如果一样的话则后面的数组的将覆盖前面的数组.
2)如果是索引数组的话,则并不会产生覆盖现象
3)如果两个都是索引的数组的话,则后面数据的键会从第一个数组的最后一个键后累加
二.array_combine();
1)对于两个数组的值进行操作,并组成一个新的数组,第一个数组值作为下标,第二个数组的值作为新的值.
2)说明:这两个被操作的数据的元素的个数一定要一样
数组中个数计算
计算一个数组中值的个数,如成一个新的数组,值为新下标,个数新值
array_count_values($arr);
去掉数组中重复的部分
array_unique();相当于mysql中的distinct
将关系数组转换成一个索引数组
array_values();
将数组中的键取出来,组成一个新的索引的数组(操作关联数组较多)
array_keys($arr,"element",true||"===");
1)以被操作的数组的键为元素,组成一个新的索引数组.
2)如果有第二个参数,则是取出被操作数组中具体的哪个元素的键
3)如果第三个参数为 true或者是"==="则表示,被操作的数组中被取出来的的元素的数据类型一定相同
判断一个值是否在一个数组中
in_array()判断一个值在不在一个数组中,如果在的话则返回值 ,是否返回假
1)in_array(value,$arr,true);
array_search()判断一个值在不一个数组中,如果在的话,则返回该元素的键,是否返回假
2)array_search();
$_POST['username']="zhilei";
$_POST['password']=md5("123");
$_POST['height']="30";
$_POST['age']=30;
echo "<pre>";
print_r(array_search(30,$_POST,true));
echo "</pre>";
数组的和与差
array_sum();
array_diff()
数组的切割都是开始位置到长度
array_slice()
array_splice()
数组的键值调换
array_flip();
说明:如果被操作的数组中有两个一样的值,则调换过来后,后面的一个值,将作为最终的下标
将数据的元素的顺序调换
array_reverse()
说明:如果索引下标的话,则键并不会随着元素走
创建一个数组(第一个是开始的键,第二个参数是长度,第三个参数是值)
array_fill(0,4,"one");
print_r(array_fill(4,5,"one"));
Array ( [4] => one [5] => one [6] => one [7] => one [8] => one )
计算数组的交集组成一个新的数组
array_intersest();
array_unintersect();
注意:只对比元素的值,并不对比元素的键
计算数组中交交集同时也对比键
array_intersect_assoc()
array_unintersect_assoc()
用值将数组扩大到指定的长度
array_pad($arr,length,value);
array_repeat()
将数组的顺序打乱 从新的冼牌 这个函数的前面没有array标识
shuffle()
从数组中随机的取出一个键的值
array_rand()
range()生成一个范围内的数组
数组的排序
sort()
rsort()
ksort()
krsotr()
natsort()
natcasesort()
array_multisort()
数组与字符串之间的转换
implde($arr,"") 别名是join();
explode()
字符串与日期与数学函数
1.字符串的定义
$str="sineinl";
2字符串的输出
echo
print
printf
sprintf
var_dump()
print_r()
字符串的处理函数
1.与html标签相关的处理函数
nl2br()
htmlspecailchars()
htmlspecaichars_decode()
strip_tags()
addslashes()
stripslashes()
2.与空格相关处理的函数
trim()
ltrim()
rtrim()
3.字符中的常用的函数
strrev()
strlen()
strtoupper()
strtolower()
str_repeat()
str_shuffle() 这个并不是一个引用性质的操作,而数组的是引用操作
str_pad()
substr()
str_spit($str,"多少个一分割"); str_spilt("seintet","2");
mb_substr() 可以指定字符集
number_format($str,保留小数长度,"小数与整数的连接符号","整数间的连接符号");
将字符串添加到批定的长度,与数组一样第一个参数是操作的字符串对象 ,第二个字符中是长度,第三个字符中是要被填充的内容,第四参数是位置,有三个值
STR_PAD_LEFT
STR_PAD_RIGHT
STR_PAD_BOTH
str_pad()
basename(); //返回一个url中的访问的文件名
dirname(); //返回一个url中的路径部分
$_SERVER['QUERY_STRINT'] //返回一个url中的查询的部分的内容
parse_url()
pathinfo()
parse_str() //将查询的内容转为一个变量来读出或者是赋给第二个变量,这个变量作为一个数组来接收值
字符串本身的分割,查找,替换
str_split()
str_replace()
echo str_replace("/","-",$str);
返回某个值第一次出现的位置.
strpos()
返回某个值最后一次出现的位置
strrpos()
pathinfo(); (url中不带查询条件)
1)返回一个数组,键有basename dirname extension filename
parse_url
1)返回一个数组,scheme(协议) host,path,query
$str="http://www.jd.com/one/index.php?name=zhilei;age=19";
echo "<pre>";
print_r(parse_url($str));
echo "</pre>";
Array
(
[scheme] => http
[host] => www.jd.com
[path] => /one/index.php
[query] => name=zhilei;age=19
)
字符串的转换
strtoupper()
strtolower()
时间与字符串之间的转换
strtotime()
将时间转换为时间戳
strtotime("2016-12-02")
php正则表达式
1.定界符
//
2.原子
a-z
A-Z
0-9
[0-9]
[a-z]
[^a-z]
^
$
\s \s
\d \D
\w \w
\b \B
3.元字符
*
?
+
{3}
{3,7}
{3,}
()
$1 或者是 \\1
4.模式修正符(imU)
i忽略大小深情
m:多行查找
U:去除贪婪模式
与正则有关的函数
preg_match("正则","要处理的字符串","放到一个数组中")
preg_match_all()
preg_replace("正则","替换成什么",要处理的字符串)
preg_spit("正则","要处理的字符串");
preg_grep("正则","要处理的字符串")
数学函数
round()
rand()
mt_rand();返回一个小于2cpu位数次方的随机数
ceil()
floor()
max()
min()
日期对象
time()
strtotime() //将字符串改变时间戳
mktime() //将时间改成时间戳
date()
设置和获取默认的值
date_default_timezone_set()
date_default_timezone_get()
date参数:
Y 四位年数
y 两位
m 月份
M 月份的英文版
d 日期
D 周几英文(缩写) l(全称)
w 周几数字
H 24小时
h 12小时
t 一个月的个数
T 代码时间
L时间操作函数
获取默认的时间
date_default_timezone_get();
设置默认的时区(中国是prc)
date_default_timezone_set(); 是不是闰年
实例:
万年例制作 :
错误与错误及别
notice //如未声明变量 下面的内容可以执行
warning //如函数内未传参,或者是传参错误 下面的内容可以执行
deprecated //如弃用的一些东西 下面的内容可以继续执行
error // 语法错误 下面的内容也继续执行
parse //语法错误 下面的内容也不能继续执行
改变报警级别的的方法:
error_reporting();
| 代表要报出来的及别
&~ 是除了=^ 除了
E_ALL 或者0 代码所有的报警内容都会报出来
E_NOTICE 只报这个
E_NOTICE | E_WARNING 报notice 或者是warning
图片函数:(四节课时)
实现目标:
1.验证码
2.图片的缩放
3.水印
图片相关的函数:
gd_info() //查看gd库相关的信息
// 制作一个画布
$img=imagecreatetruecolor(500,300);
// 给这个画布分配一个颜色
$black=imagecolorallocate($img,0,0,0);
$white=imagecolorallocate($img,255,255,255);
$red=imagecolorallocate($img,255,0,0);
$blue=imagecolorallocate($img,0,191,255);
// 给这个画布填充颜色
imagefill($img,0,0,$black);
// 定义输出的头
header("content-type:image/jpeg");
// 输入这个图片,如果有第二个参数的话,则并不会输出,而在保存下来这张图片
imagejpeg($img);
//销毁一个图片资源
image_detroy($img);
详细图形的函数
imagesetpixel() //画一个点
imageline(); //画一条线段
imagedashedline() //画一个虚线
imagepolygon() //画一个多边形 第二个参数是一个座标数组,第三个参数是边的个数
imageretangle() //画一个矩形
imageellipse() / imagefilledellipse() //画一个㮋圆
iamgearc() //画一个㮋圆的弧
imagefttext() //写入字体
保存图片的格式
imagejpeg()
imagegif()
imagepng()
取得一张图片作为画布
imagecreateformjepg()
imagecreateformgif()
imagecreateformpng()
取得一个资源的高与宽
imagesx()
imagesy()
直接获取路径资源的长写宽,并不用先制作画布
getimagesize();
图片缩放:
imagecopyresampled();中间的四个座标最好都高为零
参数:
imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h );
代码实例:
<?php
// 这个文件
$filename = 'logo.jpg';
$percent = 0.2;
// 内容类型
header('Content-Type: image/jpeg');
// // 获取新的尺寸
list($width, $height) = getimagesize($filename);
$new_width = $width * $percent;
$new_height = $height * $percent;
// // 重新取样
$dst_img= imagecreatetruecolor($new_width, $new_height);
$src_img= imagecreatefromjpeg($filename);
imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
// // 输出
imagejpeg($dst_img);
?>
================================================================
水印函数:
imagecopy()
语法:
bool imagecopy ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h )
实例:
<?php
//为背景图片添加图片水印(位置随机),背景图片格式为jpeg,水印图片格式为gif
function watermark($filename,$water){
//获取背景图片的宽度和高度
list($b_w,$b_h) = getimagesize($filename);
//获取水印图片的宽度和高度
list($w_w,$w_h) = getimagesize($water);
//在背景图片中放水印图片的位置随机起始位置
$posX = rand(0, ($b_w-$w_w));
$posY = rand(0, ($b_h-$w_h));
//创建背景图片的资源
$back = imagecreatefromjpeg($filename);
//创建水印图片的资源
$water = imagecreatefromjpeg($water);
//使用imagecopy()函数将水印图片复制到背景图片指定的位置中
imagecopy($back, $water, $posX, $posY, 0, 0, $w_w, $w_h);
//保存带有水印图片的背景图片
imagejpeg($back,$filename);
imagedestroy($back);
imagedestroy($water);
}
$logo="logo.jpg";
$jd="jd.jpg";
watermark($logo, $jd);
?>
实例制作:
1.验证码
2.图片缩放
3.水印
文件处理:
---------------------------------------------
1.文件判断
is_file()
is_dir()
is_link()
is_writeable()
is_executable()
is_readable()
2.获取属性函数:
filesize()
目录处理
1.删除目录
2.目录遍历
类与对象:
---------------------------------------------
类声明
生产对象
面向对象三大特点:
1.重用性 2.灵活性 3.扩展性
面向对象的三大技术
1.封装 2.继承 3.多态
public protected private
抽象类
接口
类常量 const
关键字 static
与类有关的函数
mysql库:
---------------------------------------------
1.数据库的认识 (所有的数据库及数据库引擎)
2.mysql的安装 (linux && window)
3.建立库,表,以及数据类型
4.修改库,表
5.数据增, 删 ,改 ,查
[数据库高级查询的条件]
6.索引
7.索引的增,删 ,改,查
8.数据库的聚合函数(其它的常用的函数)
9.多表查询
1.普通查询
3.嵌套查询
4.链接查询
1)左链接
2)右链接
3)内链接
普通查询:
mysql> select class.name,count(user.id) from user,class where user.class_id = class.id group by class.id;
+--------+----------------+
| name | count(user.id) |
+--------+----------------+
| 一班 | 1 |
| 二班 | 2 |
| 三班 | 2 |
+--------+----------------+
3 rows in set (0.02 sec)
嵌套查询:
+----+----------+-------+----------+
| id | username | score | class_id |
+----+----------+-------+----------+
| 1 | user1 | 20 | 1 |
| 2 | user2 | 40 | 2 |
| 3 | user3 | 76 | 2 |
| 4 | user4 | 60 | 3 |
| 5 | user5 | 60 | 3 |
+----+----------+-------+----------+
5 rows in set (0.00 sec)
mysql> select username from user where score in(select max(score) from user);
+----------+
| username |
+----------+
| user3 |
+----------+
链接查询:
1)从0开始
0,2 0,1
2,2 2,3
4,2 4,5
每页显示的个数*(页数-1)
10.高级篇-> sql编程:
1)数据库变量,常量
2)运算符
3)流程控制
4)函数
5)视图
6)存储过程
7)事件
11.维护篇(DCL)
1)数据库的备份
2)数据库的授权
3)主从复制
4)性能优化
PDO:
--------------------------------------------
$pdo=new PDO("mysql;host=localhost;dbname=work","root","kkk");
返回一个数据对象
$smt=$pdo->query("select * from user");
将数据对象转换成数据组
$smt->fetchAll(PDO::FETCH_ASSOC)
PDO::FETCH_ASSOC 关联数组
PDO::FETCH_NUM 索引数组
PDO::FETCH_BOTH 默认的两个都有
PDO::FETCH_OBJ 转换成对象
实例:分页类实例
1.PDO类
2.pdo预处理类
3.pdo异常类
pdo(php data object)
dsn(data source name)
pdo链接mysql
$pdo=new PDO("mysql:host=localhost;dbname=test","root","kkk");
设置客户端的字符集
$pdo->exec("set names utf8");
pdo类
$pdo->exec() #执行增,删,改
$smt=$pdo->query() #执行查询语句 ,返回的是pdostatment对象
$pdo->setAttribute() #设置pdo属性
$pdo->getAttribute() #获取pdo属性
$pdo->prepare() #预处理一条Sql语句
$pdo->lastInsetId() #获取最后一次插入的id号
预处理类
$smt->fetchAll() #将查询出来的数据转换成一个二维数组. 参数: PDO::FETCH_ASSOC/NUM/OBJ/BOTH
$smt->fetch() #查询出来一行的数据
$smt->execute() #执行sql语句
$smt->rowCount() #返回执行的影响行数
#smt->bindValue() #绑定值 (注意数据类型)
如果想开启事务机制的话则要提前开启报错的机制:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
◦PDO::ATTR_ERRMODE:错误报告。
◦PDO::ERRMODE_SILENT: 仅设置错误代码。
◦PDO::ERRMODE_WARNING: 引发 E_WARNING 错误
◦PDO::ERRMODE_EXCEPTION: 抛出 exceptions 异常。
第二:
事务机制:
如果想开启事务机制的话,则要提前将这个模式打开,否则的话则并不会报任何的错误
#$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
配合try{}catch(PDOException $e){
两个方法
$e->getMessage() #获取错误的内容
$e->getLine() #获取错误的行
}
$pdo->beginTransaction()
$pdo->commit()
$pdo->rollBack()
-------------------------------------------
session
------------------------------------------
$_SESSION
作用也是跟踪用户信息
过程:
服务器创建->发送给客户的浏览器并保存的cookie中,或者是url地址中
(保存的内容为一个唯一标识uid)(用户id身份)
说明:
如查客户端想与服务器进行交流的话,首先建立一个验证
(相当于在一个商场办理一个全场的会员卡一样,要进行身份验证与发卡给你)
1)提出办卡需求
session_start();
2)登记信息与充值金额
3)在任何一家店铺购买需求
session_start()
4)核实身份金额(相当于查看用户信息)
设置与获取uid(这个是会话的身份码,要在有客户无风需求的前准备好)
session_id("")
说明:
执行session_start()功能:
1.如果是第一次执行的话,则是发放身份码,并及时的使用身份码
2.如果是第二次执行的话,则是验证身份码
释放会话
1.unset($_SESSION['username']);
2.session_destroy(); 临时的清理掉session中的数据而已
session中的函数
session_save_path()
session_id()
session_start()
session_unset()
session_name()
session_unset()
//保留原来的session值,但是不再允许再赋值
session_abort()
session_commit()=session_write_close();
将session值进行编码
session_encode()
session_decode()
重新生成sessionid
session_regenerate_id();自动生成
设置或者是读取缓存限制器
session_cache_limiter()
session_set_cookie_params()
cookie
------------------------------------------
$_COOKIE
1.设置setcookie($name,$value,$expir,$path,$domain,$secure,$httponly)
2.如果想让中文不编码的话则要用setrawcookie(),具体的用法跟上面的一样
3.设置cooke有一个作用的目录范围,默认是在当前的目录中以及这个目录的子目录可以使用.如果想让这个cookie值在所有的目录中都能使用,则要用"/",
4.cookie的清除,在哪个目录中设置就要在哪个目录中清除,因为在服务器上面就是保存在这个目录中的
5.当你的cookie值并不是你本身所设定的,而是通过第三方的单点登录这样的方式,则我们清除cookie是没有用的,必要要清除这个域名下面的cookie而这个时候一定要加第五个参数就是$cookie
6.如果$secure设置为true则说明这个cookie值读不出(也就是说只能通过https访问)
7.如果httponly设置为真的时候 ,则cookie值只能服务器端能输出,而客户端语言比如js就不能输出
模拟用户登录与登出
-------------------------------------------
在php中"===",是恒等的意思,1,值不等,2.数据类型要相同
名字空间
文件处理