PHP基础(一)总结

2019-11-06  本文已影响0人  LeeShun
timg.jpg

PHP基础知识

1. 引用变量
<?php

//定义一个变量
$a = range(0, 1000);
var_dump(memory_get_usage());

//定义变量b,将a变量的赋值给b
// Cow Copy On Writer
$b = $a;
var_dump(memory_get_usage());

//将a进行修改
$a = range(0, 1000);
var_dump(memory_get_usage());
TIM图片20191106103402.png

unset只会取消引用,不会销毁内存空间

<?php

//unset 只会取消引用,不会销毁空间
$a = 1;
$b = &$a;

$b++;
unset($b);

echo $a;
//输出结果为
2

php对象本身就是引用传递

画图分析法


image.png
常量及数据类型考点

PHP中字符串中可以用哪三种定义方式以及各自的区别是什么?
定义方式:单引号、双引号、heredoc和newdoc 。
区别:单引号不能解析变量;单引号不能解析转义字符,只能解析单引号和反斜线本身;变量和变量、变量和字符串、字符串和字符串之间可以用 . 连接。双引号可以解析变量,变量可以使用特殊字符和{}包含;双引号可以解析所有转义字符;也可以用 . 来连接。单引号效率高于双引号。Heredoc类似于双引号;Newdoc类似于单引号;两者都用来处理大文本。

//Heredoc定义方法
$str = <<<EoT 
.....
EoT
//Newdoc定义方法
$str = <<< 'EoT'
....
'EoT'

三大数据类型(标量、符合、特殊)
浮点类型不能用于比较运算中
FALSE: 0,0.0,' ','0' ,false,array(), NULL
超全局数组

//超全局数组
$GLOBALS、$_GET、$_POST、 $_REQUEST 、$_SESSION、 $_COOKIE、 $_SERVER、 $_FILES、 $_ENV

$_SERVER['SERVER_ADRR'] 
$_SERVER['SERVER_NAME']
$_SERVER['REQUEST_TIME']
$_SERVER['QUERY_STRING']
$_SERVER['HTTP_REFERER']
$_SERVER['HTTP_USER_AGENT']
$_SERVER['REMOTE_ADDR']
$_SERVER['REQUEST_URI']
$_SERVER['PATH_INFO']

NULL
直接赋值给NULL,未定义的变量、unset销毁的变量
常量
const 、define
const更快,是语言函数,define是函数,define不能用于类常量的定义,const可以,常量一经定义,不能被修改,不能被删除。
预定义常量

_FILE_ 、_LINE_ 、_DIR_ 、_FUNCTION_ 、_CLASS_、 _TRAIT_ 、_METHOD_ 、 _NAMESPACE_
运算符

PHP的运算符的错误控制符@
PHP支持一个错误运算符:@。当将其放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都被忽略掉。

运算符的优先级
递增/递减 > ! > 算术运算符 > 大小比较 > (不)相等比较 > 引用 > 位运算符(^) > 位运算符(|) > 逻辑与 > 逻辑或 > 三目 > 赋值 > and > xor > or
括号的使用可以增加代码的可读性,推荐使用。

比较运算符
== 和 === 的区别
等值判断 (FALSE的七种情况)

递增/递减运算符
递增/递减运算符不影响布尔值
递减NULL值没有效果
递增NULL值为1
递增和递减在前就先运算符后返回,反之先返回,后运算。

逻辑运算符
短路作用
||和&&与or和and的优先级不同


TIM图片20191106115544.png
流程控制

请列出3种PHP数组循环操作的语法,并注明各种循环的区别。
使用for循环
使用foreach循环
使用 while、list()、each()组合循环
for循环只能遍历索引数组,foreach可以遍历索引和关联数组,联合使用list(),each()和while循环同样可以遍历索引和关联数组。
while、list()、each()组合不会reset()
foreach遍历会对数组进行reset()操作

if ... elseif
在elseif语句中只能有一个表达式为true,即在elseif语句中只能有一个语句块被执行,多个elseif从句是排斥关系。使用elseif语句有一个基本原则,总把优先范围小的条件放在前面处理。

switch...case...
和if不同的是,switch后面的控制表达式的数据类型只能是整形、浮点类型或者字符串。
continue语句作用到switch的作用类似于break,跳出switch外层循环用continue2
switch...case会生成跳转表,直接跳转到对应case
效率:如果条件比一个简单的比较要复杂得多或者在一个很多次的循环中,那么用switch语句可能会更快一些。

自定义函数及内部函数

变量的作用域和静态变量
变量的作用域也称变量的范围,变量的范围即它定义的上下文背景(也是它的生效范围)。大部分的PHP变量只有一个单独的范围。这个单独的范围跨度同样包含了include和require引入的文件。如要函数外部使用函数内部变量可以使用GLOBAL关键字、$GLOBALS及其他超全局数组。
静态变量仅在局部函数域中存在,但执行离开此作用域时,其值必不会消失。

static关键字

  1. 仅初始化一次
  2. 初始化时需要赋值
  3. 每次执行函数该值会保留
  4. static修饰的变量时局部的,仅在函数内部有效
  5. 可以记录函数的调用次数,从而可以在某些条件下终止递归


    TIM图片20191106124814.png

函数的参数及参数的引用传递
默认情况下,函数参数通过值传递
如果希望允许函数修改它的值,必须通过引用传递参数

函数的返回值及引用返回
值通过使用可选的返回语句(return)返回,可以返回包含数组和任意对象的任意类型,返回包括数组和对象的任意类型,返回语句会中止函数执行,将控制权交回函数调用处,省略return,返回值为NULL,不可有多个返回值。
从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用运算符 &


TIM图片20191106133036.png

外部文件的导入
include/require语句包含并运行指定文件
如果给出路径名按照路径来找,否则从include_path中查找,如果include_path中也没有,则从调用脚本文件所在的目录和当前工作目录下寻找。
当一个文件被包含时,其中所包含的代码继承了include所在行的变量范围。
加载过程中未找到文件则include结构会发出一条警告;这一点和require不同,后者会发出一个致命错误。
require(include)/require_one(include_once)唯一区别是PHP会检查该文件是否已经被包含过,如果是则不会再次包含。

系统内置函数
date()、strtotime()、mktime()、time()、microtime()、date_default_timezone_set()
IP处理函数
ip2long()、long2ip()
打印处理
print()、printf()、print_r()、echo、sprintf()、var_dump()、var_export()
print 和echo是语言结构

序列化及反序列化函数
serialize() 和 unserialize()
字符串处理函数
implode()、explode()、join()、strrev()、trim()、ltrim()、rtrim()、strstr()、number_format()....
数组处理函数
array_keys()、array_values()、array_diff()、array_intersecct()、array_merge()、array_shift()、array_unshift()、array_pop、array_push()、sort()等

正则表达式

至少写出一种验证139开头的11位手机号码的正则表达式

/^139+\d{8}$/
/^139+[0-9]{8}$/
/^[1][3][9][0-9]{8}$/
正则表达式的作用:分割、查找、匹配、替换字符串
分隔符:正斜线(/)、hash符号(#)以及取反符号(~)
通用原子:\d、\D、\w、\W、\s、\S
元字符:. * ^ $ + {n} {n,} {n-m} [] () [^] | [-]
模式修正符:i m e s U x A D u

后向引用


TIM图片20191106135446.png

贪婪模式


TIM图片20191106135700.png

正则表达式PCRE函数:preg_match()、preg_match_all()、preg_replace()、preg_split()
中文匹配:UTF-8汉字编码范围是0x4e00-0x9fa5,在ANSI(gb2312)环境下,0xb0-0xf7, 0xa1-0xfe
UTF-8要使用u修正符使模式修正符使模式字符串当成UTF-8,在ANSI(gb2312)环境下,要使用chr将Ascii码转换为字符
先写出一个要匹配的字符串,自左向右的顺序使用正则表达式的原子和元字符进行拼接,最终加入模式修正符。
正则表达式匹配出img中src的地址

<?php
//匹配所有img标签中的src的值
$str = '<img alt="高清图片" id="img" src="gaoing.ipg" />';
//$pattern = '/<img.*?src=".*?".*?\/?>/i';
$pattern = '/<img.*?src="(.*?)".*?\/?>/i';
preg_match($pattern, $str, $match);
var_dump($match);
文件及目录处理

不断在文件hello.txt头部写入一行“Hello World"字符串

<?php

//打开文件

//将文件的内容读取出来,在开头加入Hello World

//将拼接好的字符串写回到文件当中

$file = './hello.txt';

$handle = fopen($file, 'r');

$content = fread($handle, filesize($file));

$content = 'Hello world'.$content;

fclose($handle);

$handle = fopen($file, 'w');

fwrite($handle, $content);

fclose($handle); 

文件读取/写入操作
fopen()函数
用来打开一个文件,打开时需要指定打开模式
打开模式:

写入函数
fwrite()
fputs()
读取函数
fread()
fgets()
fgetc()
关闭
fclose()
不需要fopen()打开的函数
file_get_contents()
file_put_contents()
其他读取函数
file()
readfile()
访问远程文件
开启allow_url_fopen,HTTP协议连接只能使用只读,FTP协议可以使用只读或者只写
名称相关:basename()、dirname()、pathinfo()
目录读取:opendir()、readdir()、closedir()、rewinddir()
目录删除:rmdir()
目录创建: mkdir()
文件大小: filesize()
目录大小:disk_free_space()、disk_total_space()
文件拷贝:copy()
删除文件:unlink()
文件类型:filetype()
重命名文件或者目录:rename() 还可以移动位置
文件截取:ftruncate()
文件属性:file_exists()、is_readable()、is_writable()、is_executable()、filectime()、fileatime()、filemtime()
文件锁:flock()
文件指针:ftell()、fseek()、rewind()

目录操作函数、其他文件操作

<?php

$dir = './test';

//打开目录
//读取目录当中的文件
//如果文件类型是目录,继续打开目录
//读取子目录中的文件
//如果文件类型是文件,输出文件名称
//关闭目录

function loopdir($dir)
{
        $handle = opendir($dir);
        while(false !== ($file = readdir($handle)))
        {
                if($file != '.' && $file != '..'){
                        echo $file."\n";
                        if(filetype($dir.'/'.$file) == 'dir'){
                                loopdir($dir.'/'.$file);
                        }

                }
        }
}
loopdir($dir)
会话控制

cookie和session的区别及各自的工作机制,存储位置等,简述cookie的优缺点。

Cookie
setcookie($name, $value, $expire, $path, $domain, $secure)
$_COOKIE()
setcookie($name, '', time()-100); //设置cookie过期

Session
session_start();
$_SESSION;
$_SESSION = [];
session_destroy();

//php.ini
session.auto_start
session.cookie_domain
session.cookie_lifetime
session.cookie_path
session.name
session.save_path
session.use_cookies
session.use_trans_sid
清理session的三个配置
没调用100次的时候会清理一次session,最后修改session时期的1400秒的session会清掉
session.gc_probability =1
session.gc_divisor = 100
session.gc_maxlifetime = 1400
session存储到什么地方,可以是文件里,或者数据库,redis
session.save_handler

禁用cookie时传递怎么传递SessionId
用url传递 <?php echo session_name() .'='.session_id();?>
<?php echo SID;?> 开启cookie SID的值是NULL

面向对象

PHP类权限控制修饰符
public protected private
面向对象的封装、继承和多态
单一继承
方法重写
如果子类想重写父类方法,又想使用父类的方法可以使用parent


TIM图片20191106161811.png

抽象类的定义
abstract class AbstractClass{}
如果有抽象方法必须定义为抽象类
接口的定义
interface iTemplate{}
魔术方法
__construct() 构造函数,每次创建新对象时先调用此方法,所以做一些初始化操作。
__destruct() 析构函数,会在某个对象的所有应用都被删除或者当对象被显式销毁时执行。
__call() 在对象中调用一个不可访问方法时会被调用。
__callStatic() 在静态上下文中调用一个不可访问方法时会被调用。
__get() 读取不可访问属性的值时会被调用。
__set() 在给不可访问属性赋值时会被调用。
__isset() 当对不可访问属性调用isset()或empty()时,__isset()会被调用。
__unset()当对不可访问属性调用unset()时,__unset()会被调用。
__sleep() 使用searilize() 函数会检查类中是否存在一个魔术方法__sleep()。如果存在会被调用,用于清理对象,并返回一个包含对象所有应被序列化的变量名称的数组。常用于提交未提交的数据,或类似的清理操作。
__wakeup() 使用unsearilize()函数时会检查是否存在__wakeup,如果存在会先调用此函数,用于预先准备对象需要的资源。比如连接数据库,或执行其它初始化操作。
__toString() 用于一个类被当成字符串时应怎样回应。不能在 __toString()方法中抛出异常。这么做会导致致命错误。
__clone() 当对象克隆的时候自动加载此方法
设计模式:工厂模式、单例模式、注册树模式、适配器模式、观察者模式和策略模式

网络协议

HTTP/1.1中,状态码 200、310、304、403、404、500的含义
HTTP协议状态码
五类响应:1XX、2XX、3XX、4XX、5XX
常见状态码:
200 请求成功
204 没有新文档。浏览器应该继续显示原来的文档。
206 客户发送了一个带有Range头的GET请求,服务器完成了它。
301 所请求的页面已经转移至新的url。
302 所请求的页面已经临时转移至新的url。
303 所请求的页面可在别的url下找到。
304 未按预期修改文档。客户端有缓存的文档并发出了一个条件性的请求。服务器告诉客户,原来文档还可以使用。
307 被请求的页面已经临时转移至新的url
400 服务器未能理解请求
401 被请求页面需要用户名和mima
403 对被请求页面的访问被禁止
404 服务器无法找到被请求的页面
500 请求未完成。服务器遇到不可预知的情况。
503 请求未完成。服务器临时过载或者怠机

OSI七层模型
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
物理层:建立、维护、断开物理连接
数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等功能
网络层:进行逻辑地址寻址,实现不同网络之间的路径选择。
传输层:定义传输数据的协议端口号,以及流控和差错校验。协议有:TCP、UDP,数据包一旦离开网卡即进入网络传输层。
会话层:建立、管理、终止会话
表示层:数据的表示、安全、压缩。
应用层:网络服务与最终用户的一个接口。协议有:HTTP、 FTP、 TFTP、 SMTP、 SNMP、 DNS、 TELNET、 HTTPS、 POPS、 DHCP
TCP协议:三次握手,四次挥手
TCP三次握手:第一次握手,客户端向服务端发送SYN报文(seq=x),客户端状态变为SYN-SENT;第二次握手,服务端收到客户端的SYN报文,向客户端发送SYN报文(seq=y)和ACK报文(ack=x+1),服务端进入SYN_RECV;第三次握手,客户端收到服务端的SYN和ACK报文,向服务端发送确认ACK报文(ack=y+1),次报文发送完毕,客户端和服务端进入ESTABLISHED状态。
TCP四次挥手:第一次挥手,客户端向服务端发送FIN报文(seq=m),客户端进入FIN_WAIT_1状态;第二次挥手,服务端收到FIN报文,发送一个ACK报文(ack=m+1),同时进入CLOSE_WAIT状态,客户端收到信息进入FIN_WAIT_2状态;第三次挥手,服务端向客户端发送FIN报文(seq=n),服务端进入LAST_ASK状态;
第四次挥手,客户端收到FIN报文后,发送ASK报文(ask=n+1),客户端进入TIME_WAIT状态,服务端收到ASK报文进入CLOSED状态,客户端等待2ms后,无回复也进入CLOSED状态。
HTTP协议的工作特点和工作原理
工作特点:基于B/S模式;通信开销小、简单快速、传输成本低;使用灵活、可使用超文本传输协议;节省传输时间;无状态。
工作原理:客户端发送一个请求给服务端,创建一个TCP连接,指定端口号,默认80,连接到服务器,服务器监听浏览器请求,一旦监听到客户端请求,分析请求类型后,服务器会像客户端返回状态信息和数据内容。

HTTP协议常见请求/响应头和请求方法

2905385-4fbc8b6a245da535.png
请求头:
Content-Type 请求实体的MIME类型 Content-Type: application/x-www-form-urlencoded
Accept 指定客户端可接收的响应内容类型 Accept:text/plain (文本类型)
Origin 最初的请求来至哪主要用于post请求
Cookie http请求发起时发送给服务器cookie的值
Cache-Control 指定请求/回复的缓存机制 Cache-Control: no-cache
User-Agent 用户信息 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Referrer 上级请求路径,和OrIgin请求用于post不同,请求都可以做 Referer: https://www.baidu.com/
X-Forwarded-For 请求端的真实的IP
Access-Control-Allow-Origin 允许特定域名可以使用,通常用于跨域使用
Last-Modified 请求资源最后响应时间

请求方法:
GET:会显示请求指定的资源,主要用于数据的读取。
POST:会像指定资源提交数据,请求服务器进行处理,可能会创建新的资源或者修改现有的资源。
HEAD:会向服务器请求指定的资源,不会回传内容,只会回传head信息。
OPTIONS:用于客户端查看服务器的性能。会请求服务器返回该资源支持的所有http请求方法。该方法会用*来代替资源名称,向服务器发起请求,测试服务器功能是否正常。
PUT:会向指定资源上传最新内容,通过该方法客户端可以将指定资源最新数据传送至服务器,取代指定资源的内容。修改用PUT
DELENTE:主要用于请求服务器删除所请求的url所标示的资源,请求后所指定资源会被删除。
TRACE:请求服务器回写其收到的请求信息,该方法主要用于http请求的测试与诊断。

GET和POST的区别
GET在做后退按钮的时候或者刷新的时候,不会有太大变化,是无害的;而POST数据会重新提交。
GET可以收藏为书签,POST不可能被收藏为书签。
GET可以被浏览器缓存,而POST不能被浏览器缓存。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求历史会保存到浏览器历史请求中,而POST参数不会存在浏览器历史当中。
GET发送数据会有长度限制,URL长度是受限制的,最大限制是2048个字符,POST是没有限制的。
GET发送数据的类型也有限制,GET只允许发送ASCII字符,POST没有限制,允许二进制数据。
GET的发送数据的安全性比较差,发送数据是url的一部分,POST请求参数不会保存到浏览器请求历史和WEB服务器日志当中。

HTTPS协议的工作原理
HTTPS是一种基于SSL/TLS的HTTP协议,所有的HTTP数据都是在SSL/TLS协议封装之上传输的。
HTTPS协议在HTTP协议的基础上,添加了SSL/TLS握手以及数据加密传输,也属于应用层协议。
常见网络协议含义及端口
FTP 文件传输协议 一般端口为21
TELNET 用于远程登录的协议,用户可以以自己的身份远程连接到计算机上,可以提供基于DOS下的通信服务,通常端口为23
SMTP 定义了简单邮件传输协议 端口23
POP3 定义了简单邮件的接收协议 端口为110
HTTP 超文本传输协议 端口为80
DNS 用于域名解析服务,这种协议在windows服务NT系统中用的最多 端口为53

开发环境及配置

版本控制软件
集中式、分布式
git svn和svn
PHP运行原理
Nginx+php_fpm
CGI : CGI为了解决不同语言和web server通信。也就是说CGI是语言和服务器之间沟通的桥梁。
FastCGI:CGI效率低,每次处理完请求不会kill掉进程,而是保留这个进程,使这个进程一次处理多个请求,不会再创建一个进程。
PHP-FPM:PHP FastCGI Process Manage 就是PHP FastCGI进程管理器,包括master进程和work进程,master进程只有一个,负责监听端口(默认为9000)接收来自WEB Server的请求,work进程一般会有多个,一般数量在PHP-FPM配置中定义,每个进程内部会嵌入一个php解析器。
PHP常见配置项
register_globals(注入变量)、allow_url_fopen(是否允许打开文件)、allow_url_include(是否远程包含文件)、date.timezone、display_errors、error_reporting、safe_mode、upload_max_filesize、max_file_uploads、post_max_size

上一篇下一篇

猜你喜欢

热点阅读