变量
什么是引用变量?在PHP中,用什么符号定义引用变量?
- 概念:在PHP中引用意味着用不同的名字访问同一个变量内容。
- 定义方式:使用&符号
//range(m,n);生成一个m到n的数组
$a = range(0,1000);
//$a 和 $b 共同指向一处内存
$b = $a;
//Cow Copy On Write
//$a 重新分配内存
$a = range(0,1000);
//unset 只会取消引用,不会销毁空间
unset($a);
//关于类 对象本身就是引用传值
1.$a = 'a';
$b = &$a;
$b = 'b';
echo $a;//打印出 b
2.$data=array('a','b','c');
foreach($data as $k => $v){
$v = &$data[$k];
var_dump($data);
}
//输出 abc bbc bcc
字符串
PHP中字符串可以使用那三种定义方法以及各自的区别是什么?
- 双引号 单引号 newdoc heredoc
- 单双引号的区别
1.双引号可以解析变量 效率差一点
2.单引号不可以解析变量 效率高一点
3. newdoc相当于单引号 heredoc相当于双引号 处理大字符串
数据类型
三大数据类型(标量 符合 特殊)
浮点型不能用来比较
布尔类型 false的七种情况
整型0、浮动0.0、布尔false、空字符串、0字符串、空数组、NULL
数组类型
超全局数组
$GLOBALS、($_REQUEST、($_GET、$_POST、$_COOKIE)、$_SESSION、$_SERVER、$_FILES、$_ENV )
$GLOBALS包含后面所有
$_REQUEST包含get post cookie ,尽量少用
$_SERVER['SERVER_ADDR']服务器端IP地址 重点!
$_SERVER['REMOTE_ADDR']客户端IP地址 重点!
$_SERVER['SERVER_NAME']服务器名称
$_SERVER['REQUEST_TIME']请求时间
$_SERVER['QUERY_STRING'] 路径问号后面的字符串
$_SERVER['HTTP_REFERER']上级请求的页面
$_SERVER['HTTP_USER_AGENT']头信息
$_SERVER['PATH_INFO']返回部分URL路径
$_SERVER['REQUEST_URI'] 返回URL路径
//当前页面是http://www.zixueku.com/plus/search.php?kwtype=0&keyword=php&searchtype=titlekeyword
echo $_SERVER["REQUEST_URI"];
//结果就为:plus/search.php?kwtype=0&keyword=php&searchtype=titlekeyword
NULL
直接赋值为NULL、未定义的变量、uset销毁的变量
常量
常量一经定义,不能修改和删除
const、define
const更快 是语言结构 define是函数
define不能定义类的常量,const可以
- 预定义常量
__FILE__文件路径名和名称
__LINE__所在行的行号
__DIR__ 所在目录
__FUNCTION__ 所在函数体的函数名称
__CLASS__ 所在类的类名
__TRAIT__ 此常量返回 trait 被定义时的名字(区分大小写)
__METHOD__ 返回类名加方法名
__NAMESPACE__ 返回命名空间名称
用PHP写出显示客户端IP与服务器IP的代码
<?php
echo $_SERVER['SERVER_ADDR'];
echo "<br>";
echo $_SERVER['REMOTE_ADDR'];
?>
__FILE__表示什么意思?
返回所在文件的文件名
运算符
foo()和@foo()之间的区别
- PHP支持一个错误运算符:@ 当将其放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都被忽略掉
运算符的优先级
递增/递减 > ! > 算术运算符 > 大小比较 > (不)相等比较 > 引用 > 位运算符(^) > 位运算符(|) > 逻辑与(&&) > 逻辑或(||) > 三元 > 赋值 > and > xor > or
递增/递减 > ! > 算术运算符 > 大小比较 > 逻辑与 > 逻辑或 > 三元 > 赋值
推荐使用括号
- false的七种情况
- 递增递减不影响布尔值
- 递减NULL 无效
- 递增NULL 值为1
- 递增/递减在前 先运算 后返回值
- 递增/递减在后 先返回值 后运算
- 短路作用
- ||和&&与or和and的优先级不同
1. $a = true || $b == 3; // $a = (true || ($b == 3))
2. 短路作用
$b = false && $a == 1; //$b = (false && ($a ==1))
$a = false || true; //$a = (false || true) 输出true
$b = false or true; //($b = false) or true 输出false
3. $a = 0;
$b = 0;
if($a = 3 > 0 || $b = 3 > 0) //if(($a = (3 > 0) ||) $b = 3 > 0){ //$b = 3 > 0 短路不执行
$a++;
$b++;
echo $a; //ture递增 输出 1
echo $b; //递增0 输出 1
}
4. var_dump($a=false || $a = true); //bool(true)
var_dump($a=true || $a = false); //bool(true)
流程控制
请列出三种PHP数组循环操作的语法,并证明各种循环的区别
考察:PHP遍历数组的三种方式 及各自区别 延伸:分支结构
- for循环
- 只能遍历索引数组
- foreach遍历
- 可以遍历索引和关联数组
- 会执行reset()操作
- while、list()、each()组合
- 可以遍历索引和关联数组
- 不会重置数组的指针 reset()操作
if…else if
- 在else if 语句中,只能有一个表达式为true。只能有一个语句块被执行。
- 优先把范围小的条件放在前面处理,利于优化性能。
switch…case…
- switch后面的控制表达式的数据类型只能是 整型、浮点、字符串类型
- continue语句作用到switch的作用类似于break
- continue n 跳出n层循环
- 比if…else if 效率高
for(){
switch($var){
case ...;
//代码
break;
case ...;
//代码
break(等价于continue);
case ...;
//代码
break(continue 2 跳出两层循环);
default:...;
//代码
break;
}
}
PHP中如何优化多个 if…else if 语句的情况?
表达式的可能越大越往前放
使用switch…case效率更高
自定义函数及内部函数
<?php
$count = 5;
function get_count()
{
static $count;
return $count++;
}
echo $count; //5
++$count; //6
echo get_count; //null 不会被输出
echo get_count; //1
- 考点:变量的作用域和静态变量
- global关键字
- 静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不会消失。
- static关键字
- 仅初始化一次
- 初始化时需要赋值
3.每次执行函数,该值都会保留 - static修饰的变量是局部的,仅在函数内部有效
- 可以记录函数的调用次数,从而可以在某些条件下终止递归
$a = 'a';
$b = 'b';
$c = 'c';
function a()
{
global $b;
$GLOBAL['c'];
echo $b;
echo $c;
echo $a;
}
a(); //输出 b c 报undefined variable $a错误
- 延伸:函数的参数及参数的引用传递
$a = 1;
$b = 1;
function fun($a,&$b){
$a = 2;
$b = 2;
}
fun($a,$b);
echo $a; //1
echo $b; //2
- 延伸:函数的返回值及引用返回
- 值通过使用可选的返回语句(return)返回
- 可以返回包括数组、对象的任意类型
- 返回语句会终止函数执行,将控制权交回函数调用处
- 省略return,返回值位NULL,不可有多个返回值
- 引用返回
- 从函数返回一个引用,必须在函数声明和 指派 返回值 给一个变量时,都使用引用运算符&
function &fun()
{
static $b = 10;
echo $b.' ';
return $b;
}
$a = fun(); //$a 等于 10
$a = &fun();
$a = 100;
echo fun(); //输出 20 100 不会改变$b的值,只会改变fun()的返回值
- 从函数返回一个引用,必须在函数声明和 指派 返回值 给一个变量时,都使用引用运算符&
- 延伸:外部文件的导入
- include/require语句包含并运行指定文件
- 如果给出路径名 按照路径来找,否则从include_path中找(环境变量)
- 然后从调用脚本文件所在的目录和当前工作目录下寻找
- 当一个文件被包含时,其中所包含的代码继承了include所在行的变量范围
- 未找到文件,include结构会发出一条警告;require则会发出一个致命错误
- 延伸:系统内置函数
- 时间日期函数
- date() 格式化输出日期
- strtotime() 将任何英文文本的日期时间描述解析为 Unix 时间戳
- mktime() 取得一个日期的 Unix 时间戳
- time() 返回当前时间戳
- microtime() 返回当前 Unix 时间戳和微秒数
- date_default_time设定用于一个脚本中所有日期时间函数的默认时区
- IP处理函数
- ip2long() IPv4地址转换成整型
- long2ip()将对应的整型数字格式转为IPv4地址
- 打印处理
- print() 只能打印一个值
- printf() 输出格式化字符串
- print_r()
- echo 可以多值输出
- sprintf()
- var_dump() 格式化打印
- var_export() 格式化打印、返回的数组可以直接使用
- 序列化和反序列化
- serialize()
- unserialize()
- 字符串处理函数
- implode() 将一维数组转化为字符串
- explode() 用一个字符串分割另一个字符串
- join() implode的别名
- strrev() 翻转字符串
- trim() 去除字符串两边空格
- ltrim() 去除字符串左边空格
- rtrime() 去除字符串右边空格
- strstr() 查找字符串的首次出现
- number_format() 以千分位隔符方式格式化一个数字
- 数组处理函数
- array_keys() 返回数组所有的键
- array_values() 返回数组所有的值
- array_diff() 求数组差集
- array_intersect() 求数组交集
- array_merge() 数组合并
- array_shift() 数组头部弹出一个值,返回弹出的值
- array_unshift() 数组头部加入一个值,返回数组新的单元数
- array_pop() 数组尾部弹出一个值,返回被弹出的值
- array_push() 数组尾部压入一个或多个值,返回新单元数
- sort() 排序
- 时间日期函数
$var1 = 5;
$var2 = 10;
function foo(&$my_var)
{
global $var1;
$var1 +=2; //=>7
$var2 = 4; //=>4
$my_var += 3; //=>8
return $var2; //=>4
}
$my_var = 5;
echo foo($my_var); //=>4
echo $my_var; //=>8
echo $var1; //=>7
echo $var2; //=>10
$bar = 'foo';
$my_var = 10;
echo $bar($my_var); //=>$foo($my_var) =>4
正则表达式
至少写出一种验证139开头的手机号的正则表达式
$str = 13988882222;
$pattern = '/^139\d{8}$/';
preg_match($pattern,$str,$match);
var_dump($match);
- 正则表达式的作用:分割、查找、匹配、替换字符串
- 分隔符:正斜线(/)、hash符号(#)以及取反符号(~)
- 通用原子:
- \d 0-9
- \D 除了0-9
- \w 数字字母下划线
- \W 除了数字字母下划线
- \s 匹配任何空白字符,包括空格、制表符、换页符等等
- \S 匹配任何非空白字符,包括空格、制表符、换页符等等
- 元字符
- . 除换行符以外的任意字符
-
- 重复零次或更多次
-
- 匹配至少 1 个元字符,相当于 {1,}
- ? 匹配 0 到 1 个元字符,相当于 {0,1}
- ^ 以某某开始
- $ 以某某结束
- {n} 匹配n次
- {n,} 匹配n次或更多次
- {n,m} 匹配n到m次
- [] 括号内为逻辑或 关系
- () 括号内视为一个原子
- [^]
- | 逻辑与
- [-]
- 模式修正符
- i 不区分大小写的匹配
- g 表示全局匹配
- m 将字符串视为多行,不管是那行都能匹配;
- e 配合函数preg_replace()使用,可以把匹配来的字符串当作正则表达式执行;
- s 将字符串视为单行,换行符作为普通字符
- U 只匹配最近的一个字符串,不重复匹配。反贪婪模式
- x 将模式中的空白忽略;
- A 强制从目标字符串开头匹配;
- D 如果使用$限制结尾字符,则不允许结尾有换行;
- u 表示待匹配的串是一个符合 unicode 编码规则的串
- 后向引用
- 贪婪模式
- PCRE函数
- preg_match() 执行一个正则表达式匹配
- preg_match_all() 执行一个全局正则表达式匹配
- preg_replace() 执行一个正则表达式的搜索和替换
- preg_split() 通过一个正则表达式分隔字符串
匹配所有img标签中的src的值
$str = '<img id="av" src="av.jpt" alt="高清无码">';
$pattern = '/<img.*?src="(.*?)".*?\/?>/i';
preg_match($pattern,$str,$match);
var_dump($match);
面向对象
- 单一继承
- 方法重写
- 多态
- 抽象类的定义
- -
- 接口的定义
- -
- 抽象类的定义
- 魔术方法
- -
- 设计模式
- 工厂模式
- 单例模式
- 注册数模式
- 适配器模式
- 观察者模式
- 策略模式
你在开发中使用过哪些设计模式,这些设计模式实现的原理是什么?
请写出PHP的构造函数和析构函数
请写出PHP的类权限控制修饰符
- public
- protected
- private
网络协议
- HTTP协议状态码
- 200 ok
- 204 请求成功 返回内容为空
- 206 请求成功 返回部分内容
- 301 永久性重定向
- 302 临时重定向
- 303 请求的资源有另一个uri 因修改git方法定向获取资源
- 304 允许请求,但没有满足附带的条件
- 307 = 302
- 400 请求报文中有语法错误
- 401 没有所需要的http认证信息
- 403 服务器拒绝请求
- 404 找不到页面
- 500 服务器发生错误
- 503 服务器超负载或正在停机维护
- OSI七层模型
- -
开发环境及配置
您是否使用过版本控制器软件?如果有 您用的版本控制器软件的名字是什么?
php的运行原理
- CGI php解析器和webServer之间的桥梁
- FastCGI 是一套协议,不再是通过简单的环境变量、标准输入和标准输出来接收和传递数据了。一般来说,FastCGI 用 TCP 或者命名管道(Named Pipe)传输数据
- PHP-FPM 是FastCGI的进程管理器
- master进程 负责监听端口
- work进程 处理代码 一般有多个
register_globals 注册为全局变量,开启时,传递过来的值会被直接的注册为全局变量直接使用,关闭时,我们需要到特定的数组里去得到它。建议关闭
allow_url_fopen 是否允许被远程打开文件
allow_url_include 是否允许远程包含文件:包括,include_once,required,require_once。
date.timezone 设置时区
display_errors 是否在屏幕显示报错信息
error_reporting 设置错误报告等级
safe_mode php 安全模式
upload_max_filesize 上传文件的最大
max_file_uploads 上传文件的最大数
post_max_size post上传文件的最大值
请简述CGI FastCGI和PHP-FPM的区别
- CGI 负责连接php解析器和webServer
- FastCGI提高了CGI效率
- PHP-FPM 是FastCGI加上进程管理器
Linux
写出尽可能多的Linux的命令
- 系统定时任务
- vi/vim编辑器
- shell基础
- 脚本执行方式
- 赋予权限,直接执行,例:chmod + test.sh;./test.sh
- 调用解释器使得脚本执行,例:bash csh ash bsh
- ksh
- source 例:source test.sh
- 编写基础
- 开头用#!指定脚本解释器,例如:#!/bin/sh
- 脚本执行方式
- 系统安全
- sudo su chmod setfacl
- 进程管理
- w top ps kill pkill pstree killall
- 用户管理
- id usermod useradd groupadd userdel
- 文件系统
- mount umount fsck df du
- 系统关机和重启
- shutdown reboot
- 网络应用
- curl telnet mail elinks
-网络测试 - ping netstat host
- curl telnet mail elinks
- 网络配置
- hostname ifconfig
- 常用工具
- ssh screen clear who date
- 软件包管理
- yum rpm apt-get
- 文件查找和比较
- locate find
- 文件内容查看
- head tail less more
- 文件处理
- touch unlink rename In cat
- 目录操作
- cd mv rm pwd tree cp ls
- 文件权限属性
- setfacl chmod chown chgrp
- 压缩解压
- tar bzip2/bunzip2 gzip/gunzip zip/unzip
- 文件传输
-ftp scp - Linux系统定时任务
crontab -e
* * * * * 命令(分 时 日 月 周)
at命令
#at 2:00 tomorrow
at>/home/Jason/do_job
at>Ctrl+D
如何实现每天0点重新启动服务器
crontab -e
0 0 * * * reboot
GodConfident