php基础回顾

新的一年,技术却感觉没有变好多少…最近业务不是很忙,稍微来回顾一下基础知识吧。

变量引用

在PHP中引用意味着用不同的名字访问同一个变量,使用&符号定义。
为什么这么说呢,首先,PHP有一个COW(copy on write)机制,只有在进行了写操作的时候,才会进行copy,什么意思呢?
看以下代码

    $a=1;
var_dump(memory_get_usage());
$b=$a;
    var_dump(memory_get_usage());

你会发现2次打印的数值差不多,即使用的内存并没有增加,再加上下面的代码:

$a=1;
var_dump(memory_get_usage());

此时,内存量有了显著变化,证实了COW机制的存在,但要注意,对象(object)有他的特殊性,对象本身就是引用传递。接着把

$b=$a;

这行代码换成

$b=&$a;

,其他不变,在此运行,会发现3次打印的结果差不多,说明$b和$a指向了同一片内存空间。我们也可以用PHP的扩展xdebug,然后使用xdebug_debug_zval(‘a’)来看是否如此,这里不再细说。
讲一道面试题,代码如下:
关于引用的面试题

答案是[‘a’,’b’,’c’],[‘b’,’b’,’c’],[‘b’,’c’,’c’],为什么呢。
第一次的时候

    $k=0;
$v='a';
    $v=&$d[0]; //注意这里是引用。
    ['a','b','c'],没有问题;

第二次循环

    $k=1;
$v='b'; //此时经过上一次循环,$v直接指向了$d[0],所以这里同时给$d[0]赋值了'b';
$v=&$d[1];
    ['b','b','c']

第三次同上,答案是[‘b’,’c’,’c’],

字符串

字符串的定义方式及各自区别
定义方式:
1、单引号:区别是不能解析变量,不能解析转义字符,只能解析单引号和反斜线本身,变量和变量,变量和字符串,字符串和字符串之间可以用.连接

2、双引号:可以解析变量,变量可以用特殊字符和{}来包含,可以解析所有转义字符,可以用.来连接,但在效率上低于单引号。

3、heredoc和newdoc:Heredoc类似双引号,newdoc类似单引号,
heredoc定义:
$str=<<< Eot



Eot

newdoc定义:
$str=<<< ‘Eot’



Eot

数据类型

标量:浮点,布尔等
复合:对象,数组
特殊:NULL,resource资源类型
谈谈其中几个的重要的点

浮点类型:

不能运用于比较当中,因为二进制是不整的,参考大学时学的C++。

布尔类型:

说说FALSE的七中情况:整型0,浮点0.0,布尔false,空字符串,0字符串,空数组,NULL,七种情况是等值的

数组:

超全局数组,$GLOBALS,$_GET,$_POST,$_REQUEST,$_SESSION,$_COOKIE,$_SERVER,$_FILE,$_ENV。

其中$GLOBALS包含了后面8个超全局变量,$_REQUEST包含了$_GET,$_POST,$_SESSION,虽然$_REQUES看上去很方便,但是$_REQUEST要尽量少用,因为他相当于一个万能钥匙,存在安全性问题。
重点说一下$_SERVER中的几个变量,

‘REMOTE_ADDR’浏览当前页面的用户的 IP 地址。
‘SERVER_ADDR’当前运行脚本所在的服务器的 IP 地址。
‘SERVER_NAME’当前运行脚本所在的服务器的主机名。如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定。
‘HTTP_REFERER’引导用户代理到当前页的前一页的地址(如果存在)。由 user agent 设置决定。并不是所有的用户代理都会设置该项,有的还提供了修改 HTTP_REFERER 的功能。简言之,该值并不可信。
‘REQUEST_URI’ URI 用来指定要访问的页面。例如 “/index.html”。
‘HTTP_USER_AGENT’当前请求头中 User-Agent: 项的内容,如果存在的话。该字符串表明了访问该页面的用户代理的信息。一个典型的例子是:Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)。除此之外,你可以通过 get_browser() 来使用该值,从而定制页面输出以便适应用户代理的性能。

NULL的三种情况:

直接赋值为NULL,未定义的变量,unset销毁的变量。

常量:

通过const、define定义,但是const更快,因为他是语言结构,define则是函数,define不能用于类常量的定义,const可以。

魔术常量:

PHP中有八个魔术常量,它们的值会随着它们在代码中的位置的改变而改变。这些特殊的常量不区分大小写。
LINE :返回文件中的当前行号。也可写成line
FILE:返回当前文件的绝对路径(包含文件名)。
DIR:返回当前文件的绝对路径(不包含文件名),等价于 dirname(FILE)。
FUNCTION:返回当前函数(或方法)的名称。
CLASS:返回当前的类名(包括该类的作用区域或命名空间)。
TRAIT:返回当前的trait名称(包括该trait的作用区域或命名空间)。
METHOD:返回当前的方法名(包括类名)。
NAMESPACE:返回当前文件的命名空间的名称。

运算符

特殊的运算符——错误控制符@,当将其放置在一个 PHP表达式 之前,该表达式可能产生的 任何错误信息 都将被 忽略掉。
运算符注意知道的是优先级,但是在代码中,于用到多运算符的代码,应当加括号来增加可读性。
一图表达运算符优先级:
运算符的优先级

需要注意的短路作用:
此处输入图片的描述

流程控制:

基础的就不说了,谈谈几个要注意的。

数组循环的三种方式:

for循环,只能遍历索引数组,不能遍历关联数组。
foreach循环,可以遍历索引和关联数组。
while,list(),each()数组循环,这种方式不会reset()。

switch…case…循环

注意switch后面跟的控制表达式的数据类型只能是整型、浮点型或者是字符串。在switch中,continu相当于break,如果需要跳出switch外的循环,可以用continu2,(跳出2层循环 )

然后关于if…elseif循环,应该把概率大的条件写在前面,增加效率。

文件引入

外部文件的导入:
主要使用include和require来引入。2者的区别在于:
如果在加载过程中没有找到文件,include只会产生一个E_WARING级别的警告,而require则会发出一个致命错误(E_COMPILE_ERROR级别)。
而require(include)和require_one(include_once)的区别在于,PHP会检查该文件是否已被包含过,如果是则不会再次包含。

正则表达式:

没什么好说的,多练习,记住相应的正则函数。赶脚看得懂就行,网上写好的好多。。。

文件读取/写入操作:

记住相应的函数如fopen(),fread(),file_get_contents()函数等。

讲一道面试题:遍历目录里的文件。思路如下,先打开目录,读取目录当中的文件,如果文件类型是目录,继续打开,读取子目录,如果类型是文件,输出文件名称,关闭文件。代码:

$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);
            }
        }
    }
}

回话控制:

cookie:cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。
记住相应的函数如setcookie($name,$value,$expire,$path,$domain,$secure)等;
session:PHP session变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。session 基于cookie,存储在服务端
记住相应的session_start()函数、$_SESSION变量等;

SESSION存储
session_set_save_handler(); 设置用户自定义会话存储函数
注意:负载均衡的原因,session最好存mysql,memcache,redis等上面

[^_^]:

面向对象:
===
PHP是单一继承,使用public,protect,private这3个关键字来做访问控制,还有相应的__construct构造函数等。不多说了。

网咯协议:

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。
常见的请求方法:
请求方法

几个状态码的分类:
状态码分类

具体的可以看http://www.runoob.com/http/http-status-codes.html。

以上,暂时就这些吧。