基础知识准备
面试
下面将记录一些为面试准备的基础知识,仅做自己参考学习使用~
链接:https://learnku.com/articles/6844/a-php-interview-for-a-16-year-old-graduate
主要内容:
基础知识:字符串操作、数组操作、文件操作、正则操作
进阶知识:面向对象、数据结构和算法、设计模式、mysql 索引、mysql 引擎、mysql 事务、mysql 锁
高阶知识:linux+nginx+mysql+php+redis 优化,只会操作没用,谁都会,高并发、分布式系统、负载均衡、分库分表、消息队列
PHP基础知识
基本语法:
1)引用:变量、函数或者对象等前加&,表示引用,也就是,不同的名字访问同一个变量内容。
function a(&$b){
$b++;
}
$c=0;
call_user_func_array('a',array(&$c));
echo $c; //输出 1
关于引用暂时参考如下链接:https://www.cnblogs.com/alsf/p/9621362.html,个人还没有看明白,待续~
2)if else 与switch case的区别:
switch case的效率更高一些,因为只取出变量的值一次,然后将这个值与每个case进行对比,而if else要每次取出变量的值进行比较,所以效率没那么高。
另外,如果多个case的执行语句一样,可以直接写成如下形式:
switch ($a){
case 1:case2:echo '-------1 2---'.PHP_EOL;break;//记得加上break语句,否则会继续执行下一个case直到遇到break为止
case 3:case4:echo '-------34---'.PHP_EOL;break;
}
//注意下面的例子,case中的值和原值的类型不一样,字符串会当做0来处理
$a = 'ggg';
switch ($a){
case 0:echo '---string-----';break;//程序走这种情况
case 1:case2:echo '-------num---'.PHP_EOL;break;
}
3)PHP取整数函数常用的四种方法:
1.直接取整,舍弃小数,保留整数:intval();
2.四舍五入取整:round();
3.向上取整,有小数就加1:ceil();
4.向下取整:floor()
4)isset和empty函数:均用来判断变量是否存在或者为空,如果判断常量用define函数。
如果判断一个变量是否已声明,则用isset函数;
如果判断一个变量是否赋予数据且补位为空,则可以用empty函数;
如果判断一个变量存在且不为空,则用isset和empty。
具体区别如下:
isset | 变量不存在 | 变量存在但值为null | 变量存在且值不为null |
---|---|---|---|
返回结果 | false | false | true |
注意:如果同时检查多个变量,每个单项都为true,才返回true,否则结果为false。
empty | 变量不存在 | 变量存在但值为特殊情况 | 变量存在且值不为特殊情况 |
---|---|---|---|
返回结果 | true | true | false |
特殊情况为:值为"",0,‘0’,NULL,FALSE,array(),var $var;以及没有任何属性的对象。
1,字符串操作:
1)在PHP中,有时候会把字符串当做数组使用,因此可以利用和数组类似的方法查找和修改字符串,比如:
$a='abcdef';
echo $a[1]; //查找字符串,运行结果为b
$a[1]='k';
echo $a; //修改字符串,运行结果为'akcdef';
2)计算子串在字符串中出现的次数:
substr( s t r i n g , string, string,substring, s t a r t , start, start,length)
3 ) strcspn( s t r i n g , string, string,charlist, s t a r t , start, start,length);
返回在找到指定的字符之前,在字符串中查找的字符数(包含空格);
strspn( s t i n g , sting, sting,charlist, s t a r t , start, start,length);
返回字符串中包含$charlist参数中指定字符的数目。
2,数组操作
注意:数组不能用new 来实例化,因为new是用来实例化类的,返回的为对象object,而数据的类型为array。
1)数组去重:
array_flip(array_flip($data));//两次反转操作即可,如果存在重复的值,会保留最后一个键值对应的键名
array_unique($array);//如果遇见值相同,取开始的键名
array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )//如果回掉函数为空,则会过滤掉false或者空或者0的值
按照回掉函数对数组进行过滤操作。
2)函数调用:call_user_func与call_user_func_array的区别:
两个函数均是调用自己定义的函数,但是在传入参数的形式上有所区别,具体如下:
mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $… ]] )
mixed call_user_func_array ( callable $callback , array $param_arr )
class World {
function sayHello($word = '')
{
echo $word;
}
}
//注意,必须是要实例化的,除非是static
$world = new World();
call_user_func([$world, 'sayHello'], 'hello world');
//输出 hello world
function say($word)
{
echo $word;
}
call_user_func_array('say', ['hello world']); //注意:第二个参数是数组的形式
//输出
//hello world
class World {
function sayHello($word = '')
{
echo $word;
}
}
//注意,必须是要实例化的,除非是static
$world = new World();
call_user_func_array([$world, 'sayHello'], ['hello world']); //注意:第二个参数是数组形式
//输出 hello world
2)数组切片:array_slice( a r r a y , array, array,start, l e n g t h , length, length,preserve);//$preserve:是否保留原键名,主要针对二维数组
$a = array('a'=>'aa','b'=>'bb','c'=>'cc');
var_dump(array_slice($a,1,2,false)); //输出结果为:array('b'=>'bb','c'=>'cc')
$b = array('a','b','c');
var_dump(array_slice($b,1,2,false));//输出结果为:array(0=>'b',1=>'c')
3)数组对比差集:array_diff( a r r 1 , arr1, arr1,arr2[, a r r 3.... ] ) 返 回 结 果 为 数 组 , 为 所 有 的 在 arr3....]) 返回结果为数组,为所有的在 arr3....])返回结果为数组,为所有的在arr1中但是不在其他数组中的值,注意不在其他任何一个数组哦~
$a = array('a0','b0','c0');
$b = array('a0','b1','c0');
$c = array('a1','b1','c1');
var_dump(array_diff($a,$b,$c));//输出结果为array(1=>'b0') 因为a0虽然不在$c中,但是在$b中,c0同样在其他两个数组中的一个,只有b0在任何一个数组中都不存在
注意:如果要对比两个数组的差集,需要做如下的处理:
$diff1 = array_diff($a,$b);
$diff2 = array_diff($b,$a);
$diff = array_merge($diff1,$diff2);
var_dump($diff); //输出结果为array('b0','b1')
3,文件操作
//写入文件
$path='/tmp/hello.txt';
$data = 'hello world!';
//如果文件不存在的话,会创建文件并将data 写入,返回写入的字节数
$numbytes = file_put_contents($path,$data);
//读取内容
$lines = array();
if(file_exists($path)){
echo '文件大小为:'.filesize($path).PHP_EOL;
$myfile = fopen($path,'r');//仅仅读取的模式打开,也可以用'r+','w','w+','a','x'
while(!feof($myfile)){//非文件末尾
$lines[] = fgets($myfile);//按照行读取,如果用fgetc则是按照字节读取
}
}
//拷贝文件
copy($path,'/tmp/test1.txt');
$files = scandir('/tmp');//返回结果为数组形式
if(rename('/tmp/test1.txt','/tmp/new.txt')){
var_dump(scandir('/tmp'));
}
//删除文件
if(unlink('/tmp/new.txt')){
var_dump(scandir('/tmp'));
}
其中关于文件的打开模式,具体如下:
模式 | 说明 |
---|---|
r | 只读模式,不能用fwrite进行写的操作 |
r+ | 读+写均可 |
w | 只能重头写入 ,文件不存在的时候创建 |
w+ | 读+写均可 |
a | 以向文件末尾追加内容的方式写入:append。文件不存在的时候创建 |
x | (保护模式)如果文件存在就不碰文件了,如果不存在就会创建文件,文件指针移动到文件开头 |
4,正则表达式
元字符 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
w | 匹配字母,数字或下划线 |
s | 匹配任意的空白符 |
d | 匹配数字 |
b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
[x] | 匹配x字符,如匹配字符串中的a、b、c字符 |
W | w的反义,匹配任意非字母数字下划线和汉字的字符 |
S | s的反义,匹配任意非空白的字符 |
D | d的反义,匹配任意非数字的字符 |
B | b的反义,不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符。[^abc]匹配除了abc这几个字母之外的任意字符 |
量词 | 说明 |
---|---|
* | 重复0次或者多次 |
+ | 重复1次或者更多次 |
? | 重复0次或者1次 |
{n} | 重复n次 |
{n,m} | 重复n到m次 |
{n,} | 重复n或者更多次 |
注意:
1,当我们需要匹配这些元字符的时候,我们需要用到字符转义功能,同样正则表达式里面用表示转义,如要匹配.符号,则需要用.,否则会被解释成“除换行符外的任意字符”。当然,要匹配,则需要。
2,连续的数字或字母可以用-符号连接起来,如匹配所有的小写字母,[1-5]匹配1到5这5个数字。
3,由于对正则表达式的匹配结果不那么确定,可以下载一些辅助工具用于测试正则表达式的匹配结果,比如Match Tracer、RegExBuilder等,以及其他类似的工具。
应用:preg_match( p r e g e x p r e s s i o n , pregexpression, pregexpression,string, m a t c h ) ; 其 中 将 匹 配 结 果 存 放 到 match); 其中将匹配结果存放到 match);其中将匹配结果存放到match中, m a t c h [ 0 ] 为 全 部 匹 配 的 结 果 , match[0]为全部匹配的结果, match[0]为全部匹配的结果,match[1]为第一部分匹配的结果。。。。