笔试题 40分钟,A4纸手写。
好多年都没握过笔了。
MVC 中的 M, V, C 分别代表什么?
我的答案:
Model
View
Controller
分析:回答比较粗浅,只写出了完整的单词。
以下代码的运行结果
$value = FALSE; if (empty($value)) { echo 'null'; } else { echo 'have value'; } 我的回答:have value
正确答案:null
分析:对 empty 方法记忆模糊不清。
判断一个变量是否被认为是空的。当一个变量并不存在,或者它的值等同于false,那么它会被认为不存在。如果变量不存在的话,empty()并不会产生警告。
——empty
写出示例中日本电话号码的正则:03-1234-5678,06-1224-5989
我的回答:正则不熟悉,随便写了些。
正确答案:
改进:系统学习下正则,之前也学过,用的时候还是习惯去搜现成的表达式。归根结底还是没学会。
在线正则表达式 正则表达式 – 教程 | 菜鸟教程 正则表达式 - JavaScript | MDN 写出下面代码的运行结果:
$arr = [2, 3, 5, 8, 10, 9, 7, 5, 9]; // 2 3 5 8 10 9 7 5 9 // 0 1 2 3 4 5 6 7 8 // 0 5 // 1 8 // 2 9 // 3 9 // 4 数组没有下标为10的元素 null $num = 0; for ($i = 0; $i < 5; $i++) { $num += $arr[$arr[$i]]; } echo $num; 我的回答:31
实际情况:
PHP Notice: Undefined offset: 10 in /code/demo11.php on line 28 分析:分析出来下标为 10 的数组元素不存在会报错,答案硬是给写出来了个数字。感觉自己太教条了,认为程序的目的是算出一个数字,不管咋都要得出个结果。
在 Linux 下,从当前文件夹及子目录中查找内容中包含 old 的文件:
我的答案:find -R ./* | grep 'old'
正确答案:grep -lr 'old'
分析:
虽然现在主力系统是 ubuntu,但是平常搜文件都是图形界面搜索,查找某个字符也是直接在 VSCode 中直接全局查找。
在终端查找的这些命令不熟悉,猜测是用 find 查找,结合用过的其他命令,拼凑了一个自己实际没用过的答案。
改进:熟悉常用的 Linux 命令。
find,ps 这个我真不常用。 grep(1),print lines that match patterns. 在其他命令中捎带使用。比如: cat ~/.bashrc | grep ssh,不过笔试题这里用的是 grep(1p)。 grep(1p),search a file for a pattern。 写一个方法,不使用 PHP 内置函数,翻转一个字符串:
我的答案:思路是把字符串分割成数组,然后重新排序,再拼回去。但是因为要用笔,纯手写,写了一通又划掉了。
回来以后写的答案:
function strReverse(string $str = '') { $strs = mb_str_split($str); return implode(array_reverse($strs)); // 不知道这算不算使用内置函数 // 直接使用内置函数: strrev($str); } echo strReverse('ni da ye de ...'); 分析:
当时也没想起来用 mb_str_split 分割字符串,实际项目中也没用上过这个函数。
想到的是 explode(实际是没办法按每个字符分割的),结果和 implode 老是搞混,写的是 implode。
数组翻转的函数名 array_reverse 当时也没想起来,说实话 strrev 我也没想起来,curd 的时候也没用上过。
写一个方法,不使用 PHP 内置函数,去重并打印数组中的数字:$arr = [5, 6, 5, 8, 10, 6, 9, 20];,打印结果为:5 6 8 10 9 20。
我的答案:虽然打印出来了,但是格式不对,中间没有空格。
$arr = [5, 6, 5, 8, 10, 6, 9, 20]; $tmp = []; foreach ($arr as $k => $v) { if (!in_array($v, $tmp)) { $tmp[] = $v; echo $v; } } 回来后改进:
$arr = [5, 6, 5, 8, 10, 6, 9, 20]; $tmp = []; foreach ($arr as $k => $v) { if (!in_array($v, $tmp)) { $tmp[] = $v; } } echo implode(' ', $tmp); 写一个方法,获取文件 somefile.log 的文件扩展名:
这道题出的不太清晰,是先读文件获取文件的真实扩展名呢,还是直接从文件名获取扩展,时间要紧咱选个简单的。
我的答案:
function getExtention(string $file) { return implode('.', $file)[1] ?? ''; return explode('.', $file)[1] ?? ''; // 应该用 explode,因为记混了,用了 implode。 } getExtention('somefile.log'); 回来后尝试:
function getExtention(string $file) { return explode('.', $file)[1] ?? ''; } echo getExtention('somefile.log'); 改进,当时没考虑到 xxx.xxx.xx.log 这种情况,经 大佬 提醒,做如下改进:
function getExtention(string $file) { $res = explode('.', $file); return end($res) ?? ''; // 这里为啥不像下边这样写呢? 参见手册 // return end(explode('.', $file)) ?? ''; } echo getExtention('xxx.xxx.somefile.log'); end,end(array|object &$array): mixed
将 array 的内部指针移动到最后一个单元并返回其值。
array 这个数组。 该数组是通过引用传递的,因为它会被这个函数修改。 这意味着你必须传入一个真正的变量,而不是函数返回的数组,因为只有真正的变量才能以引用传递。
什么是「数据库事务」和「存储过程」,两者有啥区别?
我的答案:事务,保证数据的原子性,方便回滚。存储过程没了解过,也没用过。
分析:心里明白一点,写的时候只记起来了原子性和回滚。
改进:
数据库事务,(简称:事务)(英语:transaction)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
数据库事务通常包含了一个序列的对数据库的读/写操作。包含有以下两个目的:
为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
当事务被提交给了数据库管理系统(DBMS),则DBMS需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要滚,回到事务执行前的状态;同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。
ACID性质:
原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。 存储过程,又称存储程序(英语:Stored Procedure),是在数据库存储复杂程序,以便外部程序调用的数据库对象,可以视为数据库的一种函数或子程序。
优点:
存储过程可封装,并隐藏复杂的商业逻辑。 存储过程可以回传值,并可以接受参数。 存储过程无法使用 SELECT 指令执行,因为它是子程序,与查看表、资料表或用户定义函数不同。 存储过程可以用在资料检验,强制实行商业逻辑等。 缺点:
存储过程,往往定制于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。 存储过程的性能调校与撰写,受限于各种数据库系统。 数据库索引和关联查询、插入一条数据、删除符合条件的数据。
没啥可说的,这块没啥问题。
...