php笔记
导读
- wamp
- 集成开发环境
- w:windows 操作系统 mamp lamp
- a:apache 服务器 // 提供某种特定功能的代码块 web服务器 发送/接收请求
- m:mysql 数据库服务 // 关系型/非关系型 (MongoDB) 关系模型
- p: php 是运行在服务器端的脚本语言
- 静态网页
- 没有链接数据库的网页
- 动态网页
- 链接数据库,数据库中获取数据
服务器如何处理用户请求
当在地址栏键下地址的时候,浏览器会结合我们的软硬件,将http请求发送到网络中,服务器接收到我们的请求,开始处理我们的请求,请求的资源分为静态资源和动态资源,静态资源像:.html, .css, .js等这些后缀名的文件,动态资源像.php,.java等这些资源,服务器碰到请求是静态资源会直接返回,碰到动态资源会先解析,php文件最终输出的内容将会交给服务器,最后服务器返回输出的内容,当浏览器接收到返回的内容,开始绘制,碰到href,src,url这些东西的时候,会再次向服务器发送请求,最终呈现整个页面
静态资源 .html .css .js .jpg .gif .png 以字符串的形式直接返回,不做处理
动态资源 .php .jsp (php)解析器处理文件 把echo的东西返回
php
php是什么?
超文本预处理语言,运行在服务器端,能和html进行嵌套用于制作动态网页的语言
php特点
- 运行在服务器端的脚本语言
- 能支持绝大部分的操作系统
- 能支持大部分的服务器 apache IIS
- 能支持大部分的数据库 mysql sql sever Access
- 能操作数据库
- 能操作文件
- 能操作图片
- ...
php基本语法
exit 结束运行 可以用来调错
die() 结束运行
变量和常量
输出php的两种方式
1. echo 输出字符串
2. var_dump() 输出类型和值
错误的几种情况
1. error 致命性的错误 停止执行
2. notice 错误 继续执行
3. warning 错误 继续执行
定义变量
$str = '123';
var_dump($str); //string '123' (length=3)
定义常量
// define("PI", 3.14);
const PI = 3.14;
var_dump(PI);
常量和变量的区别
- 常量的值不能再改变或者是被删除
- 常量不加$
- 常量只能用const或者是define来定义
- 常量可以在任何位置去访问
- 常量的值不能延迟求值,只能是标量(const 不可以,define可以)
判断变量和常量是否被定义
- 判断一个变量有没有定义用isset()
- 判断一个常量有没有定义用defined()
- 当一个变量值为null的时候。被认为是没有定义
var_dump($nub = null);
var_dump(isset($nub));
const PI = 123;
var_dump(defined('PI'));
删除变量
unset()
$num = 200;
// $num = null;
unset($num);
var_dump($num); //notice null
变量引用 &
$nub1 = 200;
$nub2 = $nub1;
$nub1 = 300;
echo $nub2; //200
-----------------------------------------------------------
$nub1 = 200;
$nub2 = &$nub1;
$nub1 = 300;
echo $nub2; //300
可变变量
$nub = "age";
$$nub = "123";
var_dump($$nub); // string '123' (length=3)
数据类型
4种标量 2种复合类型 2种特殊类型
4种标量
- 整型 int
- 浮点型 float 也作double
- 字符串 string
- . 表示连接 //可以连接两个标量类型,连接成字符串
- ""可以解析变量
$nub = 200; $str1 = "这是一个数字{$nub}nub"; //""可以解析变量 $str2 = '这是一个数字'.$nub; //. 表示连接,可以连接两个标量类型,连接成字符串 var_dump($str1, $str2) //string '这是一个数字200nub' (length=24) //string '这是一个数字200' (length=21)
- 布尔类型 boolean
2种复合类型
数组
-
数组的长度
$arr = array('a', 'b', 'c'); var_dump(count($arr)) ;//数组的长度
-
索引数组
echo "
"; $arr = array("a", "b", "c"); var_dump($arr); /*array (size=3) 0 => string 'a' (length=1) 1 => string 'b' (length=1) 2 => string 'c' (length=1) print_r($arr); /*Array ( [0] => a [1] => b [2] => c )
-
关联数组
$crr = array( 'name' => 'lisi', 'age' => 13 ); /* array (size=2) 'name' => string 'lisi' (length=4) 'age' => int 13
-
二维数组
$brr = array( 'name' => array( 'lisi' => '13', 'zhangsan' => '24' ), 'age' => 18 );
-
遍历方式
for ($i=0; $i < count($arr); $i++) { var_dump($arr[$i]); }
$arr = array('name' => 'lisi', 'age' => 13); foreach ($arr as $key => $value) { var_dump($arr[$key]); //lisi 13 var_dump($key); //name age var_dump($value); //lisi 13 }
对象
2种特殊类型
- null //函数默认返回值 变量未定义 unset()
- resource
- 引用
- is_resource() //判断是否是资源
获取、判断、转化类型的方式
-
获取类型
- gettype()
-
判断类型
- is_int
- is_integer
- is_float
- is_double
- is_string
- is_bool
- is_array
- is_object
- is_null
- is_resource
-
类型转化
-
val
- intval()
- floatval()
- doubleval()
- strval()
// 将true转化为1,将false转化为'';
- boolval()
// false 0 '0' '' null 空数组
-
强制类型转化
$nub = '123'; $result = (int) $nub; var_dump($result); //int 123
settype //不建议 因为会改变原来的类型
-
对象
js:属性和方法
PHP:成员变量和成员方法
面向过程\对象编程
-
面向过程编程
一个功能对应一个函数,需要什么样的功能,写什么样的函数
-
面向对象编程
将整个项目中的每一部分抽象为一个对象,只需关注对象和对象之间的联系,然后实现对象的成员方法,从而构建整个项目
对象和类的关系
类是对象的抽象
我们将具有某种相似特征的对象的基础上,抽象为一个用来描述或者用来创建这些对象的类,所以我们说类是对象的抽象,比如说,我们将所有的人的特征抽象为人类的这个概念
对象是类的实例化
有了包含一些特征的抽象出来的类以后,那么我们可以通过这个类,去创建对象,所以说对象是类的实例化,比如说小明是人类的一个实例
封装、继承、多态
封装
我们将对象的成员变量或者成员方法通过一些关键字,比如 public private protected 等去封装在类的内部,只留和外界的接口
- 强内聚 //我们倾向于将更多的方法或者是变量封装在类的内部
- 低耦合 //我们倾向于将更少的方法暴露在外部
继承
一个类继承于另外一个类,从而获取这个类的成员变量和方法,通过 extends 去继承
子类 父类
多态
不同的对象调用同一个方法,或者是相同的操作,结果不同,就是多态
实例
常用方法
字符串方法
方法 | 描述 | 例子 |
---|---|---|
strlen() | 字符串长度 | $result = strlen('length'); var_dump($result); // 6 |
explode() | 把字符串分割成数组 | $result = explode('.' , 'aa.jpg'); var_dump($result); // array('aa', 'jpg') |
substr() | 从当前字符串截取指定位置到指定长度的新字符串 | $str = 'dfsdg'; $result = substr($str,-3,1); var_dump($result); // 's' |
mb_substr() | 字符数 可以转化编码 | $str = '字符串';$result = mb_substr($str,3,1,'utf8'); var_dump($result); // '符串' |
strstr() | 返回从当前字符串中匹配到的第一个字符之后的字符串 | $str = 'fghg'; $result = strstr($str,'h',true); var_dump($result); // 'hg' |
strpos() | 查找指定字符首次出现的位置,返回索引值 | |
strrpos() | 查找指定字符最后一次出现的位置,返回索引值 | |
str_replace() | 替换 (字符串和字符串,数组和字符串) | |
str_ireplace() | 替换,不区分大小写 | |
md5() | 计算字符串的 MD5 散列 用于加密 | |
strrev() | 反转字符串顺序 | |
strtolower() | 小写 | |
strtoupper() | 大写 | |
trim() | 去两端空格 | |
rtrim() | 去右端空格 | |
ltrim() | 去左端空格 |
数组方法
方法 | 作用 | 例子 |
---|---|---|
array_push() | 在数组后面推入新项 | `````` |
array_pop() | 删除数组最后一项 | |
array_shift() | 删除数组前面一项 | |
array_unshift() | 在数组前面推入新项 | |
array_sum() | 数组项求和 | |
array_merge() | 合并数组 如果有相同的键值那么后者就会覆盖前者 | |
array_unique() | 去重 | |
array_rand() | 随机取键 在一个数组中取随机的键,如果取多个,返回的是键组成的数组 | |
in_array() | 判断某个值在不在数组里 是否启用全等 | |
array_search() | 查找某个值对应的键 返回索引值 若找不到返回false | |
array_key_exists() | 判断某个值是不是数组的键,在返回true,不在返回false | |
array_filter() | 筛选 返回值是新数组,接收回调函数 | |
array_walk() | 遍历 将每一个值都执行一个函数 | |
array_map() | 映射 | |
array_keys() | 键组成数组 如果有第二个参数,那么只会返回与第二个参数匹配的键 | |
array_values() | 返回 值组成的数组 | |
sort() | 升序 会影响原数组 | |
rsort() | 降序 | |
asort() | 升序 键不重排 | |
arsort() | 降序 键不重排 | |
ksort() | 按键 升序 | |
krsort() | 按键 降序 |
Math方法
方法 | 作用 | |
---|---|---|
abs() | ||
ceil() | ||
floor() | ||
max() | ||
min() | ||
round() | ||
mt_rand | 随机数 | |
pow() | 返回 x 的 y 次方 |
函数
参数
- 如果定义了形式参数,必须传实际参数
- 检测函数是否存在
- 可变函数
作用域
- 全局变量只能在全局访问,局部变量只能在局部访问
- 常量在任何位置都可以访问
- 超全局变量在任何位置都可以访问
- $_GLOBALS
- $_GET
- $_POST
- $_REQUEST //get()方法 post()方法 都可以接受
- $_FILES
- $_SERVER
- $_SESSION 服务器端session
- $_COOKIE
- 在函数内部访问全局变量的三种方式
//第一种方式
$nub = 200;
function fun(&$aa)
{
$aa = 300;
echo $aa; //300
}
fun($nub);
echo $nub; //300
//第二种方式
$nub = 200;
function fun()
{
global $nub;
$nub = 300;
echo $nub; //300
}
fun();
echo $nub; //300
//第三种方式
$nub = 200;
function fun()
{
$GLOBALS['nub'] = 300;
echo $GLOBALS['nub']; // 300
}
fun();
注意
//
header(string: 'content-type:text/html;charset=utf8');
//
echo true; //1
echo false; //null
var_dump((int) 'a'); //0
// 实现代码块复用
include ''; //不建议用
include_once ''; //报warning
require_once ''; //报error
// 回调函数
function callback()
{
return 3;
}
function fun($callback)
{
echo($callback());
}
fun('callback'); //3
// 静态变量
function fun()
{
static $nub = 200; //静态变量
$nub += 1;
echo $nub;
}
fun(); //201
fun(); //202
fun(); //203
时间函数
北京时间 = GMI + 8
方法
-
date_default_timezone_get()
var_dump(date_default_timezone_get()); // string 'UTC' (length=3)
-
date_default_timezone_set()
date_default_timezone_set('Asia/Shanghai');
-
time() // 距离1970年的秒数
-
var_dump(time()) //int 1506652819
-
-
microtime(true) // 微秒
var_dump(microtime()) //string '0.04552800 1506652891' (length=21) var_dump(microtime(true)) //float 1506652947.956
-
getdate() // 当前时间的细节组成的数组
var_dump(getdate()); array (size=11) 'seconds' => int 28 'minutes' => int 43 'hours' => int 2 'mday' => int 29 'wday' => int 5 'mon' => int 9 'year' => int 2017 'yday' => int 271 'weekday' => string 'Friday' (length=6) 'month' => string 'September' (length=9) 0 => int 1506653008
-
date() // 格式化时间
date_default_timezone_set('Asia/Shanghai'); var_dump(date("Y-m-d H:i:s")); // string '2017-09-29 11:07:48'
-
mktime() // 设置时间
var_dump(mktime(8,0,0,8,8,2008)); // int 1218182400 $time = mktime(8,0,0,8,8,2008); $arr = getdate($time); var_dump($arr); /* array (size=11) 'seconds' => int 0 'minutes' => int 0 'hours' => int 8 'mday' => int 8 'wday' => int 5 'mon' => int 8 'year' => int 2008 'yday' => int 220 'weekday' => string 'Friday' (length=6) 'month' => string 'August' (length=6) 0 => int 1218182400 */ $str = date('Y-m-d H:i:s', $time); var_dump($str); //string '2008-08-08 08:00:00' (length=19)
/*a: 'am'
d: 几日,两位数字
D: 星期几,3个英文字母
F: 月份,英文全名
h: 12小时制的小时
H: 24小时制的小时
g: 12小时制的小时 不补零
G: 24小时制的小时 不补零
j: 几日,不足不补零
l: 星期几,英文全名
m: 月份,两位数字
n: 月份,两位数字 不补零
M: 月份,3个英文字母
s: 秒;
S: 字尾加英文序数, ‘21th’
t: 指定月份的天数
U: 总秒数
w: 数字型的星期几 0-6
Y: 年 四位数字
y: 年 两位数字
z: 一年中的第几天; 1-366*/
cookie
cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。
创建 Cookie
setcookie() 函数用于设置 cookie
setcookie() 函数必须位于 标签之前
语法 setcookie(name, value, expire, path, domain); 例子 setcookie("user", "runoob", time()+3600);
取回 Cookie 的值
- PHP 的 $_COOKIE 变量用于取回 cookie 的值
删除 Cookie
- 当删除 cookie 时,您应当使过期日期变更为过去的时间点
// 设置 cookie 过期时间为过去 1 小时
setcookie("user", "", time()-3600);
?>
session
Filesystem 函数
魔术常量
- _dir_ 当前路径
- _file_ 全路径 当前路径+文件名
- _line_ 运行代码的当前行
PHP Filesystem 函数
方法 | 描述 | 例子 |
---|---|---|
basename() | 从一个路径中 返回文件名 | |
dirname() | 从一个路径中 返回路径 | |
file_exists() | 判断文件或者路径存在不存在 | |
is_file() | 判断这是不是文件 只能识别当前路径 | |
is_dir() | 判断这是不是路径 只能识别当前路径 | |
rmdir() | 删除空路径 | |
unlink() | 删除文件 | |
is_file() is_dir() 如果需要认识上一级或是下一级,需要写相对路径
PHP Directory 函数
Directory 函数允许您获得关于目录及其内容的信息
方法 | 描述 | 例子 |
---|---|---|
scandir() | 返回指定目录中的文件和目录的数组 '.' '..' | |
mysql
能够永久存储信息的字段
SQL 结构化查询语言 操作数据库
定义语言
展示库/表:
- show databases;
- show tables;
- show create table aa; // 展示创建表的过程
- show create database 206class; // 展示创建库的过程
- desc 206class // 展示表 \ 库
创建库/表
-
创建库
create database 206class charset utf8 ; //建立新数据库 数据存储有很多种方式
-
创建表
use 206class
mysql> create table student (
-> id tinyint(10) unsigned not null primary key auto_increment,
-> name char(100) not null unique key,
-> grade float(5,2) not null default 0.00,
-> updatetime datetime on update current_timestamp not null
-> ) engine=innodb default charset = utf8;
// 存储引擎(决定存储效率、安全性)innodb[安全性高、效率低] myisam[安全性低、效率高] 字符集
增加字段
alter table student add num char(20) not null;
删除表/库/字段
- 删除表 \ 库
drop database myclass \ drop table student
- 删除字段
alter table student drop num;
修改表名、字段
- 修改表名
use myclass;
rename table aa to user;
- 修改字段
alter table student change grade grades int(10) not null;
alter table student modify grades float(5,2) not null;
alter table student modify updatetime datetime default current_timestamp on update current_timestamp;
操作语言
1. 增
- 插入数据
insert into student (name) values ('小马');
//insert into 表(字段) value (要插入的数据一一对应);
insert into student (name) values ('小员'),('小程');
insert into student (name,grade) values ('小黑',100);
2. 删
- 删除某一行数据 delete
delete from user; //全删除了
delete from user where id = 7;
3. 改
- 更新 update
update user set pass=123 ; // 所有
update user set pass=456 where id=10;
update user set pass=789,username='newuser2' where id=10;
4. 查 80-90%
基本查询
where group by having order by limit
where 查询原字段 having查询筛选结果
查询表中所有数据
use myclass;
select * from student; //select 字段 from 表
where筛选 原字段 查指定数据
-
= >= <= <> > <
select * from student where id>=5;
-
and or between in
select * from student where id>4 and id<5; or select * from student where id between 8 and 10; select * from student where id>=8 and id<=10; select * from user where id in (1,2,10,11);
-
模糊查询
%任意字符 select * from goods where name like '%电'; // 所有以 电 结尾字段 select * from goods where name like '%电%'; // 所有带 电 的的字段 select * from goods where name like '电%'; // 所有以 电 开头的字段 _单个字符 select * from goods where name like '电_'; \ 电 + 一个字符 的字段 select * from goods where name like '电__'; \ 电 + 两个字符 的字段
-
查null
select * from goods where name is null; select * from goods where name is not null;
投影运算
select id,name from student;
select id,name,(shop_price-price)*count as profit from goods;
select id,name, floor((shop_price-price)*count) as profit from goods; // 利润向下取整
select id,name,shop_price-price from goods where shop_price-price>200; //利润超过200
having查询
select id,name,shop_price-price from goods where shop_price-price>200; //重复查询
select id,name,shop_price-price as profit from goods having profit>200; //having
select id,name,shop_price-price as profit from goods where id>4 having profit>200;
max、mix、num、avg、count
// 和id... 不对应
select sum(count) as he from goods;
select min(shop_price) as minval from goods;
select avg(shop_price) as avgval from goods;
select max(shop_price) as maxvak from goods;
select count(shop_price) as countval from goods;
分组查询
select * from goods group by type;
select count(type) from goods group by type; // 每一组的个数
select sum(count) from goods group by type; // 某个列的和
select max(count) from goods group by type; // 某个列的最大值
select max(count),type from goods group by type; // 某个列的最小值 // 查询正确
select max(count),id from goods group by type; // 某个列的最小值 // 查询错误
order查询
select * from goods order by price desc; asc desc(降序)
limit查询
select * from goods order by count desc limit 3;
select * from goods order by count desc limit 4,2; //隔4行取两个 可以用于分页
select * from goods order by count desc limit 10*n,10; //隔10页取10个 用于分页
where子查询
where型子查询是将上一次查询的结果作为条件
select id,name from goods where count=(select max(count) from goods);
select id,name from goods where count in (select count from goods where id>3);
from子查询
from型子查询是将上一次查询的结果作为临时的一张表
select name from (select id,name from goods) as tmp;
select name from (select id,name from goods) as tmp where id > 3 ;
select name from (select id,name from goods where id > 3) as tmp;
exists子查询
select * from goods where exists (select * from goods where id=1); //整个表的数据
select * from goods where exists (select * from goods where id=7); //Empty set (0.00 sec)
连表查询
内链接
作用:根据两个或多个表中的列之间的关系,从这些表中查询数据。
注意: 内连接是从结果中删除其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。
重点:内连接,只查匹配行。
select news.*, user.username as uname from news inner join user on news.uid=user.id;
外连接
与内连接相比,即使没有匹配行,也会返回一个表的全集。
外连接分为三种:左连接,右连接,全连接。对应SQL:left/right/full outer join。通常我们省略outer 这个关键字。写成:left/right/full。
重点:至少有一方保留全集,没有匹配行用NULL代替。
1)left join,左连接
结果集保留左表的所有行,但只包含第二个表与第一表匹配的行。第二个表相应的空行被放入NULL值。
select * from news right join user on news.uid=user.id; //
2)right join,右连接
右外连接保留了第二个表的所有行,但只包含第一个表与第二个表匹配的行。第一个表相应空行被入NULL值。
select * from news left join user on news.uid=user.id;
- 权限管理
- 主键 (自增) 唯一标识信息 id
- 内容管理系统 cms
MVC
1、概念
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离。
MVC就是类似三层的一种架构,主要还是采用封装(分层)的思想,来降低耦合度,从而使我们的系统更加的灵活,扩展性更好。
2、内容
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的,用来展示呈现数据
Controller(控制器)是应用程序中处理用户交互的部分。通常控制器,接收请求,定义要做的事情。选择相应的模型,选择相应的视图。
3、优点
(1)大大提高了代码的可重用性。
(2)将整个系统划分为三层,有效的实现了数据和视图的分离
(3) 提高整个系统的逻辑性
浏览器发送请求,控制器接收到请求,向模型发出指令,模型对象在数据库中存取数据后,返回给控制器,控制器再向view中发送结果,由view层输出数据,浏览器解释执行
Git
git是目前世界上最先进的分布式版本控制系统
- 集中式版本控制系统
- 分布式版本控制系统