一、计算题
1》算术题
echo "1" + 2+"1+3"+5; echo 1 + 2+"1+3"; echo 1 + 2+"1+3"+5; echo 1 + "2"+"1+3"+5;
分析:" 1" 引号中的数字,单个用于计算,"2+3",这种多个,只有第一个2 会用于计算,
答案:9,7,9,9
二、匹配题 常用正则表达式
1》 Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
2》手机号:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
三、PHP7 与 PHP5 的对比
1》php标量类型和返回类型声明
#主要分为两种模式,强制性模式和严格模式 declare(strict_types=1) #1表示严格类型校验模式,作用于函数调用和返回语句;0表示弱类型校验模式。
2》NULL合并运算符
$site = isset($_GET['site']) ? $_GET['site'] : 'wo'; #简写成 $site = $_GET['site'] ??'wo';
3、组合预算符
// 整型比较 print( 1 <=> 1);print(PHP_EOL); print( 1 <=> 2);print(PHP_EOL); print( 2 <=> 1);print(PHP_EOL); print(PHP_EOL); // PHP_EOL 为换行符 //结果: 0 -1 1
4》常量数组
// 使用 define 函数来定义数组 define('sites', [ 'Google', 'Jser', 'Taobao' ]); print(sites[1]);
5》匿名类
interface Logger { public function log(string $msg); } class Application { private $logger; public function getLogger(): Logger { return $this->logger; } public function setLogger(Logger $logger) { $this->logger = $logger; } } $app = new Application; // 使用 new class 创建匿名类 $app->setLogger(new class implements Logger { public function log(string $msg) { print($msg); } }); $app->getLogger()->log("我的第一条日志");
6》Closure::call()方法增加,意思向类绑定个匿名函数
<?php class A { private $x = 1; } // PHP 7 之前版本定义闭包函数代码 $getXCB = function() { return $this->x; }; // 闭包函数绑定到类 A 上 $getX = $getXCB->bindTo(new A, 'A'); echo $getX(); print(PHP_EOL); // PHP 7+ 代码 $getX = function() { return $this->x; }; echo $getX->call(new A); ?>
7》CSPRNG(伪随机数产生器)。
PHP 7 通过引入几个 CSPRNG 函数提供一种简单的机制来生成密码学上强壮的随机数。 random_bytes() - 加密生存被保护的伪随机字符串。 random_int() - 加密生存被保护的伪随机整数。
8》异常
PHP 7 异常用于向下兼容及增强旧的assert()函数。
9》use 语句改变
<?php #可以导入同一个namespace下的类简写 use some\namespace\{ClassA, ClassB, ClassC as C};
10》Session 选项
1.session_start()可以定义数组
<?php session_start([ 'cache_limiter' => 'private', 'read_and_close' => true, ]); ?>
2.引入了一个新的php.ini设置(session.lazy_write),默认情况下设置为 true,意味着session数据只在发生变化时才写入。
11》PHP 7 移除的扩展
ereg mssql mysql sybase_ct
为什么 PHP7 比 PHP5 性能提升了?
1、变量存储字节减小,减少内存占用,提升变量操作速度
2、改善数组结构,数组元素和hash映射表被分配在同一块内存里,降低了内存占用、提升了 cpu 缓存命中率
3、改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高执行效率
四、常见状态码
- 301 - 资源(网页等)被永久转移到其它URL
- 302 - 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。
- 404 - 请求的资源(网页等)不存在
- 401 - 客户试图未经授权访问受密码保护的页面
- 403 - 资源不可用
- 500 - 内部服务器错误
- 502 - 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
五、 常见数组函数
- array_unique: 移除数组重复的值
- array_unshift: 在数组开头插入元素
- shuffle: 将数组顺序打乱
- count: 计算数组长度
- array_key_exists: 数组是否存在指定键
- array_key_first: 获取数组第一个键
- array_key_last: 获取数组最后一个键
- array_pop: 弹出数组最后一个元素
- array_push: 将值压入数组末尾
- array_shift: 弹出数组第一个元素
- in_array: 指定值在数组中是否存在
- array_search: 返回数组中指定值的第一个键
- next; 将数组指针指向下一个, 并返回下一个元素
- prev: 将数组指针指向前一个, 并返回前一个元素
- reset: 将数组指针指向第一个, 并返回元素
- list: 将数组的元素依次赋值给指定变量
- array_values: 返回数组所有值
- array_keys: 返回数组所有键
- array_merge: 合并一个或多个数组
- array_combine: 将两数组合并,一个数组作为键,一个数组作为值
六、字符串函数
strlen($str);//返回字符串长度 mb_strlen($str) 可以返回中文字符长度; strtolower($str);//字母转小写 strtoupper($str);//字母转大写 ucwords($str);//每一个单词的首字母转大写 ucfirst($str);//首字母转大写 str_replace('a','b',$str);//b替换$str 中的a 区分大小写 ; str_ireplace('a','b',$str);//替换 不区分大小写 htmlspecialchars($str,ENT_NOQUOTES); //字符串转换为html 实体 ENT_COMPT(默认只编译双引号)ENT_QUOTES单引号双引号都编译,ENT_NOQUOTES不编译任何引号 trim($str);//删除字符串前后(左右)空格 ltrim($str);//只删除字符串左侧的空格 rtrim($str);//只删除字符串右侧的空格 //trim加第二个参数 就是移除指定的字符集 如ltrim($str,'0..9') 移除左侧数字开头的字符 strpos($str,'a’);//字符串a 在$str 第一次出现的位置 索引0开始 没有出现返回false 区分大小写 stripos($str,'a’);//同上 但是不区分大小写 strrpos($str,'a’);//字符串a 在$str 最后一次出现的位置 索引0开始 没有出现返回false 区分大小写 strripos($str,'a’);//同上 但是不区分大小写 substr($str,0,3);//截取字符串 $str 的第一个字符 截取长度3 长度不填默认截取到最后 参数为负数则倒数 strstr($str,'a');//截取字符串 $str 中的第一个字符'a'后的字符串 如 sabc -> abc strrchr($str,'a');//截取字符串 $str 中最后一一个字符'a'后的字符串 strrev($str);//字符串反转 abcd->dcba md5($str);//字符串MD5加密 str_shuffle($str);//随机打乱字符串顺序 explode('-',$str);//指定分隔符分割字符串 返回数组 ‘-’ 分割$str implode('-',$str);//数组拼接字符串 与explode()相反
七、什么是事务?
指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
事务就是并发控制的单位,就必须满足ACID属性。
A:原子性(Atomicity)
事务中的操作要么都不做,要么就全做。
C:一致性(Consistency)
事务执行的结果必须是从数据库从一个一致性状态转换到另一个一致性状态。
I:隔离性(Isolation)
一个事务的执行不能被其他事务干扰
D:持久性(Durability)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的
八、PHP生命周期?
1、模块初始化阶段(module init):
这个阶段主要进行php框架、zend引擎的初始化操作。这个阶段一般是在SAPI启动时执行一次,对于FPM而言,就是在fpm的master进行启动时执行的。php加载每个扩展的代码并调用其模块初始化例程(MINIT),进行一些模块所需变量的申请,内存分配等。
2、请求初始化阶段(request init):
当一个页面请求发生时,在请求处理前都会经历的一个阶段。对于fpm而言,是在worker进程accept一个请求并读取、解析完请求数据后的一个阶段。在这个阶段内,SAPI层将控制权交给PHP层,PHP初始化本次请求执行脚本所需的环境变量。
3、php脚本执行阶段
php代码解析执行的过程。Zend引擎接管控制权,将php脚本代码编译成opcodes并顺次执行
4、请求结束阶段(request shutdown):
请求处理完后就进入了结束阶段,PHP就会启动清理程序。这个阶段,将flush输出内容、发送http响应内容等,然后它会按顺序调用各个模块的RSHUTDOWN方法。 RSHUTDOWN用以清除程序运行时产生的符号表,也就是对每个变量调用unset函数。
5、模块关闭阶段(module shutdown):
该阶段在SAPI关闭时执行,与模块初始化阶段对应,这个阶段主要是进行资源的清理、php各模块的关闭操作,同时,将回调各扩展的module shutdown钩子函数。这是发生在所有请求都已经结束之后,例如关闭fpm的操作。(这个是对于CGI和CLI等SAPI,没有“下一个请求”,所以SAPI立刻开始关闭。)
九、Laravel 相关
1》orm 修改器和访问器函数怎么写
定义访问器:需要在模型中创建一个 getFooAttribute
方法,其中 Foo
是你想要访问的字段名(使用驼峰式命名规则)
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* 获取用户的名字
*
* @param string $value
* @return string
*/
public function getFirstNameAttribute($value)
{
return ucfirst($value);
}
}
正如你所看到的,该字段的原生值被传递给访问器,然后返回处理过的值。要访问该值只需要简单访问 first_name 即可:
$user = App\User::find(1);
$firstName = $user->first_name;
2》修改器
要定义一个修改器,需要在模型中定义 setFooAttribute
方法,其中 Foo
是你想要访问的字段(使用驼峰式命名规则)。接下来让我们为 first_name
属性定义一个修改器,当我们为模型上的 first_name
赋值时该修改器会被自动调用:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* 设置用户的名字
*
* @param string $value
* @return string
*/
public function setFirstNameAttribute($value)
{
$this->attributes['first_name'] = strtolower($value);
}
}
该修改器获取要被设置的属性值,允许你操纵该值并设置 Eloquent 模型内部属性值为操作后的值。例如,如果你尝试设置 Sally 的 first_name 属性:
$user = App\User::find(1);
$user->first_name = 'Sally';
2》laravel 模型关联
参考地址:https://laravelacademy.org/post/8203.html#toc_2
3》laravel 集合函数
collect() filter() search() chunk() dump() map() zip() max() each() forget()