网上有份php最难试题,我抽空写了下答案
1、有关PHP字符串的说法,不对的是:
A.如果一个脚本的编码是 ISO-8859-1,则其中的字符串也会被编码为 ISO-8859-1。
很常见吧,gdk和utf-8编码时中文字符串截取都要用不同函数。
B.substr()、strpos()、strlen()、htmlentities() 处理字符串时依据的编码方式是相同的。
htmlentities->php_html_entities->php_escape_html_entities_ex
ext/standard/html.c 1218行,
enum entity_charset charset = determine_charset(hint_charset TSRMLS_CC);
看函数或注释可知,此函数默认使用UTF-8编码。而且这个函数可以指定编码。而其它3个并没有任何编码参数,是纯char *指针的操作。
C.一个布尔值 Boolean 的 true 被转换成 string 的 “ 1 ”,false 被转换成空字符串。
转成字符串用到了_convert_to_string()
在Zend/zend_operators.c 605行
case IS_BOOL:
if (Z_LVAL_P(op)) {
Z_STRVAL_P(op) = estrndup_rel(“1”, 1);
Z_STRLEN_P(op) = 1;
} else {
Z_STRVAL_P(op) = STR_EMPTY_ALLOC();
Z_STRLEN_P(op) = 0;
}
break;
由代码可知,由于boole型在内核中是用long型表示的,其实就是0,flase时,用STR_EMPTY_ALLOC()宏处理,展开宏 #define STR_EMPTY_ALLOC() estrndup(“”, sizeof(“”)-1)
可见,是用””来赋值的。
D.PHP的字符串在内部是字节组成的数组,用花括号访问或修改字符串对多字节字符集很不安全。
正确
答案 B
2、下列Linux下Shell命令的说法,不正确的是:
A.crontab作业:“ 0 5,6,7 * * */home/www/test.sh ”意思是每天的第5,6,7小时执行脚本。
没啥说的就是这个意思
B.“ find ./ -type f -name “*.php” -print0 | xargs -0 wc -l ” 能统计当前目录下PHP代码的总行数。
自己运行下就知道。 比较特殊的是 print0 xargs -0
原来xargs 默认是以空白字符来做分割的,当执行rm时候,如果查找出来的文件名中有空格,那就容易把类似于 test 1.php 当做test 和 1.php来删除。
为了解决这个问题,在打印出每一条记录后,在后面输入一个结束符,代替原来的换行符,然后再以换行符来分割每一条记录,就会保证每一条的唯一性。
为什么不用-exec,而用xargs ?因为find会把找到的记录都给后面的命令传过去执行,-exec有长度限制,可能会出现参数溢出。
find -print 和 -print0的区别:
-print 在每一个输出后会添加一个回车换行符,而-print0则不会。
C.“ $@ ”将函数中所有参数当成单个字符串,“ $* ”把函数的所有参数当一个数组。
百度到答案
$0就是该bash文件名
$?是上一指令的返回值
$*所有位置参数的内容:就是调用调用本bash shell的参数。
$@基本上与上面相同。只不过是
“$*”返回的是一个字符串,字符串中存在多外空格。
“$@”返回多个字符串。
如果用双引号括起来是有区别的。
这题就是用双引用括起来的,所以这题的两个解释都是错误的。
D.Shell下执行命令“ :(){:|:& };: ” ,系统会没有响应,只能重启了。
挺古老的的一个蛋疼小程序了【以前我觉着机器好,就手贱地运行了,于是不出意外地死机了】
原理就是定义一个函数,并不断递归,不停地制造后台任务。如你所见那个函数名就是个冒号,其实这完全就是在扰乱你的视线。【话说回来好像bash里好像也有一个啥事都不干的冒号命令】
写的易懂点:
func () { #函数定义,这里把函数名改成了func
func | func & #管道符连接的命令貌似会同时开始【也有可能是倒序开始来IO阻塞,我对bash研究不深】,所以当下一个func被调用时,一个后台的func已经建立
}
func #那么开始滚雪球,准备好随时power键
答案 C
3、以下正则表达式的说法,错误的是:
A.POSIX兼容正则没有修正符,PERL兼容正则中可能用到修正符。
对的,posix一般是ereg(“[a-z]”),perl对应的是preg(“/[a-z]/is”),postix没有定界符斜线”//”,/is就是修正符,还有不明白的百度。
B.{n,},n是一个非负整数,意思是至少匹配n次; ?等价于匹配长度{0,1} 。
设计如此,记住就好。
C.PERL风格正则默认的非贪婪模式尽可能少的匹配所搜索的字符串。
反了,默认是贪婪的,就像人性一样。只有加个?才是非贪婪,如:(.*?)
D.在执行效率上 preg_match 比ereg的速度要略快一些。
是的,手册上是这么说的,我们信手册就好。
答案 C
4、关于PHP数组的说法,不对的是:
A.无论是 array(1, 2, 3) 还是array(1 => 2, 2=> 4)等,本质上都是hash_table。
没错
B.处理PHP数组,foreach的效率要比for高很多,是因为foreach走的是链表的遍历。
没错,用for的话,要先算索引值,再取数据,感觉也慢不了多少。
C.PHP数组底层采用的是循环链表,正向、反向遍历数组都很方便。
是的,可以看bucket定义
struct bucket *pListNext; // 整个hash表的下一元素 struct bucket *pListLast; // 整个哈希表该元素的上一个元素
D.PHP数组插入和删除操作的时间复杂度都是O(1)。
删除是o(1),
没有hash冲突时,插入是0(1).
p = ht->arBuckets[nIndex]; /* 取到指定位置的bucket指针 */ while (p != NULL) {
…
p = p->pNext; /* 若当前key和要存入的key不同,那么查找Hash拉链的下一个bucket }
由代码可知,如果hash的key对应的位置已经有数据了,则走到下一个空间,再判断。如果还有,继续下一个空间。这就是hash冲突攻击的原理。让这个循环一直继续。直到服务器挂掉。
答案 D
5、有关PHP引用的说法,错误的是:
A.在一个对象的方法中,$this永远是调用它的对象的引用。
对
B.unset一个引用,只是断开了变量名和变量内容之间的绑定,这并不意味着变量内容被销毁了。
对,只有ref_count <= 0 时才释放空间
C.可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值。
对,传址操作
D.PHP引用本质就是指针,在函数调用范围内可以绑定到别的变量上面。
不知道这题在说的是啥,反正看不懂就选它了
答案 D
6、以下对PHP命名空间的说法,不对的是:
A.常量__NAMESPACE__的值是当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它就是一个空字符串。
B.关键字 namespace 可用来显式访问当前命名空间或子命名空间中的元素,它等价于类中的 this 操作符。
和上面一样抄手册的,不过将手册里的self改成了this,所以它错了。
C.任意合法的PHP代码都可以包含在命名空间中,但只有三种类型的代码受命名空间的影响,它们是:类,函数和常量。
少了抄“接口”, 要严格来说,这题也是错的。此题完全就是抄手册,没啥意义,而且还不抄全,差评!
D.访问任意全局类、函数或常量,都可以使用完全限定名称,例如 strlen() 或 Exception 或 INI_ALL。
答案 B
7、下列PHP相关的说法,错误的是:
A.官方不建议将Non Thread Safe用于生产环境,所以我们选择Thread Safe 版本的PHP来使用。
这题主要考thread,没啥意义。线程安全没什么推荐不推荐的,你爱用不用,找到适合你的就好。这题算是嫌疑犯,再看看下面有没有更离谱的,没有就选他了。
B.PHP官方推荐使用Apache的prefork模式,此模式下建议选用Non Thread Safe版本。
prefork模式
这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器,它的工作方式类似于Apache 1.3。它适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。
这是对的,还有一个worker模式,就是多进程,多线程的,要用safe.都啥年头了,反正这两个我都没用,一直用php-fpm.
C.用PHP彩蛋能大致获取PHP的版本,PHP中一共隐藏了4个彩蛋。
鬼才知道你说的是啥彩蛋。是彩蛋的话会告诉你有多少个?就选你了。
D.FastCGI下选择Non Thread Safe版本;ISAPI下选择Thread Safe版本。
反正这是对的,php-fpm就是,由fpm自己管理独立进程,不需要多线程。
答案:C
8、关于JavaScript的说法,不正确的是:
A.JS中的函数就是对象,所以它们可以像任何其他的值一样被使用。
以前网上看到过说:js所有的东西都是对象
B.JS中的对象通过引用来传递,它们永远不会被复制。
C.JS的数组其实就是对象,用for in语句可以遍历数组的所有属性。
这个经常看到和用到吧
D.语句“ alert(1==true); ” 和语句 “ alert(2==true); ” 的结果都是true。
运行下,是false,js认为int型优先,将true转成了 1。这个和php还不一样,php里 if(2==true) 会返回true的。因为他认为bool优先,所以就将2转成了1.
答案 D
9、以下网站安全相关的描述哪个是正确的:
A.禁止用户输入HTML标签就能防止XSS漏洞。
第一感觉这是对的,html都过滤了,你还能搞啥?后来百度了下,还可以用html的16进制版,不过这本质上还是html啊。
B.使用HTTPS无法保证数据传输安全。
那个s就是英文Secure(安全),说成中文就是安全的http,不能保证安全还敢带S?
C.在存储密码时,进行多次MD5比只进行一次MD5更安全。
当然,用slat做二次加密
D.HTTP请求中的POST方式比GET方式安全。
这题也算对,应该伪造post需要些额外工具,get伪造有现成的浏览器。
题目不严谨,只能随便选了。
答案 C
10、以下PHP高级特性的说法,正确的是:
A.我们可以定义一个类去实现预定义接口Iterator,然后就能像访问数组一样访问这个类创建的对象。
Iterator是给foreach用的,像数组一样访问对象用实现ArrayAccess 接口
B.匿名函数也叫闭包函数,常用作回调函数参数的值,但是不能作为变量的值来使用。
$a = function(){} 是合法的。
C.PHP在对象中调用一个不可访问方法时,__invoke() 方法会被自动调用。
这个是__CALL的作用,_invoke()是当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。 手册上有 http://php.net/manual/zh/language.oop5.magic.php#object.sleep
D.spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载,不再建议使用 __autoload() 函数。
答案:D
11、下列关于HTTP协议的说法,错误的是:
A.如果本地开启了Cookie,那么每打开一个网址,HTTP请求就会把相应的Cookie传给Web服务器。
B.HTTP是一个基于请求与响应模式的、无状态的、应用层的协议,绝大多数的Web开发都是基于HTTP协议。
C.HTTP响应的状态码为301意思是暂时地把内容转移到一个新的URL,但是老的URL还没有废除。
301永久,302暂时。考记忆力的。
D.绝大多数的Web开发离不开Cookie,如果禁用Cookie导致Session失效,可以通过URL来传递
sessionID。
是的,会在url后增加 ?PHPSESSID=xxxx
答案 C
12、以下对PHP文件处理的说法,正确的是:
A.file() 函数既能读取文本文件也能读取二进制文件,但是读取二进制文件有可能出现安全问题。
B.fsockopen()和fputs() 结合起来可以发送邮件,也可以用来抓取网页内容,下载ftp文件等。
是的,一切都是基本socket的
C.如果表单中没有选择上传的文件,则 PHP 变量 的值将为NULL 。
是的
D.file_get_contents() 函数能用来抓取网页数据,但是没办法设置超时时间 。
why not?
$opts = array(
‘http’=>array(
‘method’=>”GET”,
‘timeout’=>1,//单位秒
)
);
file_get_contents(“http://www.baidu.com”, false, stream_context_create($opts))
13、关于Mysql索引的说法,不对的是:
A.一般情况下不鼓励使用like操作,类似的“ like “abc%” ” 可以使用到索引。
对的,不要 like “%abc”就好
B.500万数据的用户表user在性别字段sex上建立了索引,语句 “select * from user where sex=1 ” 并不会提速多少。
如果男女数相同,0,1两个索引,0索引会存放1半的数据,意味着,还要在250万份数据上再搜索。
C.对于需要写入数据的操作,比如DELETE、UPDATE以及INSERT操作,索引会降低它们的速度。
是的,写操作时,也维护索引
D.唯一索引允许空值,而主键索引不允许为空值,除此之外它们是相同的。
主键索引是物理存储的聚集索引,还有主键只能有1个。
答案 D
14、下列有关数据结构的说法,不正确的是:
A.5000个无序的元素,希望用最快的速度挑选出其中前50个最大的元素,最好选用堆排序。
B.直接选择、二分法、冒泡、基数等排序方法都是稳定的排序方法。
C.深度优先遍历是一个递归算法,在遍历的过程中,先访问的点被压入栈底。
D.栈和队列都只允许在端点处插入和删除元素。
15、以下关于NOSQL的说法,不对的是:
A.MongoDB支持CAP定理中的AP,MySQL支持CAP中的CA,全部都支持不可能存在。
B.Redis支持字符串、哈希、列表、集合、有序集合等数据结构,目前Redis不支持事务。
C.Memcache既支持TCP协议,也支持UDP协议,我们可以把PHP的Session存放到Memcache中。
D.MongoDB不用先创建Collection的结构就可以直接插入数据,目前MongoDB不支持事务。
16、关于设计模式的说法,错误的是:
A.观察者模式中,观察者可以改变被观察者的状态,再由被观察者通知所有观察者依据被观察者的状态进行。
B.MVC模型的基本工作原理是基于观察者模式,实现是基于命令模式。
C.创立型模式的根本意图是要把对象的创建和使用分离的责任进行分离,从而降低系统的耦合度。
D.设计模式的核心原则是:”开-闭”原则:对扩展开放,对修改关闭。
17、下列关于常见开源PHP系统的说法,不对的是:
A.Laravel要求PHP版本>= 5.3 ,它拥有更富有表现力的语法、高质量的文档、丰富的扩展包,被称为“巨匠级PHP开发框架”。
B.Discuz采用单一入口的设计模式,这样的模式在权限控制,URL重写等方面都很有优势。
C.WordPress的博客程序定位,简单的数据库层等都注定了他不能适应大数据。
D.HDWiki的插件共有三种类型,钩子类型、前台应用和后台应用类型,在后台可以在线安装HDWiki插件。
答案 C
18、以下关于“表驱动法”的描述,错误的是:
这题考的是代码大全18章里的内容。
A.表驱动法查找无规则分布的数据采用阶梯访问的方法最佳。
B.表驱动法是一种编程模式——从数据库表里面查找信息而不使用逻辑语句。
C.凡是能通过逻辑来选择的事物,都可以通过查表来选择。
这句话来自代码大全第18章的开头
D.表驱动法可以作为复杂继承结构的替代方案,难点在于一个经过深思熟虑的查询表。
19、下列关于全文检索技术的说法,不对的是:
A.Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL做全文搜索,它可以提供比数据库本身更专业的搜索功能。
B.Solr是新一代的全文检索组件,它比Lucene的搜索效率高很多,还能支持HTTP的访问方式,PHP调用Solr也很方便。
solr的底层是Lucene,就是php的底层是c一样,php怎么可能比c快。
C.Lucene附带的二元分词分析器CJKAnalyzer切词速度很快,能满足一般的全文检索需要。
D.MySQL中把一个字段建立FULLTEXT索引,就可以实现全文检索,目前MyISAM和InnoDB的table都支持FULLTEXT索引。
旧版innodb不支持,现在都支持了。
答案 B
20、以下关于大型网站的说法,正确的是:
A.大型网站开发很多细节和小网站有巨大差异,如“浏览次数”,小网站用数据库记录,大型网站常采用NoSQL来存储。
B.虚拟机技术不能用在大型网站上,是因为虚拟机性能较差,而大型网站的访问压力太大,采用后服务器可能会宕机。
虚机集群
C.大型网站选择开发语言很重要,PHP只适合开发中小型网站,并不适合开发大型网站。
扯
D.大型网站程序异常后,程序员可以依据服务器日志信息定位错误,然后在服务器上用vim修正错误即可。
有种
答案:A