我正在研究每一个好的.Net开发人员都应该能够回答的问题,并且对该问题的内容和方法印象深刻,因此,本着同样的精神,我正在向PHP开发人员提出这个问题。
您认为一个好的PHP程序员应该回答什么问题?
编辑:我将此问题标记为社区Wiki,因为它不是特定于用户的,它旨在为整个编程社区提供服务。
期待一些惊人的回应。
注意:也请按照评论中的建议回答问题,以便人们也可以学习有关该语言的新知识。
我正在研究每一个好的.Net开发人员都应该能够回答的问题,并且对该问题的内容和方法印象深刻,因此,本着同样的精神,我正在向PHP开发人员提出这个问题。
您认为一个好的PHP程序员应该回答什么问题?
编辑:我将此问题标记为社区Wiki,因为它不是特定于用户的,它旨在为整个编程社区提供服务。
期待一些惊人的回应。
注意:也请按照评论中的建议回答问题,以便人们也可以学习有关该语言的新知识。
Answers:
诚然,我从其他地方偷了这个问题(不记得我在哪里读了),但认为这很有趣:
问:什么T_PAAMAYIM_NEKUDOTAYIM?
A:其范围解析运算符(双冒号)
经验丰富的PHP'er立刻知道它的含义。经验不足(而不是希伯来语)的开发人员可能想阅读此内容。
但是现在有更严重的问题:
问:产生此警告的原因是:“警告:无法修改标题信息-标题已发送”,有什么好的方法来防止出现这种情况?
答: 原因:正文数据已发送,导致标头也发送了。
预防措施:输出任何正文数据之前,请务必先执行标头特定的代码。确保您没有意外发送空格或任何其他字符。
问:此查询出了什么问题"SELECT * FROM table WHERE id = $_POST[ 'id' ]"?
答: 1 .易受SQL注入攻击。切勿在查询中直接使用用户输入。首先将其消毒。最好使用准备好的语句(PDO)。2.不要选择所有列(*),而是指定每一个列。这主要是为了防止例如在将来某个时候添加BLOB列时查询占用内存。
问: if语句有什么问题if( !strpos( $haystack, $needle ) ...?
A: strpos返回第一次找到$ needle的索引位置,可能是0。由于0也解决false了解决方案是使用严格的比较:if( false !== strpos( $haystack, $needle )...
问:编写此if语句的首选方式是什么,为什么?
if( 5 == $someVar )或if( $someVar == 5 )
A:前者是因为这样可以防止在您忘记使用2个等号($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是通过引用传递的,后者是因为函数的返回值是参数初始值的副本(而不是对参数的初始值的引用)。
面向对象
问:是什么区别public,protected并且private在类的定义?
答: public使类成员对“所有人”可用,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和setters,直接映射到其内部成员而实际上没有执行行为的方法的类有什么问题?
答:这可能是代码的味道,因为该对象充当了高尚的数组,没有太多其他用途。
问:为什么PHP的使用接口实现次优?
答: PHP不允许您定义方法的预期返回类型,这实际上使接口变得毫无用处。:-P
strpos不抬头我就无法回答这个问题php.net/strpos。我觉得没有必要浪费脑筋来记住PHP的基本功能,即那些乱码为-1,哪些为假,哪些为空以及哪些完全不同。我发现其他问题没问题。
T_PAAMAYIM_NEKUDOTAYIM是对相关知识的毫无价值的考验。
5 == $someVar一个是一个愚蠢的问题。不知道为什么这种编码风格固有地存在缺陷,为什么会得到如此多的赞誉。
绝对是安全性问题!
(这篇文章中的简单答案,当然,保护php Web应用程序的安全要复杂得多)
mysql_real_escape_string()从MySQL开始。然后尝试学习PDO,以利用准备好的语句和跨数据库供应商的可移植性。
在每个重要请求上添加一个令牌以保护重要操作(用户在发送关键请求之前必须已经查看了表单)。
htmlentities()适合作为一个开始。
您需要知道XXX使用的“词汇表”,然后扣除您需要进行清理和/或“检查并拒绝”的内容。
解释PHP代码(可能包含在远程文件中)或在系统上执行命令的函数。一个简短且不完整的列表可能是:exec(),passthru(),system(),popen(),eval(),preg_replace()...
打开文件或远程资源时,需要仔细检查使用的参数。
这将很长,因此我跳过了答案,请阅读PHP手册。
第一个将条目转换为较少敌意的内容。第二个检查输入是否正确,如果不正确则拒绝输入。
“你为什么不使用其他东西?”
抱歉,有人不得不说:)
是php跨浏览器吗?
(我知道,这会让很多人大笑,但这是php论坛上问得更多的问题!)
==和===有什么区别?为什么要完全使用==?
解释为什么显示以下代码2.5而不是3:
$a = 012;
echo $a / 4;
回答:当数字前面有一个0在PHP,号数被作为一个八进制数(基数-8)。因此,八进制数012等于十进制数10。
尚无人提及,但这是每个PHP开发人员都应该详细谈论的事情:为什么register_globals不好?
register_globals与使用变量而不先定义变量的开发人员一样糟糕。
当使用php开发网站并且完全废话时,它是:
a)PHP的错误
b)程序员故障
转义用户输入的最佳做法是什么?(这个问题似乎经常出现)
调用$ array的“名称”元素时,是否正确?:
$array[name]$array['name']两者通常都可以使用,但是只有引用形式正确。 define('name', 0);看着虫子飞。我看得太多了。
您如何强制将表单元素提交为数组?
将空括号添加到name属性:多个<input type="checkbox" name="checkboxes[]" />元素将被转换为服务器上的一个数组(例如$_POST['checkboxes'][0..n])。我认为这不是100%特定于PHP的,但是$_POST对于每个可能的'checkboxes'.$i元素,它肯定能胜过循环。
mysql_,mysqli_或PDO?
这里只有一个真正错误的答案:mysql_库不执行准备好的语句,不能再为它的邪恶能力辩解。命名一个函数,每个执行的查询“ mysql_real_escape_string()”将被多次调用,这只是一针见血。
“您最喜欢的调试器是什么?”
“您最喜欢的探查器是什么?”
实际的应用程序/ ide /前端并不重要,只要它超出“记事本,echo和microtime()”范围即可。您不可能雇用十亿分之一的开发人员一直在编写完美的代码,并且他/她的单元测试发现了所有错误和瓶颈,甚至在错误发生之前,您都希望有人可以剖析和/或逐步执行代码并查找有限时间内的错误。(对于所有语言/平台来说都是正确的,但对我来说,似乎在php开发人员中技能水平还有些欠发达)
Terry Chay的博客文章基本上总结了每个PHP开发人员在面试中应该知道和/或期望在某种程度上回答的内容。
http://terrychay.com/article/php-coders.shtml
我认为这是一个很好的总结。
我会问类似的东西:
a)缓存如何?
b)如何组织缓存?
c)您确定不执行额外的数据库查询吗?(在我用PHP制作的第一篇文章中,它是在foreach中的一个mysql_query,用于获取发表评论的用户的姓名……太糟糕了:))
d)为什么register_globals是邪恶的?
e)为什么以及如何将视图与代码分开?
f)“实施”的主要目的是什么?
在阅读了一些基础书籍之后,这些问题对我来说根本不清楚。我已经在几天\几周内通过网络上成千上万的常见问题解答找到了有关注入和csx,strpos的所有信息。但是直到我找到这些问题的答案,我的代码才真的很糟糕:)
为什么永远不应该直接输出用户输入!
直接从GET打印数据之类的内容可能会导致跨站点脚本(XSS)漏洞。这就是为什么您应该始终始终首先通过htmlspecialchars()从客户端发送输入的原因。
以下代码有什么问题?
$a = 2;
function foo()
{
$a = 3;
}
foo();
echo $a;
$a = 2; function foo() { $a += 3; return $a; } $a = foo(); echo $a;