我所经历的问题,每一个良好的.NET开发人员应该能够回答,是这个问题的内容和方法非常深刻的印象,因此在同样的精神,我要求的PHP开发这个问题.
您认为优秀的PHP程序员能够回答哪些问题?
编辑:我将此问题标记为社区维基,因为它不是用户特定的,它旨在为整个编程社区服务.
期待一些惊人的回应.
注意:请按照评论中的建议回答问题,以便人们可以学习有关该语言的新内容.
不可否认,我从其他地方偷走了这个问题(不记得我在哪里读了它),但认为这很有趣:
问:什么是T_PAAMAYIM_NEKUDOTAYIM
?
答:它的范围分辨率运算符(双冒号)
经验丰富的PHP'er立即知道它意味着什么.经验不足(而非希伯来语)的开发人员可能希望阅读此内容.
但现在更严重的问题:
问:这个警告的原因是什么:'警告:无法修改标题信息 - 标题已经发送',以及防止它的好方法是什么?
答: 原因:发送了正文数据,导致标题也被发送.
预防:在输出任何正文数据之前,请务必先执行标题特定代码.请确保您没有意外发送空格或任何其他字符.
问:有什么不对这个查询:"SELECT * FROM table WHERE id = $_POST[ 'id' ]"
?
答: 1.这是vulnarable SQL注入.切勿在查询中直接使用用户输入.首先消毒它.优先使用预准备语句(PDO)2.不要选择所有列(*),而是指定每一列.这主要是为了防止查询占用内存,例如在将来的某个时刻添加BLOB列.
问:这句话有什么问题:if( !strpos( $haystack, $needle ) ...
?
答: strpos
返回它首次找到$ needle的索引位置,可能是0
.既然0
解决false
了解决方案就是使用严格的比较:if( false !== strpos( $haystack, $needle )...
问:写这个if语句的首选方法是什么?为什么?
if( 5 == $someVar )
或者if( $someVar == 5 )
A:前者,因为当你忘记使用2 equalsigns($someVar = 5
)时它会阻止意外分配5到$ someVar ,并且会导致错误,后者则不会.
问:鉴于此代码:
function doSomething( &$arg ) { $return = $arg; $arg += 1; return $return; } $a = 3; $b = doSomething( $a );
...什么是价值$a
和$b
功能调用之后,为什么?
答: $a
是4
和$b
是3
.前者因为$ arg是通过引用传递的,后者因为函数的返回值是参数初始值的(不是引用)的副本.
特定于OOP
问:是什么区别public
,protected
并且private
在类的定义?
A: public
使一个类成员可用于"everyone",protected
使类成员仅可用于自身和派生类,private
使类成员仅对类本身可用.
问:这段代码有什么问题:
class SomeClass { protected $_someMember; public function __construct() { $this->_someMember = 1; } public static function getSomethingStatic() { return $this->_someMember * 5; // here's the catch } }
答:静态方法无法访问$ this,因为静态方法可以在不实例化类的情况下执行.
问:接口和抽象类之间有什么区别?
答:接口定义了实现类is和调用接口的对象之间的契约.抽象类预定义将扩展它的类的某些行为.在某种程度上,这也可以被视为合同,因为它可以保证存在某些方法.
问:主要定义getter和setter的类有什么问题,它直接映射到它的内部成员,而实际上没有实现行为的方法?
答:这可能是代码气味,因为该对象充当了一个高贵的数组,没有太多其他用途.
问:为什么PHP的实现使用接口次优?
答: PHP不允许您定义方法的预期返回类型,这实际上使接口非常无用.:-P
明确的安全问题!
(这篇文章中的简单答案,当然保护php web应用程序要复杂得多)
如何处理SQL注入?
mysql_real_escape_string()用于启动MySQL.然后尝试学习PDO以利用跨数据库供应商的预准备语句和可移植性.
如何处理CSRF(跨站点请求伪造)?
在每个重要请求上添加一个令牌以保护重要操作(用户必须在发送关键请求之前看过该表单).
如何处理反映和存储的XSS(跨站点脚本)?
htmlentities()一开始就好.
XXX注射的变种:LDAP注入,XPath注入等......?
您需要知道XXX使用的"词汇"是什么,然后扣除您需要消毒和/或"检查和拒绝"的内容.
什么是明智的功能列表?
解释PHP代码(可能包含在远程文件中)或在系统上执行命令的函数.一个简短且不完整的列表可以是:exec(),passthru(),system(),popen(),eval(),preg_replace()......
如何处理文件包含危险?
什么是横向路径?
与文件上传相关的风险是什么?
打开文件或远程资源时,需要仔细检查所使用的参数.
如何强制配置PHP配置(即你知道php.ini有什么用途)?
它会很长,所以我跳过答案,请阅读PHP手册.
关于过滤用户数据:清理和检查和拒绝有什么区别?
第一个转换条目的东西不那么恶劣.第二个检查条目是否正确,如果没有拒绝.
"你为什么不用别的东西?"
对不起,有人不得不说:)
是php跨浏览器吗?
(我知道,这会让许多人大笑,但是在php论坛上问题更多!)
我认为一个好问题是:HTTP如何工作?与工作GET
以及POST
其他HTTP通信中的数据是在PHP开发所固有的.了解HTTP如何在更广泛的上下文中工作以及PHP如何实现这一目标还有很长的路要走.
==和===之间的区别是什么?为什么要使用==?
解释为什么显示以下代码2.5
而不是3
:
$a = 012; echo $a / 4;
答案:当一个数字前面有一个0
PHP中的数字时,该数字被视为八进制数字(base-8).因此,八进制数012
等于十进制数10
.
还没有人触及它,但每个PHP开发人员应该能够详细讲述:为什么register_globals
不好?
当一个网站使用PHP开发并且它是彻头彻尾的垃圾时,它是:
a)PHPs错误
b)程序员错误
逃避用户输入的最佳做法是什么?(这个问题似乎经常出现)
调用$ array的"name"元素时,这是正确的吗?:
$array[name]
$array['name']
两者都经常有效,但只有引用的形式是正确的. define('name', 0);
并看着虫子飞.我太过分了.
你怎么能强制表单元素作为数组提交?
将空括号添加到name属性:多个元素将转换为服务器上的数组(例如
$_POST['checkboxes'][0..n]
).我不认为它是100%特定于PHP的,但它肯定会$_POST
为每个可能的'checkboxes'.$i
元素循环播放.
mysql_,mysqli_或PDO?
这里只有一个真正错误的答案:mysql_库不会做预备语句,也不能再为它的邪恶能力辩解了.命名一个函数,一个预期被执行的查询多次调用," mysql_real_escape_string()
",只是伤口中的盐.
"你最喜欢的调试器是什么?"
"你最喜欢的探究者是什么?"
实际的应用程序/ ide /前端并不重要,只要它超出"记事本,回声和microtime()".您不太可能雇用十亿开发人员中的那个,一直编写完美的代码,并且他/她的单元测试发现所有错误和瓶颈,甚至在他们想要有人可以分析和/或单步执行代码并查找有限时间内的错误.(对于所有语言/平台来说都是如此,但对我来说,php开发人员似乎有点不发达的技能,纯粹是主观的说法)
Terry Chay有一篇博文,基本上总结了每个PHP开发人员应该知道和/或期望在求职面试中得到某种程度回答的内容.
http://terrychay.com/article/php-coders.shtml
我认为这是一个很好的总结.