该部分为 php 面向对象的入门部分,较为肤浅且参杂过分已经不是主流的知识。

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

day17-定时器

<html>

<head>

<meta charset='utf-8'>

</head>

<body>

</body>

</html>

1、封闭空间实现滑动门

2、获取非行内样式

3、定时器

分为两种

周期性定时器:周期性的去执行一个方法

定时器 = setInterval(方法, 时间); 时间以ms为单位

clearInterval(定时器名);

一次性定时器:执行一次

定时器 = setTimeout(方法, 时间); 时间以ms为单位

clearTimeout(定时器名);

计数器

一次性定时器使用

闪动效果

广告消失

秒表

00:00

开始、暂停、重置

倒计时

日期对象

飘动广告(自己实现)

鼠标快速划过

4、全选、全不选、反选

5、处理className兼容

IETester

getElementsByName 必须是document对象

getElementById 必须是document对象

getElementsByTagName document和子对象都可以

getElementsByClassName document和子对象都可以

该部分为 php 面向对象的入门部分,较为肤浅且参杂过分已经不是主流的知识。

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

day16-DOM操作、事件、选项卡

<html>

<head>

<meta charset='utf-8'>

</head>

<body>

</body>

</html>

数组声明

声明方式数字下标

var arr1 = ['张国荣', '林俊杰', 'beyond', '陈奕迅'];

这种就是索引数组,js中没有关联数组

追加方式字符串下标

arr1['kobe'] = 24;

可以通过这种方式给数组对象增加属性,就类似于php中的关联数组

获取数组长度

arr.length 但是只能获取索引数组的长度

数组遍历:for for in

for 只能遍历索引数组

for in 会遍历数组中所有的键

数组常用方法:push pop shift unshift join reverse slice

arr1.push

对象创建三种方法

Object

json格式

json_encode

json_decode

function

1、js核心

css有很多属性,我们通过js找到对应的对象。然后为事件添加一些对应的方法,再触发这个事件的时候,就会执行对应的方法

事件是官方为我们提供好的

方法是需要我们自己写的

2、DOM操作(document object model)文档对象模型

document.getElementById()

根据id找到对象,根据需求(哪些事件)修改对象的属性即可

3、常用事件

onmouseover 鼠标悬停事件

onmouseout 鼠标离开

onmouseup 鼠标弹出

onmousedown 鼠标按下

onmousemove 鼠标移动

onclick 点击事件

ondblclick 双击事件

onblur input框 失去焦点

onfocus 得到焦点

4、简单效果

获取对象属性,获取对象的style

获取类名:oDiv.className

获取宽度:oDiv.style.width

获取背景色: oDiv.style.backgroundColor

css中带杠的,在js中属性名变为小驼峰

获取标签文本

innerHTML:获取标签和内容

innerText:只获取文本信息

点和中括号区别

点: 只能获取对象已有的属性,点后面只能根存在的属性名

中括号:都可以。

使用点的地方肯定可以使用中括号,使用中括号的地方不一定能使用点

添加事件

多种方法,看代码

显示隐藏图片

控制div的display属性, none block之间修改即可

this

就是当前对象,可以通过方法直接传递过去 onclick="change(this)"

表单内容控制(onblur、onfocus)

onload加载

当整个页面加载结束之后,调用window.onload方法

点击事件的函数都要写在onload的外面,否则找不到该方法

5、通过className Name Tag获取对象

getElementById

document.getElementsByClassName //得到的是一个集合,下标从0开始

document.getElementsByName

document.getElementsByTagName 这些得到的都是集合,需要通过下标来依次访问

6、选项卡、滑动门(重点)

8、获取非行内样式

该部分为 php 面向对象的入门部分,较为肤浅且参杂过分已经不是主流的知识。

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

day15-js基本语法

<html>

<head>

<meta charset='utf-8'>

</head>

<body>

</body>

</html>

一、基本介绍

javascript 网景 sun 火狐浏览器

特点:杂乱无章 非常的乱 没有规律可循

四种声明方式

第一种:在页面的任何地方,写入<script>js代码</script>

第二种:在a标签中写js <a href="javascript:"></a>

第三种:外联式 .js 引入进来这个文件即可

第四种:直接通过添加事件写入

三种打印输出方式

第一种:弹窗式 alert();

第二种:借助浏览器的控制台

谷歌、火狐、360、ie、qq

ie 678910 垃圾

非ie 兼容性 我们都以谷歌和火狐为例

第三种:document.write();

二、基本语法

1、变量声明

变量声明:都要以var开始,不以var开始也行,但是我们要求都要以var开始.区别后续再了解

分号结尾:js中的语句要以分号结尾,但是不以分号结尾也行,但是要以回车结尾,一般我们都要求以分号结尾。

命名规范

(1)变量名由数字、字母、下划线组成,或者$

(2)不能以数字开头

(3)不能是系统关键字

(4)严格区分大小写

(5)不成文的规定

int float string object array

iTest fTest sTest oDiv aDiv

2、注释格式

单行 //

多行 /* */

3、数据类型

php中数据类型(8):整型、浮点、布尔、字符串、数组、对象、资源、null

类型

整型、浮点、布尔、字符串、数组、对象、null、未定义、NaN

typeof:通过这个函数查看变量的类型

undefined:定义一个变量没有给值

字符串

(1)加引号的都是字符串,单引号,双引号

(2)单引号和双引号都不解释变量

(3)单引号和双引号都解释转义字符

(4)字符串的拼接 使用 +

自动类型转化

字符串0在js中是真的,在php中是假的

各类型使用对象方式创建

Number String Boolean Array Object

对象、未定义、NaN

NaN:not a number 两个NaN永远不相等,判断是否是NaN使用isNaN函数

4、运算符

算术

    • * / % += -= %= /= ++ --

表达式的值就数学运算的结果

比较

> < >= <= == != ===(全等) !==(不全等)

逻辑

&& || !

在php中逻辑与和逻辑或得到的都是布尔值

在js中,逻辑与得到的后面的一个操作数,如果两个操作数都为真,那么取后面的操作数,如果其中有一个操作数为假,那么就是这个假操作数

逻辑或得到的是后面的一个操作数,如果这两个有一个为真,有一个为假,那么其是那个真值,如果两个都为真,取前面那个一个真操作数,如果两个都为假,取后面那个假操作数

短路:逻辑与=》前面的为假,后面不判断

逻辑或=》前面的为真,后面的不判断

! 真假互换

+运算符

只要其中有一个是字符串,那么就按照字符串拼接处理,其他的按照数字加减

将字符串转化为Number的函数

parseInt

字符串以数字开头==>截取前面的整型

字符串以字母开头==》NaN

parseFloat

字符串以数字开头==>截取前面的浮点

字符串以字母开头==》NaN

5、流程控制

通过Math对象访问成员方法使用的是 .

Math对象

random :得到的是0-1之间的一个随机数,这么多年来,没有出现过0和1

ceil :向上取整

floor :向下取整

round :四舍五入

max :最大值

min :最小值

if else else if: else if 之间要有空格

switch case : 都一样

for while do-while :和php中的是一样的

6、函数声明

注意事项

函数的定义格式和php中一模一样

php中函数的名字不区分大小写

(1)函数的名字区分大小写

(2)函数可以重载,后面的函数会覆盖前面的函数

形式参数、默认参数

在形式参数中不要加var

函数的形式参数不管有没有,再调用函数的时候你随便传递

全局变量和局部变量

全局变量全局有效

局部变量函数体内有效

如果局部变量定义和全局变量同名,那么局部变量会覆盖全局变量

变量必须都加var

可变长度参数

arguments 数组

匿名函数

和php是一样的

封闭空间

新内容,php中没有

(function (a) {

alert(a);

})('js真乱没法说');

回调函数

和php中一样,传递的时候直接传递函数名

内部函数

内部函数只能在内部使用

外部函数随便调用

递归函数

和php中一样

数组声明

声明方式数字下标

追加方式字符串下标

获取数组长度

数组遍历:for for in

数组常用方法:push pop shift unshift join reverse slice

对象创建三种方法

Object

json格式

json_encode

json_decode

function

这些对象方法大家自己测试一下

字符串对象方法

indexOf lastIndexOf substr replace toLowerCase toUpperCase

Date

getDate getDay getMonth

getHours getMinutes getSeconds

setMonth

该部分为 php 面向对象的入门部分,较为肤浅且参杂过分已经不是主流的知识。

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

day14-PDO

1、概述

pdo就是用来连接数据库的 mysqli是用来连接数据库的

使用pdo可以连接其他的数据库,连接方法不变

pdo可以用来连接所有的数据库,但是前提你要安装对应的驱动

pdo的扩展库 mysql和pdo的驱动

mysql oracle sqlserver

2、使用(手册)

3个类 PDO PDOStatement PDOException

连接

try {

$dsn = 'mysql:host=localhost;dbname=fen;charset=utf8';

//如果连接失败。pdo内部会自动的抛出异常

$pdo = new PDO($dsn, 'root', '1234567');

echo '连接数据库成功<br />';

} catch (PDOException $e) {

echo $e->getMessage();

}

获取和设置信息

setAttribute

在下面讲解pdo的时候设置看看

getAttribute

可以获取一些信息,都是pdo为我们提供的常量

PDO::ATTR_AUTOCOMMIT

PDO::ATTR_CLIENT_VERSION

PDO::ATTR_SERVER_INFO

PDO::ATTR_DRIVER_NAME

错误模式

默认模式:pdo有两个方法供我们使用 errorCode errorInfo

警告模式:$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

异常模式:$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_);

我们需要将sql语句的执行放到try中来执行

PDO执行sql语句

query=>查询=》要结果集的

返回的是PDOStatement对象,可以通过遍历对象查看所有结果,该结果关联和索引都有

exec=>增删改=》不要结果集的,要受影响的行数

事务处理

什么叫做事务?

wo 0+500

li 1000-500

这两条语句必须都执行成功才能完成交易,如果有一条语句失败,那么交易就失败,所有的状态都要恢复(回滚)。这种就叫做一个事务

myisam:不支持

innodb:支持事务

小利给爱斌转500块钱

PDO::beginTransaction --- 启动一个事务

PDO::commit --- 提交一个事务

PDO::rollBack --- 回滚一个事务

预处理类 预处理语句

优点:效率、安全(sql注入)

PDOStatement

prepare 预处理sql语句

execute 执行sql语句

增删改

查(结果集)

PDO::FETCH_BOTH

PDO::FETCH_ASSOC

PDO::FETCH_NUM

PDO::FETCH_OBJ

setFetchMode 设置默认的提取模式

绑定列(了解)

3、虚拟主机

1、点击配置

2、在 httpd.conf 中,将下列打开

vhost_alias_module

rewrite_module

Include conf/extra/httpd-vhosts.conf

该部分为 php 面向对象的入门部分,较为肤浅且参杂过分已经不是主流的知识。

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

day13-异常处理、composer、容器、反射

1、异常处理

做两手准备(planA planB)

生活中

代码中

正常的逻辑,代码会按照你写的顺序正常的往下执行,在执行的过程中,往往会有一些异常的情况,碰到异常的情况,我们应该如何应对呢,这就是异常处理

在php中:try catch Exception(异常类,所有异常处理类的基类),在代码中如果有异常了,我们要手动抛出异常

try:尝试着去执行一些有异常情况的代码,如果出现异常,手动抛出

throw:抛出异常

catch:捕获异常,进行下一步处理

【注】try-catch是一种结构,一个try至少对应一个catch

【注】在try和catch之间不能有任何的代码

try {

} catch () {

}

执行流程:

程序首先执行try中的代码,如果碰到了throw,那么try里面的throw下面的代码将不再执行,直接被catch捕获到这个异常,在catch中再执行你想执行的流程

Exception:官方的异常处理类,是所有异常类的基类

构造方法:错误信息,错误代码

getMessage

getCode

自定义异常处理类:一定要继承自官方异常处理类

final:

类:代表此类不能被继承

方法:代表这个方法不能被重写

多个捕获

【注】如果是多个捕获,那么自定义的异常处理捕获要放到官方捕获的上面

嵌套

见代码

自定义异常处理函数

set_exception_handler('exceptionHandle');

注册一个函数用来处理异常信息

2、composer

打开openssl扩展

如果安装成功,在cmd下输入composer,敲回车,显示出来即安装成功

基本dos指令

cd 拖过来你的那个项目文件夹

dir 显示当前文件夹下面所有的文件

composer.json文件

编写该文件,这个文件就是你的composer的配置文件,你想安装的一些包的信息都要写到这个文件中,而且按照固定的格式写(json格式)

{

"employees": [

{ "firstName":"Bill" , "lastName":"Gates" },

{ "firstName":"George" , "lastName":"Bush" },

{ "firstName":"Thomas" , "lastName":"Carter" }

]

}

json格式:两种数据类型 对象{} 数组[] 键使用双引号引起来,键值对中间使用逗号隔开

修改为国内镜像网

github.com

packagist.org

https://pkg.phpcomposer.com/ 国内镜像

只要你安装了composer,默认是从国外镜像下载,你得修改成国内镜像,否则后果自负

执行如下指令,修改镜像源

composer config -g repo.packagist composer https://packagist.phpcomposer.com

require加载路由包

"require": {

"noahbuscher/macaw": "dev-master"

}

运行composer update指令进行下载

版本号

1.0.* 表示任何从 1.0 开始的开发分支,它将会匹配 1.0.0、1.0.2 或者 1.0.20

1.0.2 对应确定的版本号

>=1.0

>=1.0,<2.0

>=1.0,<1.1|>=1.2

~1.2 相当于 >=1.2,<2.0

~1.2.3 相当于 >=1.2.3,<1.3

dev-master github上面的主版本号

参数

项目基本描述

"name": "laravel/laravel",

"description": "The Laravel Framework.",

"keywords": ["framework", "laravel"],

"license": "MIT",

"type": "project",

autoload(重点)

通过composer安装的包,composer都已经为我们实现了自动加载,使用的时候,直接使用即可

【注】使用第三方包之前,要首先包含

include 'vendor/autoload.php';

如果是自己写的类,想用通过自动加载加载过来,需要使用下面两种方法中的任意一种

psr-4 :遵从psr-4的规范进行加载

classmap:文件夹映射,将该文件夹下面的所有文件包含进来

【注】修改完配置文件中的autoload参数之后,要首先执行 composer dump-autoload

composer常用指令

通过composer list来展示所有的指令

require 安装包我们可以通过配置文件来进行加载,也可以通过指令模式进行加载

composer require noahbuscher/macaw:dev-master

3、依赖注入(DI)、反转控制(IOC)、容器

容器优点:

1、降低耦合度

2、实现惰性加载

3、便于管理

4、反射

ReflectionClass 反射类对象

ReflectionMethod 反射方法对象

ReflectionParameters 反射参数对象

5、虚拟主机

httpd.conf

vhost_alias_module

rewrite_module

Include conf/extra/httpd-vhosts.conf

该部分为 php 面向对象的入门部分,较为肤浅且参杂过分已经不是主流的知识。

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

day09-MVC框架

1、mvc概念

model view controller

2、psr规范

psr1:基础编程规范

psr2:编码风格规范

psr3:日志接口规范

psr4:自动加载规范

3、单一入口(简单路由)

index.php?m=index&a=index

pathinfo index.php/index/index

spl_autoload_register

__autoload($className)

4、框架目录架构

app

model

UserModel.php

view

user

login.html

register.html

index

index.html

about.html

controller

Controller.php

UserController.php

IndexController.php

config

config.php

vendor

lib

Model.php

Page.php

Tpl.php

public

css

js

fonts

editor

cache

缓存

5、命名空间映射

将命名空间和目录结构对应起来叫做命名空间映射

今天的代码命名空间的映射是一一对应的,大家可以自己改进代码,将一个命名空间对应多个目录?

'model' => 'app/model/'

'model\test' => 'app/model/lala'

'controller' => 'app/controller/'

'vendor' => 'vendor/lib'

6、MarkDown介绍

该部分为 php 面向对象的入门部分,较为肤浅且参杂过分已经不是主流的知识。

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

day08-设计模式

设计模式概述

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。

模式的经典定义:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心,通过这种方式,我们可以无数次地重用那些已有的解决方案,无需再重复相同的工作。即模式是在特定环境中解决问题的一种方案

现在有两派,有的人建议使用设计模式,有的人不建议使用设计模式!

解决代码的耦合度

耦合度越低越好

高内聚低耦合(对内要高内聚,对外要低耦合)

设计模式不分语言。php是世界上最优美的语言

1、单例(单一实例)实例化

这个类只能创建一个对象。

php的应用主要在于数据库应用,一个应用中会存在大量的数据库操作,使用单例模式,可以避免大量的 new 操作消耗的资源

步骤

1、构造函数需要标记为private

2、保存类实例的静态成员变量

3、获取实例的公共的静态方法

2、简单工厂、标准工厂

接口中定义一些方法

实现接口的类实现这些方法

工厂类:用以实例化对象

优点:为系统结构提供了灵活的动态扩展机制。方便维护

3、工厂方法

工厂方法模式核心是工厂类不再负责所有对象的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,它仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节

4、观察者

涉及到两个类:

一个是被观察者

1、添加观察者

2、删除观察者

3、发送通知

一个是观察者

1、做出反应即可

在php中:用户注册(收到邮件,收到短信,或者收到其他信息)

它是一种事件系统,意味着这一模式允许某个类观察另一个类的状态,当被观察的类状态发生改变的时候,观察类可以收到通知并且做出相应的动作;观察者模式提供了避免组件之间紧密耦合的另一种方法

官方接口

SplSubject

attach 添加观察者

detach 删除观察者

notify 通知

SplOberser

update 做出响应

5、适配器

生活中就有很多适配器 电源适配器 就是里面的变压器 220v

可将一个类的接口转换成客户希望的另外一个接口,使得原本不兼容的接口能够一起工作。通俗的理解就是将不同接口适配成统一的接口

6、策略模式

(1)多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。

(2)需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。

(3)对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

(4)客户端必须知道所有的策略类,并自行决定使用哪一个策略类,策略模式只适用于客户端知道所有的算法或行为的情况。

(5)策略模式造成很多的策略类,每个具体策略类都会产生一个新类。

优点:

1、策略模式提供了管理相关的算法族的办法

2、算法封闭在独立的Strategy类中使得你可以独立于其Context改变它

3、使用策略模式可以避免使用多重条件转移语句

7、门面模式

优点

1、它对客户屏蔽了子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便

2、实现了子系统与客户之间的松耦合关系

3、如果应用需要,它并不限制它们使用子系统类。因此可以在系统易用性与能用性之间加以选择

适用场景

1、为一些复杂的子系统提供一组接口

2、提高子系统的独立性

3、在层次化结构中,可以使用门面模式定义系统的每一层的接口

8、DI(Dependency Injection)依赖注入 (Ioc反转控制)

9、MVC

10、容器

该部分为 php 面向对象的入门部分,较为肤浅且参杂过分已经不是主流的知识。

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

day07-模板引擎类

1、模板引擎

html css 静态页面

php 内嵌到html文件中的服务端脚本语言

1.php

<html>

<?php echo 123; ?>

<?php foreach ($data as $key => $value) : ?>

<div><?=$value; ?></div>

<?php endforeach; ?>

</html>

弊端:

html代码和php代码交叉的太厉害,非常乱,而且,真正的工作中,前端的代码是有专门的妹子来写的,后端的代码你们这些汉子负责的

模板引擎

就是为了分离html文件和php文件而产生的

1.html(负责显示数据的)《====模板引擎===1.php(用来获取数据的)

简单的逻辑(得到数据显示出来)

使用模板引擎的语法来显示

{$title} =======》 <?=$title; ?>

{if $a > 0} =====> <?php if ($a > 0): ?>

{/if} =======> <?php endif; ?>

通过模板引擎,将html文件中的模板引擎的语法替换为php的语法,然后将该文件的后缀从html变成php,最终显示这个php文件。这个生成的php文件就是传说中的缓存文件

2、正则替换

preg_replace

正则表达式有

定界符 原子(\d \w .) 元字符(+ ? * {n}) () {} . + * ?

preg_quote

preg_replace_callback

3、include问题(一会讲吧)

4、缺点

面向过程

每次都会生成缓存(过期时间)

分页时候生成都是同一个缓存文件 index.php?page=3

类的设计:

成员属性

模板路径

缓存路径

过期时间

变量数组(用来保存页面需要显示的数据)

成员方法

assign($name, $value) :分配变量

display(模板文件名, 是否include进来, uri) :展示模板

<html>

{include 'head.html'} => <?php include 'head.php'; ?>

{include 'foot.html'}

</html>

该部分为 php 面向对象的入门部分,较为肤浅且参杂过分已经不是主流的知识。

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

day06-数据库操作类

1、数据库知识回顾

连接数据库

mysqli_connect(主机名,用户名,密码)

判断是否成功

选择数据库

mysqli_select_db($link, 库名)

设置字符集

mysqli_set_charset($link, 字符集)

准备sql

执行

mysqli_query($link, $sql)

解析结果集

mysqli_fetch_assoc($result)

mysqli_fetch_rows($result)

mysqli_affected_rows($link)

mysqli_fetch_array($result)

mysqli_insert_id($link)

关闭

mysqli_close($link)

2、连贯操作

$user->where()->table()->field()->limit()->order()->select();

return $this;

3、数据库缓存字段

将表格中的全部字段缓存起来

(1)当查询的时候,如果不传递字段,默认使用全部字段(缓存)进行查询

(2)当在查询的时候,如果有一个字段输入错误了,不影响我的查询

username password createIp createTime 和缓存字段取交集查询

(3)当插入数据的时候,如果有一个字段键值对传递错误,不影响插入数据

4、__call($name, $args)函数

getByUsername getByEmail

5、两种操作

增删改查

增删改(返回的结果都是受影响的行数) exec

查(返回的是结果集) query

6、查询实现字段无顺序替换

$user->where()->table()->field()->limit()->order()->select();

$user->table()->limit()->where()->field()->order()->select();

7、数组交集

array_intersect

按值取交集,内容为第一个数组的内容

array_intersect_key

按键取交集,内容为第一个数组的内容

8、类的设计

Model类

我们写的是一个父类,基类

以后我们的一张表格就是一个类,而且都要继承自Model类

user==》UserModel goods==>GoodsModel arctical==>AbcModel

成员属性

$host

$user

$pwd

$charset

$dbname

$link //保存数据库资源

$sql //保存sql语句使用

$options = []; //用来保存其它方法(limit、where)传递过来的参数

$tableName //设置表的名字,从类名中获取

成员方法

select table filed where limit order group having

$sql = 'select %field% from %table% %where% %group% %having% %order% %limit%';

该部分为 php 面向对象的入门部分,较为肤浅且参杂过分已经不是主流的知识。

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

day05-文件上传类、水印缩放类

1、文件上传类

form表单注意事项:

post enctype = 'multipart/form-data'

<input type='file' name='f'>

$_FILES['f']

类设计:

成员属性

上传路径

允许的后缀

允许mime

允许的大小

是否启用随机名字

前缀 up_ water_ sf_

错误号码

错误信息

//将下面的信息保存起来,方便其他的函数使用而已

原文件名

原文件后缀

原文件大小

原文件的mime

文件临时路径

成员方法

uploadFile($key)

上传错误:

官方错误:123467

自定义错误:-1 -2 -3 -4 -5

上传成功:0

错误信息:

2、水印缩放类(图像类)

100*100

50*50

20*80(图片会变形,不变形)

类的设计:

成员属性

保存路径

是否启用随机名字

保存格式

成员方法

水印(水印图片,源图片,位置, 透明度, 前缀) water_

缩放(源图片, 宽度, 高度, 前缀) sf_

protected function kidOfImage($srcImg, $size, $imgInfo)

{

//传入新的尺寸,创建一个指定尺寸的图片

$newImg = imagecreatetruecolor($size['old_w'], $size['old_h']);

//定义透明色

$otsc = imagecolortransparent($srcImg);

if ($otsc >= 0) {

//取得透明色

$transparentcolor = imagecolorsforindex($srcImg, $otsc);

//创建透明色

$newtransparentcolor = imagecolorallocate(

$newImg,

$transparentcolor['red'],

$transparentcolor['green'],

$transparentcolor['blue']

);

} else {

//将黑色作为透明色,因为创建图像后在第一次分配颜色时背景默认为黑色

$newtransparentcolor = imagecolorallocate($newImg, 0, 0, 0);

}

//背景填充透明

imagefill( $newImg, 0, 0, $newtransparentcolor);

imagecolortransparent($newImg, $newtransparentcolor);

imagecopyresampled( $newImg, $srcImg, $size['x'], $size['y'], 0, 0, $size["new_w"], $size["new_h"], $imgInfo["width"], $imgInfo["height"] );

return $newImg;

}

/*

$width:最终缩放的宽度

$height:最终缩放的高度

$imgInfo:原始图片的宽度和高度

*/

protected function getNewSize($width, $height, $imgInfo)

{

$size['old_w'] = $width;

$size['old_h'] = $height;

$scaleWidth = $width / $imgInfo['width'];

$scaleHeight = $height / $imgInfo['height'];

$scaleFinal = min($scaleWidth, $scaleHeight);

$size['new_w'] = round($imgInfo['width'] * $scaleFinal);

$size['new_h'] = round($imgInfo['height'] * $scaleFinal);

if ($scaleWidth < $scaleHeight) {

$size['x'] = 0;

$size['y'] = round(abs($size['new_h'] - $height) / 2);

} else {

$size['y'] = 0;

$size['x'] = round(abs($size['new_w'] - $width) / 2);

}

return $size;

}

0%