php

PHP

一、 PHP简介

什么是PHP

PHP定义:一种服务器端的 HTML 脚本/编程语言,是一种简单的、面向对象的、解释型的、健壮的、安全的、性能非常之高的、独立于架构的、可移植的、动态的脚本语言。是一种广泛用于 Open Source(开放源代码)的尤其适合 Web 开发并可以嵌入 HTML 的多用途脚本语言。它的语法接近 C,Java 和 Perl,而且容易学习。该语言让 Web 开发人员快速的书写动态生成的网页。

PHP前身:Personal HomePage,个人主页,使用Perl语言开发的一种写个人主页的语言

PHP:PHP Hypertext Preprosessor,php超文本预处理器,底层使用C语言

PHP发展史

Rasmus Lerdorf :创建者

1994:1.0,个人perl,非常简单(简陋)

1996:2.0,C底层,变的相对比较强大

1998:3.0,zendEngine,联合zend公司共同管理和维护PHP,zendEngine(zend引擎)用户高效的解析php代码

2000:4.0,session+输出缓冲等,session技术(会话技术),

2004:5.0,zend引擎2代,增加新技术(面向对象更新,命名空间,异常)

2015:7.0,新版的ZendEngine引擎,性能提升,新特性(异常)

平台支持(window,Linux,UNIX)

数据库支持(Sqlserver,mysql,Oracle,Access)

静态网站与动态网站的区别

静态网站:web1.0时代

动态网站:web2.0时代

网站

Website的中文名称是网站,是指在互联网上,根据一定的规则,使用HTML、PHP等代码语言制作的用于展示特定内容的相关网页的集合,有可供管理人员操作的后台及用户使用的前台。简单地说,Website是一种通讯工具,就像布告栏一样,人们可以通过Website来发布自己想要公开的资讯,或者利用Website来提供相关的网络服务。人们可以通过网页浏览器来访问Website,获取自己需要的资讯或者享受网络服务。

静态网站特点

1.网页内容一经发布到网站服务器上,无论是否有用户访问,每个静态网页的内容都是保存在网站服务器上的,也就是说,静态网页是实实在在保存在服务器上的文件,每个网页都是一个独立的文件;

2.静态网页的内容相对稳定,因此容易被搜索引擎检索;

3.静态网页没有数据库的支持,在网站制作和维护方面工作量较大,因此当网站信息量很大时完全依靠静态网页制作方式比较困难;

4.静态网页的交互性较差,在功能方面有较大的限制。

动态网站的特点

1.交互性:网页会根据用户的要求和选择而动态地改变和响应,浏览器作为客户端,成为一个动态交流的桥梁,动态网页的交互性也是今后Web发展的潮流。

2.自动更新:即无须手动更新HTML文档,便会自动生成新页面,可以大大节省工作量。

3.因时因人而变:即当不同时间、不同用户访问同一网址时会出现不同页面。

此外动态网页是与静态网页相对应的,也就是说,网页URL的后缀不是.htm、.html、.shtml、.xml等静态网页的常见形式,而是以.asp、.jsp、.php、.perl、.cgi等形式为后缀。在动态网页网址中有一个标志性的符号——“?”

网站基本概念

服务器概念

服务器(server),也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

服务器的构成包括处理器、硬盘、内存、系统总线等,和通用的计算机架构类似,但是由于需要提供高可靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面要求较高。

在网络环境下,根据服务器提供的服务类型不同,分为文件服务器,数据库服务器,应用程序服务器,WEB服务器等。

服务器:能够提供服务的机器,取决于机器上所安装的软件(服务软件)

Web服务器:提供web服务(网站访问),就需要安装web服务软件,Apache,tomcat,iis等

IP的概念

IP:Internet Protocol,网络之间互联协议。网络之间互连的协议也就是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。IP地址具有唯一性。(每台电脑都有一个唯一的IP地址)

域名

域名(Domain Name),是由一串用点分隔的名字组成(www.itcast.cn)的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置,地理上的域名,指代有行政自主权的一个地方区域)。域名是一个IP地址上有“面具” 。一个域名的目的是便于记忆和沟通的一组服务器的地址(网站,电子邮件,FTP等)。域名作为力所能及难忘的互联网参与者的名称。

特殊IP:127.0.0.1,代表本机

特殊域名:localhost

DNS

DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。

用户输入域名localhost—》DNS(localhost 127.0.0.1)–》服务器电脑

端口

端口(Port),可以认为是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。例如计算机中的80端口、21端口、23端口等。物理端口又称为接口,是可见端口,计算机背板的RJ45网口,交换机路由器集线器等RJ45端口。

用户输入域名localhost:端口—》DNS(localhost 127.0.0.1)–》服务器电脑—》软件(服务)

二、 PHP语法初步

PHP是一种运行在服务器端的脚本语言,可以嵌入到HTML中。

PHP代码标记

在PHP发展历史中,可以使用多种标记来区分PHP脚本

ASP标记:<%php 代码 %>

短标记:<?Php 代码 ?>

脚本标记:<script language="php">php代码</script>

标准标记(常用):<?php php代码?>

PHP注释

习惯:所有的代码在写的过程中都必须进行注释,对于初学者而言,注释就是个人学习和写代码的一个思路说明

PHP中注释分为两种:行注释和块注释

行注释:一次注释一行

​ //:后面跟的所有内容都是注释

​ #:与//一样

块注释:一次注释多行

​ /:中间直到/出现之前,全部都是注释

​ */

PHP语句分隔符

语句分隔符:在PHP中,代码是以行为单位,系统需要通过判断行的结束,该结束通常都是一个符号:分号“;”(英文状态下的分号)

定义

定义内容:

$a = 5;

echo ‘hello world’;

特殊说明:

  1. PHP中标记结束符?>有自带语句结束符的效果,最后一行PHP代码可以没有语句结束符

  2. ​ PHP中其实很多代码的书写并不是嵌入到HTML中,而是单独存在,通常书写习惯中就不建议使用标记结束符?>,PHP会自动从开始到最后全部认为是PHP代码,从而解析

变量

PHP是一种动态网站开发的脚本语言,动态语言特点是交互性,会有数据的传递,而PHP作为“中间人”,需要进行数据的传递,传递的前提就是PHP能自己存储数据(临时存储)

变量的基本概念

变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。变量可以通过变量名访问。在指令式语言中,变量通常是可变的。

  1. 变量是用来存储数据的;

  2. 变量是存在名字的;

  3. 变量是通过名字来访问的:数据;

  4. 变量是可以改变的:数据。

变量的使用

PHP中的所有变量都必须使用“$”符号

  1. 定义:在系统中增加对应的变量名字(内存)

  2. 赋值:可以将数据赋值给变量名(可以在定义的同时完成)

<?php
    //定义变量:在PHP中不需要任何关键字定义变量赋值
    //定义变量
    $var1;
	//定义变量同时赋值
	$var2=1;
	//访问变量然后输出,多个变量用逗号隔开
	echo $var2,$var1;
	//输出结果
	1,undefined
变量的命名规则
  1. 在PHP中变量名字必须以“$”符号开始;

  2. 名字由字母、数字和下划线“_”构成,但是不能以数字开头;

  3. 在PHP中本身还允许中文变量(不建议使用)。

预定义变量

预定义变量:提前定义的变量,系统定义的变量,存储许多需要用到的数据(预定义变量都是数组)

$_GET:GET方式提交的数据都会保存
$_POST:POST提交的数据都会保存
$_REQUEST:GETPOST提交的都会保存
$_GLOBALS:PHP中所有的全局变量
$_SERVER:服务信息
$_SESSION:session会话数据
$_COOKIE:cookie会话数据
$_ENV:环境信息
$_FILES:用户上传的文件信息
可变变量

可变变量:如果一个变量保存的值刚好是另外一个变量的名字,那么可以直接通过访问一个变量得到另外一个变量的值,在变量的前面多加一个$符号

$a='b';
$b='5';
echo $$a;
//结果是5
变量传值

将一个变量赋值给另外一个变量就叫变量传值

变量传值有两种:

  1. 值传递

    ​ 是将变量保存的赋值一份,然后将新的值给另外一个变量保存(俩个变量没有关系)

    $a=5;
    $b=$a;
    echo $b;
    //结果为:5
    
  2. 引用传递

    ​ 将变量保存的值所在的内存地址,传递给另外一个变量,俩个变量同时指向同一个内存空间(俩个变量是同一个值)

    $新变量=&$老变量;
    $a=7;
    //是把$a的地址给$b的俩个变量指向的是同一个内存
    $b=&$a
    echo $a,$b;
    //结果俩个变量都是7
    

    在内存中,通常有以下几个分区

    栈区:程序可以操作的内存部分(不存数据,运行程序代码),少但是快

    代码段:存储程序的内存部分(不执行)

    数据段:存储普通数据(全局区和静态区)

    堆区:存储复杂数据,大但是效率低

常量

常量与变量一样,都是来保存数据的

常量的基本概念

常量:const/constant,是一种在程序运行当中,不可改变的量(数据)

常量一旦定义,通常数据不可改变(用户级别)

常量可以在任何地方使用都可以。

常量的命名规则

​ 1. 常量不需要使用“$”符号,一旦使用系统就会认为是变量;

  1. 常量的名字组成由字母、数字和下划线组成,不能以数字开头;

  2. 常量的名字通常是以大写字母为主(与变量以示区别);

  3. 常量命名的规则比变量要松散,可以使用一些特殊字符,该方式只能使用define定义;

常量的定义形式

在PHP中常量有两种定义方式(5.3之后才有两种)

1、 使用定义常量的函数:define(‘常量名’,常量值);

//define('常量名字',常量值)
define('PI',3.14);
//使用方法,直接使用常量名
echo PI;

2、 5.3之后才有的:const 常量名 = 值;

//const 常量名=值;
const PI=3.14;
//使用方法,直接使用常量名
echo PI;
常量的使用形式

常量的使用与变量一样:不可改变值(在定义的时候必须赋值)

//定义特殊常量
define('-_-','smile');		//正确写法
const -_-='smile';  		//错误写法

有的时候还需要使用另外一种形式来访问(针对的是特殊名字的常量),需要用到另外一个访问常量的函数:constant(‘常量名’)

//特殊符号不能直接使用
echo -_-;		//错误
echo constant('-_-');		//正确

说明:常量和变量的使用

  1. 凡是数据会可能变化的,那么肯定是用变量

  2. 数据不一定会变的,可以使用常量或者变量(变量居多)

  3. 数据不允许被修改的,一定用常量

系统常量

系统常量:系统帮助用户定义的常量,用户可以直接使用

常用的几个系统常量

PHP_VERSION:PHP版本号

PHP_INT_SIZE:整形大小

PHP_INT_MAX:整形能表示的最大值(PHP中整形是允许出现负数:带符号)

在PHP中还有一些特殊的常量,他们有双下划线开始+常量名+双下划线结束,这种常量称之为系统魔术常量:魔术常量的值通常会跟着环境变化,但是用户改变不了

__DIR__:当前被执行的脚本所在电脑的绝对路径m

__FILE__:当前被执行的脚本所在的电脑的绝对路径(带自己文件的名字)

__LINE__:当前所属的行数

数据类型

数据类型:data type,在PHP中指的是存储的数据本身的类型,而不是变量的类型。PHP是一种弱类型语言,变量本身没有数据类型。

PHP的八种数据类型

在PHP中将数据分为三大类八小类:

简单(基本)数据类型:4个小类

整型:int/integer,系统分配4个字节存储,表示整数类型(有前提)

浮点型:float/double,系统分配8个字节存储,表示小数或者整型存不下的整数

字符串型:string,系统根据实际长度分配,表示字符串(引号)

布尔类型:bool/boolean,表示布尔类型,只有两个值:true和false

复合数据类型:2个小类

对象类型:object,存放对象(面向对象)

数组类型:array,存储多个数据(一次性)

特殊数据类型:2个小类

资源类型:resource,存放资源数据(PHP外部数据,如数据库、文件)

空类型:NULL,只有一个值就是NULL(不能运算)

类型转换

类型转换:在很多的条件下,需要指定的数据类型,需要外部数据(当前PHP取得的数据),转换成目标数据类型

在PHP中有两种类型转换方式:

1、 自动转换:系统根据需求自己判定,自己转换(用的比较多,效率偏低)

<?php
    $a='aa44';
	$b='333.22.11';
	echo $a+$b;		//结果是333.22

2、 强制(手动)转换:认为根据需要的目标类型转换

强制转换规则:在变量之前增加一个括号(),然后在里面写上对应类型:int/integer…

$a=3.14;
(int)$a;
(boolean)$a;

在转换过程中,用的比较多的就是转布尔类型(判断)和转数值类型(算术运算)

其他类型转布尔类型:true或者false,在PHP中比较少类型换变成false

其他类型转数值的说明

1、 布尔true为1,false为0;

2、 字符串转数值有自己的规则

2.1 以字母开头的字符串,永远为0;

2.2 以数字开头的字符串,取到碰到字符串为止(不会同时包含两个小数点)

类型判断

通过一组类型判断函数,来判断变量,最终返回这个变量所保存数据的数据类型(相同结果为true,失败为false):是一组以is_开头后面跟类型名字的函数:is_XXX(变量名)

Bool类型不能用echo来查看,可以使用var_dump结构查看

Var_dump(变量1,变量2…)

$a=3.14;
var_dump(is_int($a));
//结果bool(false)

还有一组函数可以用来获取以及设定数据(变量)的类型

gettype(变量名):获取类型,得到的是该类型对应的字符串

<?php
    $a=3.1415;
	echo gettype($a);		//结果是double类型

settype(变量名,类型):设定数据类型:与强制转换不同

<?php
    $a=3.14;
echo settype($a,'int');

1、 强制转换(类型)变量名,是对数据值复制的内容进行处理(不会处理实际存储的内容)

2、 settype会直接改变数据本身

整数类型

整数类型:保存整数数值(范围限制),4个字节存储数据,最大就是32位:42亿多。但是在PHP中默认是有符号类型(区分正负数)

在PHP中提供了四种整型的定义方式:十进制定义,二进制定义,八进制定义和十六进制定义

//定义四种整型数据
$a1= 120;		//10进制

$a2=0b110;	//2进制,以0b开头的

$a3=0120;		//8进制,以01开头的

$a4=0x120;	//16进制,以0x开头的
//php默认输出的都会自动转换成10进制输出

十进制:逢10进1,能够出现的数字是0-9

二进制:逢2进1,能够出现的数字是0-1

八进制:逢8进1,能够出现的数字是0-7

十六进制:逢16进1,能够出现的数字是0-9以及a-f,a表示10,依次类推

进制转换:手动转换

10进制转二进制:除2倒取余法

不管得到的结果如何,第一位数是判断正负值的,需要补足32位:前面补0:00000000 00000000 00000000 00001010

10进制转二进制:取出最大的2的N次方,直到结果为0

二进制到十进制之间的转换:从右侧开始,将对应的第几位作为2的指数,然后将所有的结果相加

PHP中不需要用户这么复杂的去计算,提供了很多的函数进行转换

<?php
    //dec 十进制
    //bin  二进制
    //hex  十六进制
    //oct   八进制
    decbin()  //这样写就是十进制转二进制,反过来就是二进制转十进制
//任意进制转换函数    
    base_convert(要转的数字,被转数字的进制,需要转换为什么进制);
base_convert(10,10,2);	//结果是1010,意思是10这个数是十进制转换为二进制
浮点类型

浮点型:小数类型以及超过整型所能存储范围的整数(不保证精度),精度范围大概在15个有效数字左右

浮点型定义有两种方式:

$f = 1.23;

$f = 1.23e10; //科学计数法,其中e表示底10

简单说明浮点数为什么同样的字节数存储数据,但是却能表示更大的数据呢?

00000000 00000000 00000000 00000000 ------> 11111111 11111111 11111111 1111111 (整形最大值:所有位都是有效数据)

浮点数:除开第一个数字1判断正负值的,后面的7个1算的结果是10的指数,后面三个字节存储表示具体数值

00000000 00000000 00000000 00000000 -----> 11111111 11111111 11111111 1111111

尽量不用用浮点数做精确判断:浮点数保存的数据不够精确,而且在计算机中凡是小数基本上存的都不准确

布尔类型

布尔类型:两个值true和false,通常是用于判断比较

<?php
    $a=true;
	$b=false;

在进行某些数据判断的时候,需要特别注意类型转换

empty():判断数据的值是否为“空”,不是NULL,如果为空返回true,不为空返回false

isset():判断数据存储的变量本身是否存在,存在变量返回true,不存在返回false

字符串类型

字符串类型就是一系列的字符组成串在一起的,

<?php
    //再定义简单的字符串使用单引号这种方法效率比较高
    $b=5;
	//单引号
    $a='ac{$b}v';
	echo $a;	//输出结果是ac{$b}v,单引号的字符串不能识别里面的变量
	//双引号
	$c="ac{$b}";
	echo $c; 	//结果是ac5,双引号可以识别里面的变量,要加大括号把变量括起来
	//注意:在单引号或者双引号里面如果想使用单引号或者双引号需要转义,在前面加一个\:
	例如:\',\";
	//定界符
	//aa是名字,前后名字必须一一样,后面一个名字前后不能有内容,前面不允许有空格,后面不允许有其他内容,
	这种方式声明的字符串里面可以使用双引号和单引号不需要转义
	$d=<<<aa
		asssfasfaf{$b}
aa;
字符串处理
  1. trim
//此函数返回字符串去除首尾空白字符后的结果,返回过滤后的字符串
$str='  faf  ';
var_dump(trim($str));
  1. strtoupper和strtolower
//字符串转大写
$str='abc';
var_dump(strtoupper($str));
//转小写
var_dump(strtolower($str));
  1. strpos
//查找字符串首次出现的位置
strpos(字符串,被查找的字符,从第几个开始查找);
  1. substr_count
substr_count(haystack,needle,[offset],[length]);
haystack
在此字符串中进行搜索。 
needle
要搜索的字符串。 
offset
开始计数的偏移位置。如果是负数,就从字符的末尾开始统计。 
length
指定偏移位置之后的最大搜索长度。如果偏移量加上这个长度的和大于 haystack 的总长度,则打印警告信息。 负数的长度 length 是从 haystack 的末尾开始统计的。 
  1. strstr
//返回 haystack 字符串从 needle 第一次出现的位置开始到 haystack 结尾的字符串。 
strstr(haystack,needle,[before_needle]);
haystack
输入字符串。 
needle
如果 needle 不是一个字符串,那么它将被转化为整型并且作为字符的序号来使用。 
before_needle
若为 TRUEstrstr() 将返回 needle 在 haystack 中的位置之前的部分。 
  1. str_replace
//该函数返回一个字符串或者数组。该字符串或数组是将 subject 中全部的 search 都被 replace 替换之后的结果
str_replace(要替换的字符或者数组,替换成的,要操作的数组或者字符串);
  1. htmlspecialchars
//htmlspecialchars — 将特殊字符转换为 HTML 实体
$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
echo $new; // &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;
  1. strip_tags
//strip_tags — 从字符串中去除 HTML 和 PHP 标记
$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>';
echo strip_tags($text);
echo "\n";

// 允许 <p> 和 <a>
echo strip_tags($text, '<p><a>');
  1. substr
//substr — 返回字符串的子串
substr(要截取的字符串,从第几个截取,要截取的个数,可选参数正数从前开始截取负数从后);
  1. explode
explode — 使用一个字符串分割另一个字符串,返回一个由字符串组成的数组
   explode(边界上的分隔字符,输入的字符串);
  1. str_split
str_split — 将字符串转换为数组
    str_split(输入的字符串,每一段的长度);
$str = "Hello Friend";

$arr1 = str_split($str);
$arr2 = str_split($str, 3);

print_r($arr1);	//每一个字符作为数组的一个元素
print_r($arr2);	//每三个字符作为数组的长度

运算符

运算符:operator,是一种将数据进行运算的特殊符号,在PHP中一共有十种运算符之多。

赋值运算符

赋值运算:符号是“=”,表示将右边的结果(可以是变量、数据、常量和其它运算出来的结果),保存到内存的某个位置,然后将位置的内存地址赋值给左侧的变量(常量)。

<?php
    $a=5;	//把5这个数字赋值给$a这个变量
算术运算符

算术运算:基本算术操作

+:执行数据累加

-:数据相减

*:键盘上没有乘法符号,使用*代替,两个数相乘

/:正斜杠代替,表示两个数相除

%:取余(模)运算,两个数(整数)相除,保留余数

在进行除法运算或者取余运算的时候,对应的除数(第二个数)不能为0

比较运算符

比较运算:比较两个数据的大小,或者两个内容是否相同,返回的结果都是布尔类型:满足返回true,不满足返回false

>:左边大于右边,返回结果true

>=:左边大于等于右边

<:左边小于右边

<=:左边小于或者等于右边

==:左边的与右边的相同(大小相同)

!=:左边的与右边的不同(大小不同)

===:全等于,左边与右边相同:大小以及数据的类型都要相同

!==:不全等于,只有大小或者类型不同

逻辑运算符

逻辑运算:针对不同的结果进行匹配。满足条件返回true,不满足返回false

&&:逻辑与,左边的条件与右边的条件同时成立(两边结果都为true)

||:逻辑或,左边的条件或者右边的条件只要有一个满足即可

:逻辑非,对已有条件进行取反,本身为true,取反结果就是false

逻辑与和逻辑或又称之为短路运算:如果第一个表达式结果已经满足条件了,那么就不会运行逻辑运算符后面的表达式:在书写代码的时候,尽量将出现概率最高的(能够直接判断出结果)的表达式放到第一位

连接运算符

连接运算:是PHP中将多个字符串拼接的一种符号

.:将两个字符串连接到一起

.= : 复合运算,将左边的内容与右边的内容连接起来,然后重新赋值给左边变量

<?php
    $a='333';
	$b='gg';
	echo $a.$b;		//结果是33gg
	$a.=$b;
	echo $a;		//结果是33gg
错误抑制符

在PHP中有一些错误可以提前预知,但是这些错误可能无法避免,但是又比希望报错给用户看,可以使用错误抑制符处理。

@:在可能出错的表达式前面使用@符号即可

@($a%0);	//由于不能使用0作为除数所以会警告,然后再前面加一个@就不会被警告
echo @($a /0);
三目运算符

三目运算:有三个表达式参与的运算(简单的的分支结构缩写)

语法格式:

表达式1 ? 表达式2 :表达式3;

运算:如果表达式1成立,那么执行表达式2,否则执行表达式3;

注意:如果表达式本身比较复杂,建议使用括号包起来。

<?php
    $a=5;
	$b=4;
	echo '<br/>';
	echo $a==$b ? 1 : 0;
自操作运算符

自操作:自己操作自己的运算符

++:在原来的值上+1

--:在原来的值上-1

在PHP中自操作符是可以放到变量前或者后:前置自操作和后置自操作

前置或者后置如果本身只有自操作,不参与其他运算(自操作同时),那么效果是一样的。但是如果自操作同时还参与别的运算,那么效果就不一样

后置自操作:先把自己所保存的值留下来,然后改变自己,自己给别人的值是原来的值;

前置自操作:先把自己改变,然后把改变后的值给别人。

<?php
$a = $b = 1;
echo ++$a,$b++;		//结果是2和1
echo $b;		//结果是2

衍生符号:类似自操作

+=:左边的结果与右边结果相加,然后赋值给左边

-=:左边的减去右边的结果,然后复制给左边

*=:乘法操作

/=:除法操作

%=:模操作

<?php
$a = 5;
echo $a *= 3;	//可以转换成:$a = $a * 3;  先算右边

计算机码

计算机码:计算机在实际存储数据的时候,采用的编码规则(二进制规则)

计算机码:原码、反码和补码,数值本身最左边一位是用来充当符号位:正数为0,负数为1

原码:数据本身从十进制转换成二进制得到的结果

​ 正数:左边符号位为0(正数的原码、反码和补码就是原码本身)

​ 负数:左边符号位为1

反码:针对负数,符号位不变,其他位取反

补码:针对负数,反码+1

系统中存在两个0:+0和-0

+0: 00000000

-0: 10000000 原码

取反 11111111

补码 00000000

位运算符

位运算:取出计算机中最小的单位(位bit)进行运算

&:按位与,两个位都为1,结果为1,否则为0

|:按位或,两个有一个为1,结果为1

~:按位非,一个位如果为1则变成0,否则反之

<<:按位左移,整个位(32位),向左移动一位,右边补0

>>:按位右移,整个位向右移动一位,左边补符号位对应内容(正数补0,负数补1)

注意:

1、 系统进行任何位运算的时候都是使用的补码

2、 运算结束之后都必须转换成原码才是最终要显示的数据

流程控制

流程控制:代码执行的方向

控制分类

顺序结构:代码从上往下,顺序执行。(代码执行的最基本结构)

分支结构:给定一个条件,同时有多种可执行代码(块),然后会根据条件执行某一段代码

循环结构:在某个条件控制范围内,指定的代码(块)可以重复执行

顺序机构

顺序结构:最基本结构,所有代码默认都是从上往下依次执行

分支结构

在PHP中,分支结构主要有两种:if分支和switch分支

if分支

If:如果的意思,给定一个条件,同时为该条件设置多种(两种)情况,然后通过条件判断来实现具体的执行段

基本语法:if分支PHP也提供多种方式来实现

最简if:只有一段代码,但是可以选择是否执行

If(条件表达式){//满足条件所要执行的内容; //顺序结构}

<?php
    $day='a';
	if($day=='b'){		//条件不满足不会执行if大括号里面的内容
        echo '哈哈哈'
    }
//基础if:有两面性,满足条件或者不满足条件都有对应的执行代码
if(条件表达式){
	//满足条件后执行的代码段;
}else{
	//不满足条件执行的代码段;
}
复杂if结构:在判断条件之后,通常就有两种结果:满足或者不满足,在不满足之后还可以再次进行条件判断
if(条件表达式1){
	//满足条件表达式1的代码段;
}elseif(条件表达式2){
	//不满足表达式1条件,但是满足表达式2的代码;
}//可以使用多个elseif来进行再次条件筛选
else{
	//全部不满足要执行的代码;
}

注意:如果条件特别多才会采用复合if形式

1、 如果条件比较单一(同一个条件),会采用elseif复合方式

2、 如果判断条件不一致,建议使用嵌套语法(不宜有太多层嵌套:影响代码美观)

If分支,适用于所有的条件判断(分支结构)

switch分支

switch分支:有一组情形存在,同过一条件,通常有多个值,但是每一个值都会有对应不同的代码要执行。

switch判断方式:是将条件放到分支结构内部判断

switch基本语法:

<?php
    $a=1;
	switch($a){			//switch括号里面的值是要求全等与case的值===
        case 1:
            echo 1;
            break;
        case 2:
            echo 2;
            break;
        default:
            echo '没有匹配的条件';
            break;
    }

If和switch的选择

1、 if能做所有的分支结构事情

2、 switch处理的是条件比较多,同时比较单一,而且是固定值匹配的分支结构

循环结构

循环结构:代码段在一定的控制下,可以多次执行

再PHP中循环结构有一下几种

for循环:通过条件、起始和终止判断执行

while循环:通过判断条件终止

do——while循环:跟while差不多

foreach循环:专门针对数组

for循环结构
//for循环基本语法
for(条件表达式1;条件表达式2;条件表达式3){
    //条件表达式1:定义初始化条件,可以有多种赋值语句存在,使用逗号分隔即可
	//条件表达式2:边界判定,限定循环执行的次数
	//条件表达式3:用来执行条件变化(自操作)
	//循环体
}
//如1+到100
$sum=0;
for($i=1;$i<=100;$i++){
    $sum+=$i;
}

For循环执行原理:

1、 执行条件表达式1:定义初始化条件(执行一次)

2、 执行条件表达式2:判断条件(N次)

​ 2.1 满足条件:执行循环体

​ 2.2 不满足条件:循环结束

3、 执行循环体:(N次)

4、 执行条件表达式3:循环变量变化(N次)

5、 执行条件表达式2:判断条件(N次)

6、 重复执行3-4-2步骤:直到第2步不满足条件结束循环

For循环中条件表达式1的多变量定义

while循环
while循环基本语法:

条件初始化;
while(条件表达式){
	//条件表达式就是判断边界条件
	循环体;		//循环条件的变化
}
//1+到100
$sum=0;
$i=1;
while($i<=100){
    $sum+=$i;
    $i++;
}

For与while的选择

1、 如果是基于固定已知条件(数值而且是有规律的变化),使用for循环

2、 while可以做灵活的条件判定(while使用的比较多)

do——while循环

do-while:看着很像while,while首先进行条件判定然后执行循环体,有可能出现第一次就条件不满足,那么就会直接失败(循环体一次都不执行)。do-while就是先干了再说(执行循环体),后判断条件。(至少会执行一次循环体)

do-while基本语法:
do{
	//循环体
}while(条件表达式);
//1+到100
$sum = 0;
$i = 1;
do{
    $sum+=$i;
    $i++;
}while($i<100)
循环控制

循环控制:在循环内部对循环本身进行控制

中断控制:重新开始循环,循环体中还有其他内容,也再执行

continue 层级; //默认是1(循环可以多层嵌套)

终止控制:循环直接结束

break 层级; //默认是1

因为循环经常性会碰到嵌套(循环中间包含循环),如果在循环内部有些条件下,明确可以知道当前循环(或者说外部循环)不需要继续执行了,那么就是可以使用循环控制来实现:其中内部循环也可以控制到外部,就是通过使用层级参数。

continue 2; //当前自己循环后面内容不再执行,同时外部循环如果还有循环体也不再执行,重新来过;

break 2; //当前自己循环结束,同时外部也结束(如果还有外部不受影响,继续执行)

流程控制替代语法

流程控制替代语法:分支和循环结构的替代语法

PHP本身是嵌入到HTML中的脚本语言,需要在HTML中书写一些关于判断或者循环的结构语法,必须符合PHP标签规范,需要HTML与PHP进行混搭,如果使用原始的PHP代码那么会非常不美观。

//打印九九乘法表
<table border=1>
     <?php for($i = 1;$i < 10;$i++){?>
     <tr>
         <?php for($j = 1;$j < $i;$j++){?>
         <td>
           <?php echo $j.' * '.$i.' = '.$i*$j;?>
         </td>
         <?php }?>
     </tr>
     <?php }?>
 </table>

在PHP书写到HTML中的这些大括号{}非常不美观,所以PHP提供了一种替代机制,让其可以不用书写大括号:

PHP中具体有哪些替代语法呢?PHP应该在HTML中只做数据输出,输出通常伴有条件判断和循环操作,因此PHP提供了对应分支结构和循环结构的替代语法:全部都是对应的一个模式:

左大括号{使用冒号替代:

右大括号}使用end+对应的起始标记替代

//替代大括号之后的九九乘法表
<table border=1>
     <?php for($i = 1;$i < 10;$i++):?>
     <tr>
         <?php for($j = 1;$j < $i;$j++):?>
         <td>
           <?php echo $j.' * '.$i.' = '.$i*$j;?>
         </td>
         <?php endfor?>
     </tr>
     <?php endfor?>
 </table>

函数

函数的基本概念

函数:function,是一种语法结构,将实现某一个功能的代码块(多行代码)封装到一个结构中,从而实现代码的重复利用(复用)。

函数的命名规范

名规范:由字母、数字和下划线组成,但是不能以数字开头

函数作为一种常用的结构,一般遵循以下规则:函数通常名字代表着函数的功能,而有些功能会比较复杂,可能一个单词不足以表达,需要多个组合。

  1. 驼峰法:除了左边第一个单词外,后面所有的单词首字母都大写:showParentInfo()

  2. 下划线法:单词之间通过下划线连接,单词都是小写:show_parent_info()

函数名字:在一个脚本周期中,不允许出现同名函数(通常在一个系统开发中都不会使用同名函数)

函数的参数

函数的参数分为两种:形参和实参

形参

形参:形式参数,不具有实际意义的参数,是在函数定义时使用的参数

实参

实参:实际参数,具有实际数据意义的参数,是在函数调用时使用的参数

形参是实参的载体:实参在调用时通常是需要传入到函数内部参与计算(运算),那么需要在函数内部去找到实际数据所在的位置才能找到数据本身:需要实际调用的时候,将数据以实参的形式传递给形参:给形参赋值,从而使得函数内部可以用到外部数据。

注意:

  1. 在PHP中允许实参多余形参(个数):函数内部不用而已

  2. 在PHP中理论上形参个数没有限制(实际开发不会太多)

  3. 实参不能少于形参个数

函数定义语法

函数有几个对应的关键点:function关键字、函数名、参数(形参和实参)、函数体和返回值,函数不调用自己不执行。

定义函数的目的:是为了实现代码的重复利用,一个功能一个函数(简单明了)

//函数的语法
//参数和返回值可以没有,默认的返回值是null
function 函数名(形参数1,形参数2,……){
    //函数体
    //函数返回值,使用return 结果
}
//例如
function add(a,b){
    return a+b;
}
//函数的调用
函数名(实参1,实参2,……);
add(5,6);
函数参数传递
按值传递参数

默认的传递参数的形式

对形式参数进行操作,不会影响到变量参数的值,两个之间没有联系

<?php
    $a=5;
	function test($b){
        echo ++$b;
    }
    echo test($a);		//结果是6
    echo $a;			//结果是5
按引用传递参数

按引用传递参数,相当于俩个变量名字指向的是同一个地址,形参和实参相等,只要改变形参实参也会被改变。

<?php
    $a=5;
	function test(&$b){
        echo ++$b;
    }
    echo test($a);		//结果是6
    echo $a;			//结果是6
函数参数的默认值

可以给形式参数设置默认值,设置方法直接给形参赋值,如果没有传递实参就会按照默认的形参的值进行操作

<?php
	function test($b=2){
        echo ++$b;
    }
    echo test();	//a因为没有传递实参所以就按照默认的形参等于2进行++,结果是3
可变长度参数列表

PHP给我们提供的,可以直接使用

  1. func_get_args();
<?php
	function test(){
    //可以拿到传递过来的所以参数以数组的形式
       var_dump(func_get_args());   
    }
    test(1,2,3,'dfsdg');
  1. func_get_arg();
<?php
	function test(){
    //可以获取传递过来的参数从0开始数,括号里面填要获取的参数是第几个
       var_dump(func_get_arg(0));    
    }
 test(1,2,3,'dfsdg');
  1. func_num_args();
<?php
	function test(){
    //返回所在自定义函数的传递过来的参数有几个
       var_dump(func_num_args());   
    }
 test(1,2,3,'dfsdg');
可变函数

直接把函数赋值给变量就叫可变函数

<?php
    //解决中文会在浏览器上乱码问题
    header("Content-type:text/html;charset=utf-8");
	function test(){
       echo '我是函数哈哈哈';   
    }
    $a='test';	//将一个函数的名字赋值给一个变量,但是函数的名字要加引号
    echo $a();	//变量加上一个括号就可以调用函数
内置函数

PHP提供给我们许多现场的函数或者结构,可以直接使用,还有一些函数需要开启特定的PHP扩展模块,否则不能使用。

PHP变量范围

局部变量

局部变量就是在函数内部声明的变量,在函数外面不能使用。

function test(){
    $a=5;
}
echo $a;	//错误,在函数外面不能使用		
全局变量

就是在函数外面声明的变量就叫全局变量,函数内部无法直接使用全局变量,如果需要使用,就必须用global声明变量。

$a=5;
function test(){
    global $a;
    echo $a;
}
静态变量

静态变量是指在函数内部定义变量的时候使用了static关键字来定义变量,特点函数执行完毕后不好立即消失,当再次执行函数的时候会初始化值。

function test(){
    static $a=1;	//只会在第一次执行函数的时候才会执行这句代码
    $a++;	
}
//调用第一次的时候是1
test();
//调用第二次的时候是2,因为这个变量不会被销毁
test();

数组

数组分类
  1. 索引数组

索引值为整数的数组就叫索引数组

  1. 关联数组

索引值为字符串类型的数组就叫关联数组

数组的创建

PHP中创建数组非常灵活,不需要指定数组的长度,可以在数组里面存放任何数据类型。

//第一种创建方式,中括号里面不写索引默认从0开始递增
$数组名[]=;
$arr1[]=555;
$arr1[]=444;
$arr1[]='啦啦啦';
//使用print_r();这个方法可以打印数组或者var_dump();
print_r($arr1);
//第二种
$数组名[索引值]=;
$arr2[0]=66;
$arr2[1]=55;
//这种叫关联数组,他的索引是字符串
$arr2['name']='张三';
//第三种array()这种语言结构创建数组
$数组名=array(1,2,……);
$arr3=array(1,5,9,8);
//第四种
$数组名=array(索引值=>1,索引值=>2……);
$arr4=array(
	0=>5,
    1=>6,
    2=>7
);
$arr4=array(
	'name'=>'张三',
    'age'=>18
);
//第五种
$数组名=[1,2];
$arr5=[4,5];
使用数组
//一维数组
数组名称[索引值];
echo $arr1[0];
//多维数组
数组名称[索引值][索引值];
echo $arr1[0][1];
遍历数组
第一种
//使用for循环遍历,但是只能遍历普通数组,不能遍历关联数组
$arr=array(5,6,48,8);
//count()函数可以获取到数组的长度
for($i=0;$i<count($arr);$i++){
    echo $arr[$i];		//结果5、6、48、8
}
第二种
foreach(要遍历的数组名 as [数组的索引]=>当前数组的值){
    
}
//这种可以遍历关联数组
$arr=array(5,4,8);
foreach($arr as $key=>$value){	//key是可选参数
    echo $value;		//结果 5、4、8	
}
//遍历二维数组
$arr=[
   'a',
   'b',
   'c',
   $arr1=[
      1,
      2,
      3
   ],
   5,
   $arr2=[56,7]
];
foreach($arr as $val){
   if(is_array($val)){	//判断是不是数组类型
      foreach($val as $value){
         echo $value;
      }
   }else{
      echo $val;
   } 
}
处理数组的相关函数

具体的可以参考PHP手册

  1. array_count_values
//统计数组中所有的值返回一个数组数组的键是array理的单元值,值是array单元里面出现的次数
$array=array(1,"hello",1,"hello","world");
print_r(array_count_values($array));
//结果
Array
(
    [1] => 2
    [hello] => 2
    [world] => 1
)
  1. array_key_exists
//检查数组是否在指定的键名或索引,返回值是boolean类型
$array=array('first'=>5);
$a=array_key_exists('first',$array);
echo $a;
//结果是true
  1. array_search
//在数组中搜索给定的值,如果成功则返回首个相应的键名,否则返回false
$arr=array(8,5,9);
var_dump(8,$arr);
//结果是0,8这个数字的键是0
  1. count
//count一种数组中的单元数目,或对象中的属性个数,可以返回数组的长度
$arr=array(1,3,5);
//结果是3,数组里面有三个元素
var_dump(count($arr));
  1. asort
//asort一组数组进行排序保持索引关系,返回值true(排序成功)或者false(排序失败)
$arr(5,6,8,1);
//排序默认从小到大
var_dump(asort($arr));
  1. in_array
//in_array检查数组中是否存在某个值,返回boolean类型
$os = array("Mac", "NT", "Irix", "Linux");
if (in_array("Irix", $os)) {
    echo "Got Irix";
}
if (in_array("mac", $os)) {
    echo "Got mac";
}
  1. list
//list不是真正的函数1,而是语言结构,把数组中的值赋给一组变量,他是以相反的顺序赋值
$arr=array('h','e','f','k');
list($a,$b,$c,$d)=$arr;

正则表达式

正则表达式描述了一类字符串的特征,通过特征于特定的函数配合对其他的字符串进行匹配、查找、替换及分割。

定界符

一般用正斜线作为定界符的字符,还可以使用#、!、{}、|都可以作为定界符,前后一致

普通字符

比如:az、AZ、0~9、双引号、单引号,他们没有特殊的含义。

元字符

\d:匹配任意0~9的十进制数字。

\D:匹配除了0~9之外的任意一个字符

\s:匹配任意一个空白字符,比如换页符、换行符、制表符、垂直制表符

\S:匹配除空白字符以外的任何一个字符

\w:匹配任意一个数字或字母或下划线

\W:匹配除字母或数字或下划线以外的任意字符

.:匹配除换行符以外的任意字符

*:匹配0次或1次或多次前面的字符

+:匹配一次或多次其前面的字符

:匹配0次或者1次前面的字符

{n}:表示其前面字符恰好出现n次

{n,m}:表示其前面的字符至少出现n次,最多出现m次

^或\A:匹配字符串开始位置

$或\Z:匹配字符串结束位置

|:匹配俩个或多个模式

[]:匹配方括号中的任意一个字符

[^]:匹配除括号里面的字符

():将括号中的作为一个整体以便将其中的内容获取到

模式修正符

模式修正符是在正则表达式的定界符之后使用的,可以调整正则表达式的解释,扩展正则表达式在匹配、替换等操作式的某些功能,增强正则表达式的处理能力

i:模式进行匹配时不区分大小写

m:目标字符串中必须包含"\n",正则表达式中必须要出现^或者$,多行匹配

s:如果设定了这个修正符,那么.将匹配所有的字符包括换行符

U:禁止贪婪匹配

与正则表达式配合的函数
  1. preg_match()
//参数说明
第一个参数:正则表达式
第二个参数:目标字符串
第三个参数:放一个变量,执行完后,里面有匹配部分以及一些数据,可选
第四个参数:可以传PREG_OFFSET_CAPTURE那么第三个参数的变量里面的变量数据就会有匹配的部分偏移值,默认传的是0    
地五个参数:可以传一个值,来表示目标字符串的那个位置开始搜索(单位是字节),可选 
  1. preg_match_all()
第一个参数:正则表达式
第二个参数:目标字符串
第三个参数:放一个变量,执行完后,里面有匹配部分以及一些数据
  1. preg_replace
参数说明
    第一个参数:正则表达式
    第二个参数:要替换成的字符串
    第三个参数:目标字符串
    第四个参数:默认是-1,就是替换所有符号特征部分,可选
    第五个参数:存储替换次数的变量,可选

日期与时间

设置时区
//括号里面写需要的时区
date_default_timezone_set('Asiz/shanghai');
获取当前时间的Unix时间戳
//此函数可以获取当前时间的秒数,返回自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。 
time();
获取指定时间的Unix时间戳
mktime — 取得一个日期的 Unix 时间戳
    mktime(时,分,秒,月,天,年);
格式化日期
date — 格式化一个本地时间/日期,格式字串可以识别以下 format 参数的字符串
    第一个参数填写format字符串也就是要转化成什么样的格式,常用的格式'Y-m-d H:i:s',年月日时分秒
    第二个参数填写Unix时间戳,可选参数,如果不填就默认是当前时间
    date('Y-m-d H:i:s');
获取Unix时间戳和微妙数
microtime — 返回当前 Unix 时间戳和微秒数
    返回的一个字符串前面是微秒数,后面的是Unix时间戳
    如果加一个参数true,则返回一个float类型的时间戳加上微秒数的值
    microtime();

图像处理

在PHP中可以通过GD扩展库实现对图像的处理,不仅可以创建图像,而且还可以处理已有图像

创建图像的基本步骤
  1. 创建图像

所有的绘图设计都需要在一个图像上完成,以后的操作都将基于这个图像

//括号里面第一个参数是图像的长第二个是宽单位是px
$img=imagecreatetruecolor(200,200);//这样就表示创建了一个长200px宽200px的图像
  1. 绘制图像

图像完成后,可以通过这个图像资源,使用各种画像函数设置图像的颜色、填充画布、画点、线段、各种几何图形以及向图像添加文字

//为一副图像分配颜色,第一个参数填创建的图像,后面三个参数是以rgb的形式填写颜色
$color1=imagecolorallocate($img,100,100,100);
  1. 输出图像

完成图像绘制之后,需要将图像以某种格式保存到服务器的文件中,或者直接输出到浏览器上显示,一定要使用header()函数发送Content——type告诉浏览器是图片

//告诉浏览器是图片
header('Content-type:img/jpeg');
//区域填充
//第一个参数是资源类型的就是创建的图像
//第二个和第三个参数图像x轴和y轴
//第三个图像是要填充的颜色
imagefill($img,0,0,$color);
//以jpeg格式的图片输出
imagejpeg($img);

//可以保存图片
第一个是参数是图片
第二个参数是要保存到的路径,路径是和当前文件同级,或者使用‘/’根目录
第三个是图像的画质0~100的数值
imagejpeg($img,'a.jpeg',75);
  1. 释放资源
//— 销毁一图像,释放与image关联的内存
imagedestroy($img);
图片验证码
<?php
header('Content-type: image/jpeg');
//图片的宽和高
$height=50;
$with=120;
//使用随机数随机生产出a~z的小写的ascll值
$string='';
for($i=0;$i<4;$i++){
    $string.=chr(rand(97,122));
}
//创建图片
$img=imagecreatetruecolor($with,$height);
//分配随机颜色背景的
$colorbg=imagecolorallocate($img,rand(200,255),rand(200,255),rand(200,255));
//分配颜色给文字
$colorString=imagecolorallocate($img,rand(10,100),rand(10,100),rand(10,100));
//填充背景颜色
imagefill($img,0,0,$colorbg);
//画矩形边框
imagerectangle($img,0,0,$with-1,$height-1,imagecolorallocate($img,rand(200,255),rand(200,255),rand(200,255)));
// 画线段
for($i=0;$i<4;$i++){
    imageline($img,rand(0,$with/2),rand(0,$height/2),rand($with/2,$with),rand($height/2,$height),imagecolorallocate($img,rand(100,200),rand(100,200),rand(100,200)));
}
//画点
for($i=0;$i<100;$i++){
    imagesetpixel($img,rand(0,$with),rand(0,$height),imagecolorallocate($img,rand(100,200),rand(100,200),rand(100,200)));
}
//在图片中插入文字
imagettftext($img,rand(14,20),rand(-5,5),rand(10,35),rand(20,40),$colorString,'D:\server\wamp64\www\fonts\Inkfree.ttf',$string); 
// imagestring($img, 5, 0, 0, $string, $colorString);
imagejpeg($img);
imagedestroy($img);
图片水印
文字水印
<?php
//设置响应头是图片
header('Content-type:image/jpeg');
//获取本地要加水印的图片
$img=imagecreatefromjpeg('img/play.jpg');
//要加水印的图片的宽还有高
$imgWidth=imagesx($img);
$imgHeight=imagesy($img);

//分配颜色
$colorText=imagecolorallocate($img,255,0,0);
//测量文字的大小,realpath函数可以返回相对路径的的绝对路径的形式,返回文字四个角的位置
$text=imagettfbbox(100,rand(-5,5), realpath('fonts\Inkfree.ttf'),'hello');
$textWidth=$text[2]-$text[0];
$textHeight=$text[1]-$text[7];
//给图片加上文字水印
imagettftext($img,100,rand(-5,5),$imgWidth-$textWidth-$imgWidth/5,$imgHeight-$textHeight-$imgHeight/5,$colorText,realpath('fonts\Inkfree.ttf'),'hello');
//输出图片
imagejpeg($img);
//销毁图片
imagedestroy($img);
图片水印
<?php
//设置响应头是图片
header('Content-type:image/jpeg');
//获取本地要加水印的图片
$img=imagecreatefromjpeg('img/play.jpg');
//获取本地要加水印图片的宽度和高度
$imgWidth=imagesx($img);
$imgHeight=imagesy($img);
//获取水印图片
$imgwater=imagecreatefrompng('img/water.png');
//获取水印图片的宽度和高度
$waterWidth=imagesx($imgwater);
$waterHeight=imagesy($imgwater);
//把水印图片添加到要加水印的图片上
// imagecopy($img,$imgwater,$imgWidth-$waterWidth-$imgWidth/10,$imgHeight-$waterHeight-$imgHeight/10,0,0,$waterWidth,$waterHeight);
//这个函数可以设置透度,
imagecopymerge($img,$imgwater,$imgWidth-$waterWidth-$imgWidth/10,$imgHeight-$waterHeight-$imgHeight/10,0,0,$waterWidth,$waterHeight,50);
//输出图片
imagejpeg($img);
//销毁图片
imagedestroy($img);
图片缩放和裁剪
图片缩放
<?php
//设置响应头是图片
header('Content-type:image/jpeg');
//获取要缩放的图片
$img=imagecreatefromjpeg(realpath('img/play.jpg'));
//获得要缩放图片的宽和高
$imgWidth=imagesx($img);
$imgHeight=imagesy($img);
//要缩放的成多少的宽度和高度
$width=400;
$height=$width/$imgWidth*$imgHeight;
//创建一个图片
$img1=imagecreatetruecolor($width,$height);

//缩放图片的函数
imagecopyresampled($img1,$img,0,0,0,0,$width,$height,$imgWidth,$imgHeight);
//将裁剪后的图片输出
imagejpeg($img1);
//然后进行销毁
imagedestroy($img1);
图片裁剪
<?php
//设置响应头是图片
header('Content-type:image/jpeg');
//获取要裁剪的图片
$img=imagecreatefromjpeg(realpath('img/play.jpg'));
//创建一个图片
$img1=imagecreatetruecolor(500,500);
//裁剪图片的函数
//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 )
imagecopy($img1,$img,0,0,100,100,400,400);
//将裁剪后的图片输出
imagejpeg($img1);
//然后进行销毁
imagedestroy($img1);

文件操作

判断普通文件和目录
  1. is_file()判读给定的文件名是否为一个正常的文件
var_dump(is_file(realpath('../index.php')));//返回一个布尔值,如果是文件就是true如果是目录就是false
  1. is_dir()判读给定的文件名是否为一个目录
var_dump(is_dir(realpath('zoom.php')));//返回一个布尔值,如果是文件目录就是返回true
文件的属性
  1. file_exists()检查文件见或者目录是否存在
var_dump(file_exists(realpath('zoom.php')));//返回一个布尔值,如果存在就是true
  1. filesize()取得普通文件大小
var_dump(filesize(realpath('zoom.php')));//返回文件的大小单位是字节,如果出错就是false
  1. is_readable()判读给定文件是否可读
var_dump(is_readable(realpath('zoom.php')));//如果文件可读返回true
  1. is_writable()判读给定文件是否可写
var_dump(is_writable(realpath('zoom.php'));//如果文件可写返回true
  1. filectime()获取文件的创建时间
$time=filectime(realpath('zoom.php'));
echo date('Y-m-d H:i:s',$time);
  1. filemtime()获取文件修改时间
$time=filemtime(realpath('zoom.php'));
echo date('Y-m-d H:i:s',$time);
  1. fileatime()获取文件上次访问时间
$time=fileatime(realpath('zoom.php'));
echo date('Y-m-d H:i:s',$time);
  1. stat()获取文件大部分属性值
$file=stat(realpath('test.php'));
var_dump($file);//以数组的形式存储的
目录的基本操作
  1. basename()返回路径中的文件名部分
var_dump(basename('D:\server\wamp64\www\demo1\test.php'));//结果是test.php
  1. dirname()返回路径中的目录部分
var_dump(dirname('D:\server\wamp64\www\demo1\test.php'));
//结果:'D:\server\wamp64\www\demo1
  1. pathinfo()返回文件路径的信息
var_dump(pathinfo('D:\server\wamp64\www\demo1\test.php'));
//返回一个数组,里面存放文件的名字,文件的后缀,文件的目录等等
  1. opendir()打开目录句柄
$dh=opendir('D:\server\wamp64\www\demo1');
//readdir()从目录句柄中读取条目,返回目录中下一个文件的文件名
var_dump(readdir($dh)); 
var_dump(readdir($dh));
var_dump(readdir($dh));
//closedir()倒回目录句柄 
var_dump(closedir($dh));
  1. mkdir()新建目录
//第一个参数是要创建的目录
//第二个参数是目录的权限
//第三个参数默认是false,写true就可以创建文件夹里面在包含文件
mkdir('c/b',0777,true);
  1. rmdir()删除指定的空目录
rmdir('路径');
  1. scandir()列出指定路径中的文件和目录
scandir('路径');
文件的基本操作
  1. fopen()打开文件或者URL

  2. fread()读取文件

  3. fgets()从文件指针中读取一行

  4. feof()测试文件指针是否到了结束的位置

  5. fseek()定位文件指针的位置

  6. fwrite()写入文件,会把写入东西的地方被替换掉

  7. flock()轻便的咨询文件锁定

  8. ftruncate()将文件截断到给定的长度

  9. fclose()把整个文件读入一个数组

  10. copy()拷贝文件

  11. unlink()删除文件

  12. file_get_contents()将整个文件读入一个字符串

  13. file_put_contents()将字符串写入文件中

  14. rename()重命名文件或目录

  15. readfile()读入一个文件并写入到输出缓冲

$file=fopen('文件路径或者url','打开文件是只读还是写等等');
fread($file,读取多少字节);//在utf-8中中文占3个字节,英文1个,第二个参数是可选的
fgets($file);//文件指针就是光标,测试读取的文件有没有读到最后一个
fseek($file,偏移的字节,在文件的那个位置);
第三个参数可以填的
SEEK_SET - 设定位置等于 offset 字节。
•SEEK_CUR - 设定位置为当前位置加上 offset。
•SEEK_END - 设定位置为文件尾加上 offset。
最后文件指针的位置是第三个参数加上第二个参数的字节
fwrite($file,'要写入的文字');
文件上传

文件上传的过程这些细节都是自动的,上传的文件默认是放在一个临时目录里面的,只需要把上传上来的文件移动到需要的地方就行了

  1. form标签需要做的上传设置

    1. method设置为post
    2. enctype设置为multipart/form-data
  2. php配置文件

    配置项 默认值 功能

    1. file_upload On 确定服务器上的php脚本是否可以接受HTTP文件上传
    2. memory_limit 8M 设置脚本可以分配的最大内存量,防止失控脚本独占内存
    3. upload_max_filesize 2M 现在PHP处理上传文件的最大值,此值必须小于post_max_size值
    4. post_max_size 8M 限制通过post方法可以接受的信息最大量
    5. upload_tmp_dir null 上传文件存放的临时路径,可以是绝对路径,这个目录对于拥有此服务器进程用户必须是可写的,上传文件在处理之前必须成功传输到服务器
  3. 服务器端处理文件的相关信息
    $FILES['file']['name'] 客户端机器文件的原名称,包含扩展名
    $FILES['file']['size'] 已上传文件的大小,单位字节
    $FILES['file']['tmp_name'] 文件上传之后,在服务器端存储的临时文件名
    $FILES['file']['error'] 文件上传时产生的错误,0代表没有发生任何错误,1代表上传文件超出大小在PHP配置文件中可以设置upload_max_filesize 的值,2表示上-/传文件大小超出HTML表单中MAX_FILE_SIZE选项所指定的值,3代表文件只有一部分被上传,4代表没有上传任何文件

  4. PHP上传处理函数,用于上传文件的后续处理

    is_uploaded_file()判读指定文件是否通过HTTP POST上传的

    move_uploaded_file()文件上传后,首先存储于服务器的临时目录中,可以使用函数将上传文件移动到新位置

    <?php
    //设置响应头
    header('Content-type:text/html;charset=utf8');
    var_dump($_FILES);
    // var_dump($_POST);
    //判读有没有点击开始上传按钮只需要判读那个变量是不是存在
    if(isset($_POST['mysubmit'])){
        //判读是不是通过HTTP post上传的
        if(is_uploaded_file($_FILES['myfile']['tmp_name'])){
            //获取到上传的文件的后缀名
            $arr=pathinfo($_FILES['myfile']['name']);
            //获取当前时间加四位数的随机数用于作上传文件保存的后缀名
            $new_name=date('YmdGis').rand(1000,9999);
            //移动上传文件的函数
            move_uploaded_file($_FILES['myfile']['tmp_name'],"uploads/{$new_name}.{$arr['extension']}");
            echo '恭喜你上传成功';
        }else{
            exit('可能被攻击');
        }   
    }
    ?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>文件上传</title>
    </head>
    <body>
        <form action="" method="post" enctype="multipart/form-data">
            <input type="file" name="myfile" id="">
            <input type="submit" name="mysubmit" value="开始上传">
        </form>
    </body>
    </html>
    
    
文件下载
  1. 发送指定文件MIME类型的头信息,通过finfo函数

header('Content-type:MINE类型')

  1. 指定下载文件描述

header('Content-type:attachement;filename=文件名称')

  1. 指定下载文件的大小

header('Contnet-Lengh:文件大小')

  1. 读取文件内容至输出缓存区

readfile()

<?php
//获取通过git方式参数文件名和后缀
$filename=$_GET['filename'];
//下载地址
$file_dir='uploads/'.$filename;
$finfo=finfo_open(FILEINFO_MIME_TYPE );
$mimeType=finfo_file($finfo,$file_dir);
finfo_close($finfo);
//发送指定的文件MIME类型的头信息
header('Contnet-type:'.$mimeType);
//指定下载文件的描述
header('Content-type:attachement;filename='.basename($file_dir));
//指定下载文件的大小单位字节
header('Content-Lenght:'.filesize($file_dir));
//读取文件内容输出至缓冲区
readfile($file_dir);

PHP 会话控制

cookie

PHP cookie 常用于识别用户。 Cookie 是什么? cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。 cookie 常用于识别用户。

使用cookie
<?php
    //语法,创建出来的cookie是存放在$_COOKIE这个里面以数组的形式存储
    setcookie(name, value, expire, path, domain)
    //基本用法
    setcookie("name", "ljj", time()+3600);//创建了一个名为name值为ljj的cookie,一个小时后过期
	//获取cookie
	echo $_COOKIE['name'];
	//删除cookie,删除cookie的时候要和设置cookie的参数相同
	setcookie('name','',time()-1);//这样就删除了name这个cookie,只有把过期时间改为过去的时间就行了
session

PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的,必须为与html标签之前

开启session
//开启session
session_start();
//存储session数据
$SESSION['name']='zhang';
使用session数据
//先调用这个开启session的函数
session_start();
echo $SESSION['name'];
删除csession
//删除session相关的变量,使用这个函数,里面写上session的变量
unset($_SESSION['name']);1 
//销毁全部的session数据
session_destroy();
//删除session创建的时候产生的cookie,session_name()函数可以获取session会话的名称或者设置
setcookie(session_name(),'',time()-1,'/');

页面包含

可以将一个网页文件的内容插到另一个PHP文件之中,在服务器执行之前,会获取指定文件中的所有代码

include和require语句不同之处在于它的错误处理方式,如果用include语句引用某个文件并且php无法找到它,则只生成警告,脚本会继续往下执行,而require会报错终止脚本的执行

include require
include '';
require '';
include_once require_once

和前俩个一样的用法,只是这俩个会检查文件是否已经被包含过了,如果是就不会在此包含,只能在当前文件被引用一次

include_once '';
require_once '';

面向对象

类是一种用来抽象化描述对象的数据类型,其定义包含了数据的形式以及对数据的操作,也就是类的属性和方法

类用class来声明

类的属性声明时由关键字public、protected或private开头

class Student{
	//声明属性
    	public $stuName = 'Cathy';
    //声明方法
        public function displayName(){
            echo $this->stuName;
        }
}

构造函数和析构函数

构造函数是一种特殊的方法,他在这个类被实例化为新的对象时调用,用于对象的初始化,即为对象的属性赋初始值,构造函数以__construct()表示。

析构函数与构造函数相反,是当对象被销毁的时候调用,析构函数名称为__destruct(),系统会自动执行析构函数。由于PHP本身会在程序执行介绍时自动清理所有资源,所以程序中一般不会显示声明析构函数

class MyClass{
    public $name;
    function __construct($par){
        $this->name = $par;
    }
    function __destruct(){
        print "$this->name
    }
}

类的访问修饰符

访问修饰符:用于控制属性或方法的访问范围

有公有的(public):允许类的使用者从外部进行访问

受保护(protected):允许自身及其子类和父类访问

私有的(private):私有成员只有该类的成员可以访问

对象

$this,在类中代表自身的对象

class Animal {
    public $weight;
    function __construct($w){
        $this->weight = $w;
    }
    public function sayHello(){
        echo "Animal say Hello";
        ehco $this->weight;
    }
}
//调用构造函数生成类的对象
$animal = new Animal(10);
$animal->sayHello();

类的属性或方法可以通过static关键字来声明为静态的属性或者方法可以不实例化类直接访问, 静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直到整个程序运行结束。

类名::属性名称;
类名::方法名
//如果是从类的内部进行访问,可以使用self来替换类名

继承

子类自动共享父类数据结构和方法的机制,使子类继承父类的特性和能力

//父类
class Parent{
    public function display(){
        echo "我是父类";
    }
} 
//子类
class Child extends Parent{
    
}
$child = new Child();
$child->display();

接口

面向对象编程的一个重要特点就是多态,接口使用interface关键字来定义,其语法类似与定义一个标准的类,接口中定义的所有方法都必须是公有的,而且所有的方法都是空,声明接口的语法格式

interface 接口名称{
    public function 方法名称1();
    public function 方法名称2();
}

类使用implements关键字来实现,此时,类定义的方法必须和接口中的方法完全一致,并且必须提供接口所有方法的实现,一个类可以同时实现多个接口,多个接口名称之间以逗号隔开

class 类名称 implements 接口名称{
    public function 方法名称1(){
        
    } 
    public function 方法名称2(){
        
    }
}

抽象类

​ 抽象类包含抽象方法,抽象方法只是声明了方法名,调用方式和参数,但并不定义具体的功能实现,抽象类不能被实例化,它用于继承,子类在继承一个抽象类的时候,必须实现父类中的所有抽象方法,而且这些方法的访问控制必须和父类中的访问控制一致。抽象类抽象方法一般都用abstract关键字来声明,一个类中只要有一个方法被定义为抽象方法,那么该类就必须定义为抽象类。

//定义抽象类
abstract class Animal{
    abstract function Hello();
}
//定义dog继承Animal类
class Dog extends Animal{
    public function Hello(){
        echo "dog say hello";
    }
}
//定义cat继承Animal类
class Cat extends Animal{
    public function Hello{
        echo "cat say hello";
    }
}
//定义一个类根据不同对象执行对应子类的方法
class GreenAnimal {
    public function SayHello($obj){
        $obj->Hello();
    }
}

$aAnimal = new GreenAnimal();
$aAnimal->SayHello(new Dog());//执行dog类的方法
$aAnimal->SayHello(new Cat());//执行cat类的方法

PHP访问数据库

连接MySQL数据库

创建一个连接数据库的文件connect.php

//实例化MySQLi类
$db = new mysqli("localhost","root","密码","数据库");
//检查连接
if($db->connect_error){
    //退出数据库并显示提示信息
    exit("数据库连接失败");
}

获取结果

query

​ query()调用后将根据执行情况返回值,如果操作失败了,则返回false,如果成功则返回一个结果集对象。如果是执行插入或者更新的sql语句成功则返回true

fetch_assoc

该函数获取结果集中的一行记录,返回到一个关联数组当中,并以字段名作为键名,因此可以用字段名作为关键字来取值,需要注意的是,该函数返回的字段区分大小写,该函数一次可以读取结果集中的一行记录,然后指针移动到下一行记录,读取完所有记录之后将返回NULL

//引用连接数据库的那个php文件
require_once "connect.php";
//设置字符集
$db->query("set names utf8");
//定义sql语句
$sql = "select * from student";
//执行sql语句返回的结果
if($result = $db->query($sql)){
    while($row = $result->fetch_assoc()){
        echo $row['StudentID']."<br/>";
    }
}
//释放结果集
$result->close();
//关闭连接
$db->close();
fetch_row

该函数返回结果集中的一行记录,返回到一个索引数组中,他用数字索引取值

while($row = $result->fetch_row()){
        echo $row[0]."<br/>";
    }
fetch_array()

该函数可从结果集中取得一行作为关联数组或索引数组,或者二者兼有

while($row = $result->fetch_array()){
        echo $row['StudentID'].$row[1]."<br/>";
    }
fetch_object()

该函数返回结果集中取回一条记录并存储到一个对象中,然后通过类的方式获取值

while($row = $result->fetch_object()){
     echo $row->StudentID."<br/>";
 }

num_rows属性

该属性返回结果集的记录数,如果为0,表示在结果集中没有任何记录

$sql = "select * from Student";
$result = $db->query($sql);
echo $result->num_rows(); 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值