这是我早期的 php 学习笔记,php 的学习版本版本是 5.6、7,🐟2020/05/06年从有道笔记导出至此。

会话控制

http协议:

特点:无状态 ,无连接的协议(脸盲)

状态码:200 请求成功

404 未知的页面

302,307 :重定向

400:语法错误

500:服务器错误

报文头部:请求行 空行 头部信息

头部信息:分为很多种,里面重要的是cookie信息

使用场景:

访问网站的不同页面的时候 ,为了避免用户身份的重复验证

就是用cookie session

cookie:

是保存在浏览器中的指定文件内的cookie值 是保存在本地的,这个值是用setcookie设置的,下次访问的时候,浏览器会自动将cookie值提交给当前所属的站点服务器,setcookie设置的作用域是'/',name整个站点都可以使用这个值.

-----------------

如果是第一次访问,没有请求跟返回的cookie值

在后台登录以后,设置cookie 以后 访问直接把cookie 或者session值返回给浏览器

当第二次请求,login.php.时候,浏览器已经将刚才的值存储起来,当第二次请求的时候,会把数据提交给服务器,执行第二次请求以后,服务器不会返回值给浏览器

第三次.....都是一样,只要浏览器中有这个cookie值并且没有过期 服务器就不会再返回值给浏览器,什么时候回有值返回给浏览器,

1.修改了cookie值

2.cookie过期

---------------

设置cookie:

setcookie('名','值','生存时间',域);

域:'/':当前站点都有效; 不传值:当前目录

读取:

$_COOKIE['名'];

销毁:

1.设置生存时间为之前时间(浏览器自动判断不会提交)

setcookie('名','值',time()-60,域);

2.unset($_COOKIE['name']);

特点:

使用COOKIE不安全,因为可以在浏览器中查看到

尽量不要使用cookie设置保存敏感信息

session:

session:值存在服务器中,将一个加密的串返回给浏览器,也放在浏览器的cookie中

开启:session_start();

:在开启session前边不要有输出,把session_start()放在文件开始最前边

设置session:

$_SESSION['名'];

销毁:

1.unset($_SESSION['名']);

2.session_destroy() 函数

3.setcookie('PHPSESSID','','过期时间');

//因为值存在浏览器的cookie文件中,把时间设置为过期的,浏览器不会提交

函数:

session_name(); 获取到的是在浏览器中存的cookie的key

session_id(); 获取到的是在浏览器中存的cookie的value

面试题:

浏览器中禁用cookie以后,还能使用session么?

答:不能使用,因为session的真正的值保存在服务器中,但是也有value存在浏览器的cooki中,是依赖关系。但是解决方式有:

1.手动拼接URL

2.session.use_trans_sid = 1 可以在url中自动拼接

session.use_only_cookies = 0 是否依赖于浏览器中的cookie

自动登录:

使用setcookie()

-----------------

serialize:序列化

unserialize:反序列化

这是我早期的 php 学习笔记,php 的学习版本版本是 5.6、7,🐟2020/05/06年从有道笔记导出至此。

<?php

function dbConnect($host, $user, $pwd, $dbname, $charset)

{

$link = mysqli_connect($host, $user, $pwd);

if (!$link) {

return false;

}

$db = mysqli_select_db($link, $dbname);

if (!$db) {

return false;

}

mysqli_set_charset($link, $charset);

return $link;

}

function dbInsert($link, $table, $data)

{

//字段

$fields = array_keys($data);//取所有key

$fields = join(',', $fields);

$values = array_values($data);

$values = vTostr($values);

$values = join(',', $values);

$sql ="insert into $table($fields) values($values)";

$result = mysqli_query($link, $sql);

if ($result && mysqli_affected_rows($link)) {

return mysqli_insert_id($link);

} else {

return false;

}

}

function dbDelete($link, $table, $where)

{

if (empty($where)) {

return false;

}

//作业 ,补充是数组的情况 and

$sql ="delete from $table where $where";

$result = mysqli_query($link, $sql);

if ($result && mysqli_affected_rows($link)) {

return mysqli_affected_rows($link);

} else {

return false;

}

}

function dbUpdate($link, $table, $data,$where)

{

if (empty($where)) {

return false;

}

$data = vTostr($data);

$data = vUpdate($data);

$data = join(',', $data);

$sql = "update $table set $data where $where";

$result = mysqli_query($link, $sql);

if($result && mysqli_affected_rows($link)) {

return mysqli_affected_rows($link);

} else {

return false;

}

}

function dbSelect($link, $table, $fields = '*', $where = null, $order = null, $limit = null)

{

// fields where order by limit 0,5

if (is_array($fields)) {

$fields = join(',', $fields);

}

if ($where) {

$where = " where " . $where;

}

if ($order) {

$where .= " order by " . $order;

}

if ($limit) {

$where .= " limit " . $limit;

}

$sql ="select $fields from $table $where";

$result = mysqli_query($link, $sql);

if ($result && mysqli_affected_rows($link)) {

return mysqli_fetch_all($result, MYSQLI_ASSOC);

} else {

return false;

}

}

function vTostr($values)

{

foreach($values as $k => $v) {

if (is_string($v)) {

$v = "'" . $v . "'";

$values[$k] = $v;

}

}

return $values;

}

function vUpdate($data)

{

foreach ($data as $k => $v) {

$data[$k] = $k . '=' . $v;

}

return $data;

}

这是我早期的 php 学习笔记,php 的学习版本版本是 5.6、7,🐟2020/05/06年从有道笔记导出至此。

天龙八步:

1:链接数据库

2:判断数据是否链接成功

3:选择数据库

4:设置字符集

5:准备sql语句

6:执行sql语句

7: 解析结果集

8:关闭数据库 释放资源

<?php

/*

1.连接数据库

参数:

1).主机名:localhost //ip地址

2).用户名

3).密码

返回值:

成功:object;

失败:false;

*/

$link = mysqli_connect('localhost', 'root', '123456');

//var_dump($link);

/*

2.判断链接是否成功

*/

// if($link == false)

if (!$link){

exit('数据库链接失败');

}

/*

3.选择数据库

参数:

1).$link

2).databasename

返回值:

true false

*/

$db = mysqli_select_db($link, 'qf_1701');

// var_dump($db);

if (!$db) {

echo '错误号:' . mysqli_errno($link);

echo '错误信息:' . mysqli_error($link);

exit('数据库选择失败');

}

/*

4.设置字符集

//HTML utf-8 php utf8 mysql utf8

参数:

1).$link

2).字符集 utf8

*/

mysqli_set_charset($link, 'utf8');

/*

5.准备sql语句

//单独提出来sql语句:拼接sql 如果出错 可以直接输出sql语句 方便排错

*/

$sql = 'select * from qf_user';

/*

6执行sql语句

参数:

1).$link

2).sql语句

返回值:

成功:object

失败:false

*/

$result = mysqli_query($link, $sql);

/* var_dump($result);

var_dump(mysqli_affected_rows($link));

die; */

/*

7.解析结果集

mysqli_fetch_*

mysqli_fetch_assoc() //返回一条关联数组的数据

mysqli_fetch_array() //返回一条关联数组的数据

mysqli_fetch_row() // 返回一条索引数组的数据

mysqli_affected_rows() 返回执行受影响的行数 说明:增删改返回受影响行数,查询返回数据的和

mysqli_num_rows()//自己测试

mysqli_insert_id //更新数据时候 成功返回插入数据的id

*/

date_default_timezone_set('PRC');

if ($result && mysqli_affected_rows($link)) {

echo '<table width=800 border=1 align=center>';

echo '<caption>用户信息</caption>';

echo '<tr><td>id</td><td>用户名</td><td>邮箱</td><td>注册ip</td><td>注册时间</td></tr>';

while ($data = mysqli_fetch_assoc($result)) {

echo '<tr>';

echo'<td>' . $data['id'] . '</td>';

echo'<td>' . $data['username'] . '</td>';

echo'<td>' . $data['email'] . '</td>';

echo'<td>' . long2ip($data['ip']) . '</td>';

echo'<td>' . date('Y-m-d H:i:s', $data['create_time']) . '</td>';

echo '</tr>';

}

echo '</table>';

}

/*

8.关闭数据库

*/

mysqli_close($link);

这是我早期的 php 学习笔记,php 的学习版本版本是 5.6、7,🐟2020/05/06年从有道笔记导出至此。

day16

1.mysql函数

使用方式:

select 函数(字段名) as 字段别名 from tablename ;

注:尽量不用

as 给字段起别名

2.分组:

select count(age) as count ,age from tablename group by 字段名;

select count(age) as count ,age from tablename group by 字段名 having 条件;

分组以后数据再次过滤 条件使用having

3.链接:

内连接:

隐式链接:select 表1.字段 [as 别名], 表n.字段 from 表1 [别名], 表n where 条件;

显示链接:select 表1.字段 [as 别名], 表n.字段 from 表1 [别名] join 表n on 条件;

表1 inner join 表2 on 条件

表1 join 表2 on 条件

inner一般使用习惯是可以省略掉的

外链接:

左连接:select 表1.字段 [as 别名], 表n.字段 from 表1 [别名] left join 表n on 条件;

说明:以左边表数据为准进行匹配查询 如果右边对应表没有对应数据 null

右链接:select 表1.字段 [as 别名], 表n.字段 from 表1 [别名] right join 表n on 条件;

select guser.username,goods.name ........

说明:以什么方式关联就以什么表为主

4.子查询

以一个结果集作为另一个查询的一部分或者是条件

select * from user where gid in (select gid from goods);

5.全外链接(记录联合)

将讲个关联查询结果合并到一起,没有对应的数据时候 用null

select * from guser lu left join goods lg on lu.gid=lg.gid union select * from guser ru right join goods rg on ru.gid = rg.gid;

union 是将 union all 后的结果进行一次distinct,去除重复记录后的结果

6.修改更新:

update money set balance=balance-500 where userid = 15;

update 要操作的字段名 set 字段名=字段名(实际的意义指字段里的对应值)-190 where 条件

两个表同时修改

update user u, goods g set u.gid=0, g.price=1799 where u.id=8 and u.gid=g.gid;

说明: 先将user表里 gid 值 把user表中id为8的用户gid改成0 然后运用关联gid值 就是拿到的user gid 再把goods修改

7.清空表记录

1.delete 删除 说明: 索引也就通常说的id 是自增的使用delete删除数据 id保留 再添加数据时候从删除前的id+1

2.truncate table user; 说明:与delete的区别就是 清空数据时候连索引值一起清空。

8.权限控制(了解):

show grants;显示用户

创建用户:

create user 'username'@'host' identified by 'password';

赋予操作权限:

grant 权限 [privileges] on 库.表 to 用户@主机 [identified by '密码'];

刷新:

flush privileges;

剥夺权限:

revoke select on test.* from 'aaa'@'%';

说明:

* 代表操作索引的表

% 代表模糊匹配

all 所有操作(insert delete select update)

9.事务

默认的配置autocommit值是1 自动提交

将set autocommit=0;以后意思是手动提交; commit

开启事务:

begin; //如果begin不好使时候可以使用set autocommit=0;

提交事务:

commit;

回滚:

rollback;

10.导入导出

导出:mysqldump -uroot -p 数据库 > xxx.sql

// 一定是退出mysql

导入:mysql -uroot -p 数据库 < xxx.sql

//注意: 一定新建一个数据库

这是我早期的 php 学习笔记,php 的学习版本版本是 5.6、7,🐟2020/05/06年从有道笔记导出至此。

day15 数据库 数据类型 字符集 存储引擎

1.数据类型

int 默认没有设置int字节 11位

char varchar 数据类型的区别:

timestamp: regtime timestamp default current_timestamp;

在增加数据的时候 没有给指定的时间类型字段值的时候,默认填充的值是当前时间的时间戳

enum:枚举类型 用于互斥的 单选项

新建字段时候

sex enum('w','m');

// sex enum(1,2,.....);

存储值时候:

insert into user values('w');

insert into user values('1');

set:集合类型

设置字段类型:love set('eat','play','sport','wan');

// ; 1 2, 4, 8;

insert into user values('eat,play');

insert into user values('6');

unsigned:无符号 规定 没有负数 int(10) unsigned eg:编号,年龄......

auto_increment:自增 常用于:id

修改起始值:alter table user auto_increment=起始值

default '值': 默认值 再给某个字段增加值的时候就是插入数据时没有给值 默认使用设置的默认值

not null :创建时在字段语句后接上:not null

2.字符集

utf8 GBK GB2312

3.存储引擎

show engines;可以查看到当前服务器支持的所有引擎。

myisam 和 innodb的区别

myisam 不支持事物 表锁 支持全文索引 查询的速度快

innodb 支持事物 行锁 支持外键 数据操作速度快 默认读取不加锁 处理大数据优先选择innodb

4.索引

普通索引:

格式:alter table 表 add index(字段);

唯一索引: 当前列值唯一

格式:alter table 表 add unique(字段);

主键索引:不允许有空值 也别重复 是特殊的唯一索引 【注】基本上每个表都有id 会给主键索引 自动递增

格式:alter table 表 add primary key(字段);

全文索引:

格式:alter table 表 add fulltext(字段);

删除索引:

格式:alter table 表 drop index字段;

删除主键索引:

格式: alter table money drop primary key;

5.DML(增,删,改)

增:

1.insert into tablename values(值1,值2,....);

:按照字段的顺序跟值一一对应 添加; 如果有默认值 不想给定值 可以用null

2.insert [into] 表 values(值1,值2,值n); 可以将into省略(知道就好,尽量不用)

3.insert into tablename(字段1,字段2,.....) values(值1,值2,.....);

:按照自己赋的字段 字段跟值一一对应;

4.insert into star(name, money, province, age, sex)

values('黄晓明', 2000000, '山东', 39, 0),

( 'angelababy', 3000000, '上海', 27, 1),

( '陈赫', 150000, '福建', 31, 0);

: 字段名和值要一一对应,每条数据用小括号括起来,每条数据用逗号分隔开 最后的使用分号结束;

插入数据时候可以不传值的情况

1.自增的字段 (默认+1)

2.有默认值的字段 default

3.可以为空的字段

删除:

delete from tablename where 条件;

:要写where条件 不然后果自负

修改:

update tablename set 字段1=值1, 字段2=值2 .. where 条件;

:要写where条件 不然就是修改全表数据了;

6.DQL(查)

1.select * from tablename;

:是执行效率最低的一种方式,会每天数据全部读一遍;

2.指定字段查询:

select 字段名,字段名 from star;

3.查询出不重复的记录

select distinct age, sex from star;

:两个字段查询的是组合起来不重复的记录。

一个字段 当前字段不重复的记录

4.有条件的查询

select 字段名,.... from star where age = 43;

select * from star where age = 43;

5.条件查询

select * from star where age>32 and sex=0;

select * from star where age>32 or sex=0;

select * from star where age between A and B; //区间 在A和B之间 包含A B

select * from star where age in(32,43);//在in值中的数据

like : '%'代表模糊查询 :效率很低 也是查询所有进行匹配

排序:

order by 字段名 desc/asc desc:倒序 asc :默认的正序

多字段排序:

order by 字段名1 desc, 字段名2 desc :多字段排序呢 先按照前边的字段进行排序,如果前边的都相等排序失败,就按照第二个字段进行排序

limit 限制查询结果集

limit 2; 取符合条件的数据的前两条

limit 0,3; 取符合条件的数据从0(第一条)开始取,取了三条数据以后结束

7.where条件

8.结果集排序

9.限制结果集

10.分组

这是我早期的 php 学习笔记,php 的学习版本版本是 5.6、7,🐟2020/05/06年从有道笔记导出至此。

day14-mysql基础

1.数据库系统的组成部分

数据库系统 数据库 表 字段 数据

2.数据库分类

关系型数据库 非关系型数据库

3.SQL含义

Structured Query Language结构化查询语言

数据库的默认端口号是:3306

4.SQL的分类

DDL:数据定义语言 对数据库的库,表,字段的创建 修改 删除的操作

DML:数据的操作语言 主要对数据 进行增加 删除 修改

DQL:数据的查询语言 主要对数据进行查询

DCL:数据的控制语言

DTL:数据的事物

5.配置mysql相关环境变量

1.把mysql bin目录路径复制

2.打开计算机属性-》系统属性-》高级系统设置-》高级-》环境变量-》系统变量-》path 修改path值 不能删除以前的在值后边加上分号 把第一步路径粘贴上

3.关闭dos窗口 重新打开 mysql

启动dos:

1 开始菜单 -》搜索程序打开cmd 回车

2 win+R -> cmd

不修改环境变量想执行mysql

切换到mysql bin 目录下

d:

cd 切换目录

6.链接数据库

mysql -hlocalhost -uroot -ppassword

主机名 用户名 密码

**

如果访问的是本机的数据库 可以省略-h

链接mysql 时候 密码回车敲

退出mysql命令:

quit; exit;

help; \h 帮助命令 \c 清除历史 清除错误都可以使用

\G 更友好的显示

注意: 语句结束切记不要忘记分号

7.基本命令

show databases; 显示 当前所有的数据库

create database databasename; 创建数据库

drop database databasename; 删除数据库

use databasename; 选中数据库 使用数据库

show create database databasename; 显示库结构

8.表语句

show tables; 显示当前选中的库中的所有表

create table tablename(字段名 类型, 字段名 类型,字段名类型); 创建一个表

desc tablename; 查看选中的表的结构

drop table tablename; 删除选中的表

alter table tablename modify 字段名 varchar(40); 修改表字段类型

alter table 表名 add 字段名 字段类型; 增加字段

alter table 表名 add 字段名 字段类型 after 字段名; 增加字段设置字段的位置

alter table 表名 add 字段名 字段类型 first; 增加的字段放在字段的最前边

alter table tablename drop 字段名; 删除表中字段

alter table tablename change 字段原名 新字段名 数据类型;修改表中的字段名

alter table tablename rename newtablename; 修改表名

*字段增加和修改语句(add/change/modify)中,最后都可以加一个可选项 first|after。

----------

修改表字段

alter table tablename [modify/add/change/drop]

创建表语句的时候每次都要指定存储引擎 和字符集

engine = innodb

default charset=utf8

解决每次都要设置表引擎和字符集修改mysql配置文件my.ini

my.ini 打开方式 直接在小绿W打开 也可以在wamp64/bin/mysql/mysql5.7.9/my.ini

修改

default-storage-engine=InnoDB

添加

character_set_server=utf8

--------

注:一定先use 使用库以后才能操作选中的这个库里面的数据

-----------

json_encode 将字符串转换成json字符串 一般用于最多的时候就是将数组转成json

json_decode 将json串转成 object,第二个参数传true 才返回的是数组

-----------

这是我早期的 php 学习笔记,php 的学习版本版本是 5.6、7,🐟2020/05/06年从有道笔记导出至此。

day13-时间相关函数和错误处理

时间的用途:

1.时间函数

Unix时间戳:

1970年也叫计算机元年

1970/1/1 0:0 开始距离现在的秒数 时间戳

默认取到的时间戳是格林威治时间 0时区 我们现在在东八区 时差8小时

time(); $_SERVER['REQUEST_TIME']

date();

解决时差问题:

1:date('Y-m-d H:i:s', time()+ 3600 * 8);

2:date_default_timezone_set('PRC');

3:修改配置文件:date.timezone ="PRC" 默认是UTC

2.时间日期相关函数

mktime(); 参数: 时分秒月日年 返回unix时间戳 格式化使用date

checkdate();当前要判断的日期是否存在 参数:月日年 返回值布尔

getdate(); 参数是时间戳 如果不传默认当前时间戳 返回是数组

strtotime(); 参数:是英文字符 返回值是时间戳 经典的面试题 打印昨天的时间

date_parse();参数字符串 eg:2017-01-28 10:30:24 返回值是数组

microtime();返回时一个有时间戳还有微妙数的字符串

3.错误处理

错误级别:notice注意 warning警告 error致命错误

declare(strict_types = 1)

trigger_error() 抛出用户自定义的错误信息 参数一个是 错误信息 预定义的系统常量

处理错误方式:

@:抑制单行错误 抑制notice warning 错误显示 对于error不起作用

display_errors:修改配置文件 值为ON显示所有的错误(可以是值为1),为off不显示所有的错误(值可以0),当出现notice 和warning时候是不显示正常执行 当是error 时候 程序无法运行

error_reporting :显示错误 默认值是E_ALL eg:不想显示notice错误时候 可以将值改为

E_ALL & ~E_NOTICE 我们的waining同理

函数:

error_reporting():

// 关闭所有PHP错误报告

error_reporting(0);

// 除了 E_NOTICE,报告其他所有错误

// 这是在 php.ini 里的默认设置

error_reporting(E_ALL ^ E_NOTICE);

// 报告所有 PHP 错误 (参见 changelog)

error_reporting(E_ALL);

ini_set():设置配置文件的值 ini_set('display_errors', '1');

ini_get(): 获取配置文件的值ini_get('display_errors');

set_error_handler('自定义的函数名'); 当出现错误时候出来error 会自动触发在这个set_error_handler函数 会调用传给函数的自定义函数

error_get_last() //留作作业

错误日志

log_errors: 配置文件 是否打开写入错误日志

error_log

系统日志syslog error_log = syslog 默认不写入系统错误日志

管理工具 - 时间查看器- windows日志- 应用程序


die()

exit()

url相关函数补充

parse_str

parse_url

urlencode

urldecode

base64_encode

base64_decode

json_encode

json_decode

这是我早期的 php 学习笔记,php 的学习版本版本是 5.6、7,🐟2020/05/06年从有道笔记导出至此。

day12 数组

1.数组定义

数组:一组数据的集合 集合:值可以是任意类型 array

名词解释:

元素:数组中的一个数据

键值对:键值对就是一个元素 0 => 'balue'

键:为了找到值而存在 key :不能重复 默认从零开始

值:是真正要使用的东西 value 可以是任意的类型

定义:

1.[]: 定义一个数组 (php5.4以后才支持这种定义方式)

eg: $arr = [2, 'ser', 3.4];

2.array:

$arr = array(true, 2.3 , 'str');

3.直接赋值法:

$arr[] = 'duhaitao';

$arr['name'] = 'wangchun';

$arr[2] = '王美丽';

[zhu]:如果没有指定下标默认从0开始

如果指定下标 那么你指定的下标

如果数组中已经有了正整数的下标,而再赋值的时候默认从当前key中寻找到最大的非负整数中+1

数组的四种操作:

读/删除/追加元素/修改元素的值

如果操作时候 key已经存在 再赋值 相当于修改 如果没有就是追加

删除其中的某个元素 数组的元素键不变 不会随着删除而更改键

删除其中的某个元素以后立即增加新的元素 也不会代替刚被删除的元素的key

2.数组的分类

下标区分: 下标只有整数跟字符串

索引数组:键都是整型

关联数组:数组的键中只要一个key是字符串

声明关联数组时候 指定键 key => value 'key' => value

在定义关联数组的时候 如果没有指定下标 (如果下标里面都是字符串的时候 默认 从0 开始,如果已经有整数小标 那么从中寻找到最大的非负整数进行+1)

维度区分:

一维数组: 确定数组中的值需要一个下标的是一维数组

二维数组:确定数组中元素的值 需要两个下标的是二维数组

多维数组:数组A中元素的值插入的是B数组 然后B数组中又插入C数组 这种叫多维数组

从三维开始就叫多维

4.数组的遍历

for

for (变量的初始化, 循环条件, 计数条件) {

循环体;

}

:只能用于索引数组 而且是下标连续的索引数组

foreach

语法

foreach (遍历的数组 as [$key => ] $value) {

操作;

}

[zhu]: as 是不能缺少的

[key => ]是可以省略

每一次遍历 是将key赋值给指定的变量$key 将值赋值给 $value

知道读完所有值会自动结束遍历

list

只能用于索引数组 默认要连续下标的

如果不连续 读取要用,占位

将false 赋值给list 打印以后是false

each

------------

数组函数

这是我早期的 php 学习笔记,php 的学习版本版本是 5.6、7,🐟2020/05/06年从有道笔记导出至此。

day11-函数再认识

//注意: 定义函数定义了形参没有给默认值,调用函数的时候会包warning错误缺少参数

回调函数我们要传入可以调用的函数名,那如果传参数是错误的,防止错误的方式

加上判断,判断传入的回调函数名是否正确或者是否可以调用

递归函数:

核心思想:

自己调用自己的一个过程

主要三个组成部分:

自己调用自己

结束条件

核心的逻辑块

优点:

高大上代码

缺点:

效率低,占用内存大,而且可读性差 //大多数人都理解99%

引用传参:

使用方式:

eg:

function show(&$str)

{

echo $str;

}

show($str);

1.引用时两个变量指向同一个存储空间

那么在传实参的时候必须传的是变量

2.引用传参的 &必须放在的是我们的形参中

3.使用引用传参 在函数内部改变参数的值,函数外部的值也会改变

4.在使用引用传参时,如果传的是一个没有定义的变量不会报错,相当于定义了一个变量

可变参数类型

func_num_args() //返回的是调用时候实参参数的个数

func_get_args()//返回的是实参列表中所有的值 类型是数组

func_get_arg($i) // 返回的是指定的实参中的某一项

... php7.0新特性:

1.function show($str, $str2)

{

var_dump($str);//1

var_dump($str2);//2

}

$arr = [1, 2, 3];

show(...$arr); //传实参时候传的是数组,用了...以后将实参数组解析然后依次赋值给函数的形参

  1. function show(...$arr)

{

var_dump($arr);

}

show(1, 2, 3, 4, 5);

//jiang shican zhong de canshu liebiao jiexi cheng shuzu

include require include_once require_once:区别

include :包含文件并执行 参数:文件路径跟名字

如果包含错误 报的是警告的一个错误 但是不影响程序的继续执行

require :包含文件参数文件的路径

如果包含错误 报的是致命的错误影响程序的继续执行(程序不会往下执行)

include_once :包含文件 在包含文件时候首先判断是否已经引入如果有不执行包含如果没有不包含

require_once : 同理

declare(strict_types = 1);

function show( string $str)

{

var_dump($str);

}

show('2');

//形参中使用类型定义以后 传参要穿指定的类型,但是因为我们的PHP属于弱类型语言,如果定义的是int传入的是'2'会自动转成int 我们加上declare指令 以后强制传入指定的类型

function show($str):string

{

return $str;

}

//要求的是函数的返回值类型 如果我们在传实参时候传的是int 返回默认转成string 如果使用declare指令 那么要求传的实参也是string

---------------

函数的注释

/**

* @name 累加函数

* @author wlj wanglijuan@1000phone.com

* @param int(mixed) $num 累加开始值

* @param int $num2 累加结束值

* @return array

*/

---------------

超全局变量

$GLOBALS

$_COOKIE 得到会话控制中cookie传值

$_SESSION得到会话控制中session的值

$_FILES得到文件上传的结果

$_GET得到get传值的结果 //

$_POST得到post传值的结果//

$_REQUEST即能得到get的传值结果,//

也能得到Post传值的结果

__FUNCTION__

----------------

手册使用找规律

1. 看函数的功能和版本

2. 看返回值 var_dump() gettype() isset() empty()

3. 看传入的参数要求是什么 copy(复制谁,复制到哪儿去)

4. 看到[](中括号)代表可选,参数可传可不传

5. ... 就是后面可以传入任意多个参数

6. & 就必须要传变量,并且函数会改变原变量的值

7. Mixed 可传入任意类型

8. Callback 就是可以传入回调函数

9. 有没事看手册

这是我早期的 php 学习笔记,php 的学习版本版本是 5.6、7,🐟2020/05/06年从有道笔记导出至此。

day10-函数

变量的引用unset其中一个值

常量说常量值是标量类型

在php7.0以后我们的常量值可以是数组

1.为什么要自定义函数

可以提高代码的重用性

提高开发效率

减少了代码的冗余量

定义函数就是封装功能

2.分类:

系统函数

自定义函数

3.自定义函数

定义:

语法格式:

function 函数名([参数列表])

{

函数体;

[return 返回值];

}

调用

函数名([参数列表]);

函数名命名规范:

1.必须以function 开始

2.如同变量一样 ,以数字字母下划线组成 不以数字开始

3.函数不区分大小写 但是要求大家区分大小写

4.函数命名不能使用系统已经定义过的关键字或者系统函数名称

5.命名一般遵从的是小驼峰命名法或者下划线 (根据具体的项目安排)

[注意]:

函数可以重复调用,甚至在函数前边后边(函数是条狗,哪里需要哪里吼)

函数不可以重复定义 即函数不能被重载

如果函数定义了,不调用不执行

参数:【根据实际的需求增加,可以有可以没有】

我们在定义函数时候的小括号里面的参数叫形参

在调用函数的时候小括号里面的实参

如果我们的形参里参数有带默认值的参数,放在参数列表的后边

参数值是可变的,提高了代码的重用性

如果没有形参,调用函数的时候传实参那么不会报错(这种事情瞎子才干)

return:【根据实际需求,可以有可以没有】

调用函数的时候给返回值;

return 返回值;(如果有多个返回值:可以放在数组里或者.拼接);

return 返回值; 当前return结束以后,后边的语句就不再执行

4.变量的作用域

变量可使用的地方

外部变量:就是函数外部的变量

内部变量:就是函数内部的变量

在函数内部不可以使用函数外部的变量

解决方法:

1.使用关键字global 外部变量名(不推荐使用,因为可以在函数内部改变外部变量值)

2 推荐使用的方式

超全局变量:

5.静态变量:

static 关键词 在函数加载的时候定义一次,即使函数执行以后也不会释放,依然存在

6.内部函数:

函数里面还有一个自定义函数

【注】:

只能定义一次解决方式有三种

1.static

2.function_exists

3.is_callable

调用内部函数的时候,只能在函数定义之后调用,不能前边调用

当调用了外变的函数以后,才可以在外部使用内部函数

7.变量函数:

function demo()

{

echo '踏歌长行,梦想永在';

}

// demo();

$str = 'demo';

$str(); //== demo();

8.匿名函数

$str = function ()

{

echo 'youmengxiang';

};

把一个没有名字的函数就是匿名函数 直接赋给一个变量使用

调用方式 变量名();

匿名函数想要使用外部变量的时候 使用use关键词 use(变量名) 如果有多个用逗号隔开

想要在匿名函数内部改变use过来的变量值 在use时候传变量的引用eg: use(&$name)

$str();

9.回调函数:

10.递归函数:

11.引用传参:

12.可变参数类型

func_num_args()

func_get_args()

func_get_arg($i)

...

13.include require include_once require_once

---------------

超全局变量

$GLOBALS

$_REQUEST

$_GET $_POST

$_FILES

$_COOKIE $_SESSION

---------------

错误:

Notice 提示

Warning 警告

Error 错误

----------------

常用数学函数:

abs() 绝对值

max () 最大值

min() 最小值

mt_getrandmax() 最大随机数

pi() 圆周率

pow() x的y次方

round() 浮点数四舍五入

deg2rad() 角度转弧度

rad2deg() 弧度转角度

---------

变量的值传递跟引用传递的区别

//值传递

$num = 10;

$num2 = $num;

//传引用

$num = 10;

$num2 = &$num;

unset($num);

echo $num2;

0%