引用意味着用不一样的名字访问同一个内容
定义引用变量:使用&
普通变量的工做原理
$a = range(0,10000); var_dump(memory_get_usage()); //int(742072) $b = $a; var_dump(memory_get_usage()); //int(742096) $a = range(0,30000); var_dump(memory_get_usage()); //int(1532648)
引用变量的工做原理
$a = range(0,10000); var_dump(memory_get_usage()); //int(742072) $b = &$a; var_dump(memory_get_usage()); //int(742096) $a = range(0,30000); var_dump(memory_get_usage()); //int(1135312)
注意: 一、引用变量一旦定义,此变量永远是引用变量,不可能再变回普通变量 二、引用变量能够修改引用的值,例如: $a = 'a'; $c = 'c'; $b = &$a; $b = &$c; //修改引用
单引号、双引号、heredoc、newdoc
单引号:不能解析变量,只能解析单引号(\')和反斜线(\\)转义字符,比双引号效率高 双引号:解析变量(可以使用{}括起来),能解析全部转义字符 heredoc:功能相似双引号(用于大字符串) newdoc: 功能相似单引号
//heredoc定义 $str = <<<EOT xxxxxxxxxxxx EOT; //newdoc定义 $str = <<<'EOT' xxxxxxxxxxxxxxxx EOT;
浮点数:不能用于运算/比较运算,由于浮点数不是精确的
FALSE七种状况:0、0.0、'0'、''、NULL、false、array()
超全局数组(九种):
$GLOBALS、$_GET、$_POST、$_SERVER、$_SESSION、$_COOKIE、$_FILES、$_ENV、$_REQUEST //$GLOBALS包含其余8种 //$_REQUEST包含$_GET、$_POST和$_COOKIE $_SERVER['REQUESR_URI']与$_SERVER['PATH_INFO']区别 http://localhost/aaa/index.php/foo/bar.html?p=222&q=333 $_SERVER['QUERY_STRING'] = "p=222&q=333"; $_SERVER['REQUEST_URI'] = "/aaa/index.php/foo/bar.html?p=222&q=333"; $_SERVER['SCRIPT_NAME'] = "/aaa/index.php"; $_SERVER['PHP_SELF'] = "/aaa/index.php"; $_SERVER['PATH_INFO'] = ‘/foo/bar.html’
2种定义方式:define()与const
define()函数 const是语言结构 区别 define()不能够定义类常量
预约义常量
__FILE__、__LINE__
@
当将其放置在一个PHP表达式以前,该表达式可能产生的任何错误信息
都将被忽略掉
运算符优先级php
递增/递减 > ! > 算术运算符 > 大小比较 > (不)相等比较 > 引用 > ^ > | > 逻辑与&& > 逻辑或|| > 三目 > 赋值 > and > xor > or
<?php if($a = 3 > 0 && $b = 3 > 0){ echo 'true'; }else{ echo 'false'; } ?> // 至关于 if($a = ((3 > 0) && ($b = 3 > 0)))
==与===区别
等值判断(FALSE七种状况)
短路做用: 逻辑与&& > 逻辑或|| > 三目 > 赋值 > and > xor > or
一、递增/递减不影响布尔值 二、递减NULL值没有效果 三、递增NULL值为1 四、递增/递减位置不一样效果不一样
PHP遍历数组的三种方式及各自区别
1.for循环(while/do...while)
2.foreach循环
3.while、each()、list()组合
区别: for循环:只能遍历索引数组 foreach循环:能遍历关联数组和索引数组 while、each()、list()组合:能遍历关联数组和索引数组 foreach循环遍历数组前,会对数组进行reset()操做 while、each()、list()组合则不会进行reset()操做
PHP分支结构
if...elseif...
原则: 可能性大的放在前面
switch...case...
与 if 区别: 判断参数的数据类型只能是整形、浮点、字符串
switch...case...中,若是使用continue与break等价 若是switch...case...外层还有for,那么使用continue2才能够跳出循环 通常switch要比if性能高
大部分变量只有一个单独的范围,这个单独范围跨度包含了include与requires的文件
若是在非类中引入文件,该文件内部能够使用全局变量和函数 若是在类中引入文件,该文件内部能够使用函数、类的方法、类的属性
传参分2种:
一、值传递
二、引用传递(函数修改该值,传递的参数必须是变量
)
//引用传递函数定义 $a = 1; function fn(&$a){ return ++$a; } echo fn($a); //2
能够返回任意数据类型的值
省略return 默认返回NULL,若是要返回多个值请使用数组
函数2种方式返回 一、普通返回 二、引用返回 function &fn(){ $a = 5; return $a; } $b = &fn();
让函数内部修改外部变量的值
,使用引用传参
让外部变量修改函数内部变量的值
,使用引用返回
引入的代码将继承引入位置的做用域,即 使用include或require位置能够使用的变量
include与require区别
时间日期函数
date()、strtotime()、mktime()、time()、microtime()、date_default_timezone_set()
IP处理函数
ip2long()、long2ip()
打印处理函数
print()、printf()、print_r()、echo、sprintf()、var_dump()、var_export()
序列化及反序列化函数
serialize()、unserialize()
字符串处理函数
trim()、
数组处理函数
array_rande()、
分割、查找、匹配、替换
做用对象:字符串、字符串、字符串
(重要的事情记3遍)
分隔符:正斜线(/)、hash符(#)、取反符号(~) 通用原子:\d(匹配数字)、\D、\w(匹配数字、字母、下划线)、\W、\s(匹配空格)、\S 元字符: 量词 ?、+、*、{n}、{n,}、{n,m} 通配符 . 范围匹配 []、[-]、[^] 模式修正符:i、m、u、U
题目:把字符串 '<b>abc</b>' 替换为 'abc' 如何使用正则作到?
$str = '<b>abc</b>'; $pattern = '/<b>(.*)<\/b>/'; preg_replace($pattern, '\\1', $str);
题目:把字符串 '<b>abc</b><b>def</b>' 替换为 'abcdef' 如何使用正则作到?
$str = '<b>abc</b><b>def</b>'; $pattern = '/<b>(.*?)<\/b>/'; $pattern = '/<b>(.*)<\/b>/U'; preg_replace($pattern, '\\1', $str);
注意:默认是贪婪模式
preg_match()、preg_match_all()、preg_replace()、preg_split()
中文分utf-8与gbk两种编码,他们正则表达式不一样 utf-8: 0x4e00 - 0x9fa5 模式修正符须要使用u
fopen()
用于打开一个文件,打开时须要指定一个打开模式
打开模式:r/r+、w/w+、x/x+、a/a+、b、t
r+ 追加写 w 覆盖写
fread()/fgets()/fgetc()
fgets()
读取一行
fgetc()
读取字符
fwrite()/fputs()
fclose()
file_put_contents()
file_get_contents()
开启allow_url_fopen() ,
http协议只能使用只读,ftp协议能够只能只读或只写
目录名称:basename()
、dirname()
、pathinfo()
目录读取:opendir()
、readdir()
、closedir()
、rewinddir()
目录删除:rmdir()
目录建立:mkdir()
//遍历 function loopDir($dir){ if(is_dir($dir)){ if($handle = opendir($dir)){ while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { echo $file.'\n'; if(filetype($dir.DIRECTORY_SEPARATOR.$file === 'dir')){ loopDir($dir.DIRECTORY_SEPARATOR.$file); } } } } }else{ echo basename($file).'\n'; } }
一、使用URL带参数的方式(不安全,不推荐) 二、cookie 三、session
只能经过URL把SessionID传过去
<a href="next.php?<?php echo session_name().'='.session_id(); ?>">下一页</a> 简化: <a href="next.php?<?php echo SID; ?>">下一页</a>
public、protected、private
一、GET能够收藏成浏览器书签,而POST不行 二、GET能够保存在浏览器历史记录里,而POST不行 三、GET安全性相比POST差 四、GET请求数据编码:application/x-www-form-urlencoded,而POST则除了application/x-www-form-urlencoded编码,还能够是multipart/form-data或者application/json或者text/xml 五、GET请求参数是有长度限制的,url最多2048个字节,而POST没有限制
四种数据编码html
主要了解 CGI、FastCGI、PHP-FPM
CGI:是一种通信协议(已通过时,性能低下) FastCGI:也是一种通信协议,是CGI的升级版(如今推荐使用) PHP-FPM:是FastCGI进程管理器 php-cgi.exe:是PHP脚本解析器,不是FastCGI进程管理器
PHP 有5种PHP运行模式
:
连接
一、以CGI模式运行PHP LoadModule cgi_module modules/mod_cgi.so //要加载apache自带模块 <Files ~ "\.php$"> Options FollowSymLinks ExecCGI AddHandler cgi-script .php FcgidWrapper "D:/BtSoft/WebSoft/php/7.1/php-cgi.exe" .php </Files> //若是同时打开多个则会有不少php-cgi.exe,而且在执行完成以后消失:
二、以FastCGI模式运行PHP FastCGI模式根据进程管理器的不一样能够分为:Apache内置进程管理器,PHP-FPM进程管理器 Apache内置进程管理器: LoadModule fcgid_module modules/mod_fcgid.so //要加载apache模块,该模块要单独下载 <IfModule fastcgi_module> FastCgiServer /home/weiyanyan/local/apache/cgi-bin/php-cgi -processes 20 AddType application/x-httpd-php .php AddHandler php-fastcgi .php Action php-fastcgi /cgi-bin/php-cgi </IfModule> PHP-FPM进程管理器: LoadModule fastcgi_module modules/mod_fcgid.so <IfModule fastcgi_module> FastCgiExternalServer /home/weiyanyan/local/apache/cgi-bin/php-cgi -host 127.0.0.1:9000 AddType application/x-httpd-php .php AddHandler php-fastcgi .php Action php-fastcgi /cgi-bin/php-cgi </IfModule>
php54是以前是一种关系,php54以后另外一种关系。
php54以前,php-fpm(第三方编译)是管理器,php-cgi是解释器
php54以后,php-fpm(官方自带),master 与 pool 模式。php-fpm 和 php-cgi 没有关系了。php-fpm又是解释器,又是管理器
三、以Apache模块模式运行PHP LoadModule php5_module "C:/php5/php5apache2_2.dll" AddType application/x-httpd-php .php