最近招PHP出的一道面试题

2,728 views

有简单的地方, 也有坑的地方。 但是基本上没有能答得让我比较满意。

分享下题目,如果有什么不合适的, 请指出来谢谢

你觉得下面的3个var_dump会输出什么,如果你是作者,在代码上,你会怎么修改到你觉得满意的程度?

Screenshot from 2014-02-19 22:10:37

 

Screenshot from 2014-02-19 22:11:30

 

 

 

我分享下我想要的答案:

1 在 protected $_a 这行,  把$_a变量修改成至少是拼音。。。中式英语也行。。。 best: $_interviewCount,相应的下面用到$_a的代码也一并改掉

2 构造函数public function Interview , 这样的同名构造函数, 虽然现在PHP5向下兼容, 但是会给程序带来维护的复杂度, 因为修改类名的时候, 还得再修改构造函数的名字。  改成 __constructor 不仅在语义上更好,而且降低了维护成本

3 getInterviewCount的静态方法里,

 

if的花括号至少应该和整个文件的风格统一, 应该要换行。

而且代码我觉得最好的方式应该改成

return $this->_a  ? $this->_a : $this->_a * 5;

另外, 如果PHP版本在5.4+的话,最好改成

return $this->_a  ? : $this->_a * 5;

只需要一行即可,既修掉了花括号的问题, 也考察了对PHP版本带来的更好性能的新变化的认识。

 

4 文件应该把最后的?>取消掉, 在?>后的换行和空格会给程序带来隐患, 具体隐患相信每个PHPer都知道

5 第一个var_dump输出并不是1或者5, 而是报错 Fatal error: Using $this when not in object context in xxx

因为getInterviewCount方法是静态方法, 静态方法可以直接调用, 不需要实例化, 因此没有实例化也就不存在$this了,也无法访问。 因此代码改成

return self::$_a ? : self::$_a * 5;此时,并没有完, 想要访问到$_a, 还必须把$_a改成静态变量

这时候输出0, 因为$_a并没有被构造函数初始化, 在执行乘法的时候PHP有一次强制转换, 变成 0 * 5

6 第二个var_dump输出2, 方法里注明$arg参数是传引用。当$arg给$return赋值的时候,这个赋值操作只是简单的赋值操作, 这里会有一次写时分离的操作在PHP内部, 把$arg指向的zval结构体分离出一份单独给$return, $return 的引用计数是 refcount=1, is_ref=0 , 而不是 refcount = 3, is_ref = 1, 即$return不会也是外部$test的引用. $arg还会保持原来的refcount = 2, is_ref = 1 , 当$arg + 1的时候, 外部的$test也+1,但是$return的值是2

7 第三个var_dump输出的是1,6

当走到global $var 和global $var2 的时候, 函数内部的$var, $var2虽然和外部的$var, $var2变量名相同, 但是其实它们是存在于不同的符号表里的, 理应是不同的作用域, 但是因为有了global, 这个声明会将函数内部的$var作为外部$var的引用, $var2同理。 当 $var2 = &$var发生的时候, $var2原来引用了外部的$var2内存地址, 现在变成引用$var的内存地址, 此时函数内部的$var,$var2和外部的$var内存地址相同, 当$var2 = 1;的时候,  函数内部的 $var, $var2和外部的$var 都变成1 ,外部的$var2仍然是6 。 各个变量的计数器变化如下

刚开始, 外部的$var, $var2 计数器都是 refcount=1, is_ref=0, 走到两个global完后, 外部和函数内部的$var, $var2计数器都变成 refcount=2, is_ref=1, $var2 = &$var的时候以及走到$var2 = 1,内部 $var2 和 $var和外部的$var 都是 refcount=3, is_ref=1, 外部的$var2 变回 refcount = 1, is_ref = 0 。

 

####

最近开了个技术群, 有兴趣的朋友进来吹牛逼吧, QQ群号221073018

tcp 内核参数修改减少TIME-WAIT后对NAT 用户的影响

2,668 views

减少TIME_WAIT连接状态。网络上已经有不少相关的介绍,大多是建议:

shell> sysctl net.ipv4.tcp_tw_reuse=1
shell> sysctl net.ipv4.tcp_tw_recycle=1

好了,这次悲剧了,参数设置后。 NAT用户访问,有的用户会无法访问服务器, 抓包是完全木有反映的。 为毛呢, 因为TCP的这2个内核参数设置后, 会直接影响NAT用户的访问, 参考引用:

为了提高TCP的性能,“RFC1323 – TCP Extensions for High Performance”提出了 一个机制(http://tools.ietf.org/html/rfc1323#page-29)来替代TIME- WAIT状 态的功能。linux 实现了它。这个机制通过记录来自每台主机的每个连接的分组时间戳来实现,要求 来自同一主机的同一连接的分组所携带的时间戳要比之前记录 的时间戳新,以便 “防止回绕的序号PAWS机制“ (http://tools.ietf.org/html/rfc1323#page-17) 丢弃接收属于旧连接的延时分组。这依赖于来自每个主机的每个 TCP连接分组所携 带的时间戳要单调递增才能实现。然而经过NAT的连接,其分组携带时间戳每个用户都不同的(甚至有人写了个论文,利用这个分组的时间戳来计算NAT 后端有多少台主机 http://phrack.org/issues.html?issue=63&id=3#article),也就是说同一个ip ,携带的时间戳不会单调递增。服务器端对同一个ip 过来的包的timestamp 做一个验证,导致这些连接分组被认为是属于旧 连接的延时分组而被丢弃。

所以呢, 把原来设置的2个参数设置回0就行了。

LINUX的DNS修改

1,884 views

以前修改LINUX的DNS很简单, 直接在/etc/resolv.conf里面添加修改就行了。 现在的LINUX的DNS管理软件不再这么做了, 大多数情况下,大家会看到resolv.conf有如下注释

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND — YOUR CHANGES WILL BE OVERWRITTEN

然后不管怎么修改, 最后都会悲剧, 因为不会生效。

这时候要看当前LINUX的DNS管理软件是哪个了。 ubuntu13.10的是resolvconf, 有些可能是dnsmasq之类的。
resoveconf的话,解决办法如下:
修改/etc/resolvconf/resolv.conf.d/head, 在head里面添加
nameserver 8.8.8.8#你喜欢哪个用哪个
然后sudo resolvconf -u使之生效

其实我们可以通过man resolvconf看到如下3个文件的英文说明:
/etc/resolvconf/resolv.conf.d/base
/etc/resolvconf/resolv.conf.d/head
/etc/resolvconf/resolv.conf.d/tail

具体英文说明就不贴了。 3个文件分别用途是
base : 如果当前LINUX没有DNS,那么至少会使用这个base里面指定的配置
head : 会给默认/etc/resolv.conf的内容之前添加本文件的配置
tail : 会给默认/etc/resolv.conf的内容之后添加本文件的配置(没有自己创建去吧,记得设置对权限)

最后sudo resolvconf -u 生效基本上没啥问题了。

从2013到2014

3,640 views

大学舍友A讨论大学舍友B迅速升迁的职业发展时候,我对此保持了质疑。 A直言不讳说我嫉妒。 我呵呵大笑,选择相信一万小时,那么对很多速成的成长保持质疑是一种客观质疑还是一种嫉妒心理。 也许只有等时间把赤裸裸的现实打磨出来的时候, 才能说明一切。很多事情在也许似乎大概是,然而未必不见得里游走,人们在熟悉的领域里选择相信自己,在不熟悉的领域里选择相信精英,普通人的话语淹没在浩瀚的信息流里给世界添堵,这是大多数人选择沉默的原因吧, 所以沉默让人恐惧,但是不能没有,不是吗。

相互不了解而被人想得狭隘,也算是种教训。 这个世界坑很多, 总是不可避免地掉进去, 一万次悲伤。

###

有一天听说大学的朋友去了凤凰。想起做凤凰那场高考毕业后的水仗,年少的狂留在那里,可惜你们都不知道我的模样。

###

没想到这篇草稿从2013呆到了2014。
2013我过得不好,让你们开心了。
2014的第一天,去了GALA的演唱会,是真的叫演唱会啊,上一次看到他们还只是在一个商场的露天广场做周年祝唱呢。
幸福又羞愧啊, 幸福的是你喜欢的乐队终于还有一只没有解散了, 幸福的是在北展剧场能坐着高兴地和与你一样喜欢他们的人在一起,感受在这个世界上你不是一个人的感觉,还真有点让人小激动嗯哼。
羞愧的是,你曾经欣赏的那群人,他们仍然有力量地前行着,光芒四射, 低调傲娇不妥协。 而你呢,被情绪烦恼得满地打滚,被工作压得喝醉都在叨逼代码, 被变成傻逼的路上无法回头。 你还在坚持么?你还打算坚持么?就算现在满身泥泞举步维艰?

###

2014的第一天, 所有人都许下愿望。 猜猜是什么呢, 家人健康, 工作顺利, 升职加薪, 天天开心, 找到另一半, 朋友幸福。是吧,每一款都很普通,但是肯定有一款属于你的, 你看, 我们每天那么辛苦, 还不是为了成为一个普通人。 做一个普通人有多么不容易, 那些高大上的媒体输出的神仙故事, 是给我们看的吗? 那些都不是我们想要的模样!

我买正版了。

2,465 views

我买正版了。

这句话,似乎在国情上可以成为一个人里程碑性的标志吧。 因为是山里面的孩子,在家庭条件不允许以及个人吸金能力低下(那会儿有钱就见鬼了)的环境下,很顺利,我成为了盗版的一员,并且毫无廉耻感地在网上大肆下载,现在唯一聊以慰藉的是, 我并没有大肆传播。

国庆的时候因为突然听到仙剑1电视剧的原声碟,对于这张碟,在爱古风填词的人眼里,谁还要挑剔? 对于回忆,在心智尚未逆生长的人里,谁又能无动于衷?付款不超过10秒的速度买了仙剑5的激活码,终于,在购买游戏上,我算是堂堂正正地支持了一次正版。多年前从大众软件上知道上软解散,那时候似乎是高中,最近又在网上看了不少对于上软解散的说法, 心有戚戚,想想上软为仙剑的付出,在看看玩家对仙剑的付出,我只能说呵呵。 每个人在毁灭自己所爱的人和物上, 我想大多数情况下都是在自己意识之外的。于是终于到了那一天,骂无可骂的时候,也是无语凝噎。

没有仔细看仙剑5的评价,觉得应该直接开始玩仙剑5了,我知道肯定不是当年的感觉了。 因为要把自己变成豆蔻的年华再把自己带入游戏里, 毕竟时间是把杀猪刀。在有条件的时候,请毫无理由地坚持一份青梅竹马的爱,将来会少一丝让自己掀桌子的后悔。