每个优秀的PHP开发者都应该能够回答

我正在经历的问题每一个好的.net开发者应该能够回答 ,并且对这个问题的内容和方法印象深刻,所以本着同样的精神,我向PHP Developer提出这个问题。

你认为一个好的PHP程序员能够回应 什么问题

编辑 :我将这个问题标记为社区wiki,因为它不是用户特定的,它旨在为广大的编程社区提供服务。

期待一些惊人的回应。

注意 :请按照评论中的build议回答问题,以便人们可以学习有关语言的新内容。

无可否认,我从其他地方偷了这个问题(不记得我在哪里读了),但认为这很有趣:

问:什么是T_PAAMAYIM_NEKUDOTAYIM
答:它的范围parsing运算符(双冒号)

有经验的PHP'er马上知道这意味着什么。 没有经验的(而不是希伯来语的)开发者可能想要读这个 。

但现在更严重的问题是:


问:这个警告的原因是什么:'警告:不能修改标题信息 – 已经发送的标题',有什么好的做法来防止它?
答: 原因:正文数据被发送,导致头也被发送。
预防:在输出任何正文数据之前,请务必首先执行标题特定的代码。 确保你没有意外地发送空白或任何其他字符。


问:这个查询有什么问题: "SELECT * FROM table WHERE id = $_POST[ 'id' ]"
答: 1 . SQL注入容易受到攻击。 切勿在查询中直接使用用户input。 先把它消毒。 准备好使用准备好的语句( PDO ) 2.不要select所有列(*),而是指定每一列。 这主要是为了防止在将来某个时候添加BLOB列时查询占用内存。


问:这个if语句有什么问题: if( !strpos( $haystack, $needle ) ...
A: strpos返回第一次find$ needle的索引位置,可能是0 。 因为0也解决了false的解决scheme是使用严格的比较: if( false !== strpos( $haystack, $needle )...


问:写这个if语句的首选方法是什么?为什么?
if( 5 == $someVar )或者if( $someVar == 5 )
– 答:前者,因为它可以防止当你忘记使用2等于( $someVar = 5 )5意外分配$someVar = 5 ,并会导致错误,后者不会。


问:给出这个代码:

 function doSomething( &$arg ) { $return = $arg; $arg += 1; return $return; } $a = 3; $b = doSomething( $a ); 

…函数调用后$a$b的值是多less?为什么?
答: $a4$b3 。 前者是因为$ arg是通过引用传递的,后者是因为函数的返回值是参数初始值的副本(不是引用)。


OOP特定

问:在一个class级定义中publicprotectedprivate之间有什么区别?
答: 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,因为可以在不实例化类的情况下执行静态方法。


问:界面和抽象类有什么区别?
答:一个接口定义了一个实现类和一个调用该接口的对象之间的契约。 抽象类为扩展它的类预先定义了某些行为。 在一定程度上这也可以被认为是合同,因为它允许某些方法存在。


问:主要定义getter和setter的类有什么问题,直接映射到内部成员,而实际上没有执行行为的方法?
答:这可能是一种代码气味,因为对象充当高贵的数组,没有太多的其他用途。


问:为什么PHP的实现使用接口次优?
答: PHP不允许你定义方法的预期返回types,这基本上使得接口非常无用。 😛

明确的安全问题!

(在这篇文章中的简单答案,当然要确保PHP Web应用程序要复杂得多)

  • 如何处理SQL注入?

mysql_real_escape_string()用于MySQL的开始。 然后尝试学习PDO,以利用数据库供应商的准备好的语句和可移植性。

  • 如何处理CSRF(跨站请求伪造)?

在每个重要的请求上添加一个令牌以确保重要的操作(用户在发送关键的请求之前必须看到该表单)。

  • 如何处理XSS(跨站点脚本)反映和存储?

htmlentities()是一个好的开始。

  • XXX注入的变种:LDAP注入,XPath注入等…?

您需要知道XXX使用的“词汇”是什么,然后扣除您需要清理和/或“检查和拒绝”的内容。

  • 什么是明智的function列表?

解释PHP代码(可能包含在远程文件中)或执行系统命令的函数。 (),passthru(),system(),popen(),eval(),preg_replace()…

  • 如何处理文件包含的危险?
  • 什么是path横向?
  • file upload有哪些风险?

需要仔细检查打开文件或远程资源时使用的参数。

  • 如何强制configuration你的PHPconfiguration(即你知道php.ini有什么用处)?

这将是漫长的,所以我跳过答案,请阅读PHP手册。

  • 关于过滤用户数据: 清理检查与拒绝有什么区别?

第一个把这个入口变成了一个不那么敌对的东西。 第二个检查input是否正确,如果不拒绝的话。

“你为什么不用别的东西?

对不起,有人不得不说:)

是PHP跨浏览器?

(我知道,这将使许多人笑,但是在PHP论坛上的问题更多!)

我认为一个好问题是: HTTP如何工作? 在其他HTTP通信中使用GETPOST数据是PHP开发中固有的。 了解HTTP如何在更广泛的环境下工作,以及PHP如何实现这一点,还有很长的路要走。

==和===有什么区别,你为什么要使用==?

请解释为什么下面的代码显示2.5而不是3

 $a = 012; echo $a / 4; 

答案:当PHP中的数字前面有一个0时,该数字将被视为八进制数(base-8)。 因此八进制数012等于十进制数10

现在还没有人涉及它,但每个PHP开发人员都应该能够详细地谈论这个问题:为什么register_globals不好?

当一个网站使用PHP开发,它是完全废话,是这样的:

a)PHP错误

b)程序员故障

逃避用户input的最佳做法是什么? (这个问题似乎经常出现)

  • 当调用$ array的“name”元素时,这是正确的吗?

    • $array[name]
    • $array['name']

    两者都会经常工作,但只有引用的forms是正确的。 define('name', 0); 并观看错误飞行。 我已经看过这么多了

  • 你怎么能强制表单元素作为一个数组提交?

    在name属性后加空括号:multiple <input type="checkbox" name="checkboxes[]" />元素将被转换为服务器上的数组(例如$_POST['checkboxes'][0..n] )。 我不认为这是100%的PHP特定的,但它肯定会跳动循环$_POST为每个可能的'checkboxes'.$i元素。

  • mysql_,mysqli_或PDO?

    在这里只有一个真正错误的答案:mysql_库不会做准备好的语句,不能再原谅它的邪恶能力。 命名一个函数,一个预期被称为多次执行的查询,“ mysql_real_escape_string() ”,只是伤口的盐。

“你最喜欢的debugging器是什么?”
“你最喜欢的分析器是什么?”

只要超出了“记事本,回显和microtime()”的范围,实际的应用程序/ ide /前端并不重要。 这是不太可能的,你聘请一个十亿开发人员不可能一直写完美的代码,他/她的unit testing发现所有的错误和瓶颈之前,他们甚至发生,你想要的人可以剖析和/或通过代码,并find有限时间的错误。 (对于所有的语言/平台来说都是如此,但是在PHP开发人员中我似乎是一个不完善的技能集合,纯属主观的说法)

Terry Chay有一篇博客文章,基本总结了每个PHP开发人员在面试时应该知道什么和/或将要在某种程度上回答什么。

http://terrychay.com/article/php-coders.shtml

我认为它是一个很好的总结。

我会问:

a)caching怎么样?

b)如何组织caching?

c)你确定,你不做额外的数据库查询? (在我用PHP做的第一件事情里面是一个mysql_query,在foreach里面用来获取评论的用户名字……糟糕的:))

d)为什么register_globals是邪恶的?

e)为什么以及如何从代码拆分视图?

f)“实施”的主要目标是什么?

在阅读了一些基础书籍之后,这些问题对我来说根本不明确。 我已经发现了所有关于注射和csx,在几天\星期通过数以千计的常见问题在networkingstrpos。 但直到我find这些问题的答案我的代码是非常可怕的:)

为什么你不应该直接输出用户input!

从GET直接打印数据可能会导致跨站点脚本(XSS)漏洞。 这就是为什么你应该总是通过htmlspecialchars()首先从客户端发送input。

解释的区别

提取()

爆炸()

爆()

下面的代码有什么问题?

 $a = 2; function foo() { $a = 3; } foo(); echo $a;