每个优秀的PHP开发人员应该能够回答的问题

时间:2010-01-22 16:34:56

标签: php

我正在经历Questions every good .Net developer should be able to answer并且对这个问题的内容和方法印象深刻,所以本着同样的精神,我正在为PHP Developer提出这个问题。

您认为优秀的 PHP程序员能够回答的问题

编辑:我将此问题标记为社区维基,因为它不是特定于用户的,它旨在为整个编程社区提供服务。

期待一些惊人的回应。

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

17 个答案:

答案 0 :(得分:50)

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

问:什么是T_PAAMAYIM_NEKUDOTAYIM
A:其范围解析运算符(双冒号)

经验丰富的PHP'er立即知道它意味着什么。 经验不足(而非希伯来语)的开发人员可能希望阅读this

但现在更严重的问题是:


问:此警告的原因是:'警告:无法修改标题信息 - 已发送的标题',以及防止它出现的良好做法是什么?
A: 原因:正在发送正文数据,导致标题也被发送。
预防:在输出任何正文数据之前,请务必先执行标题特定代码。请确保您没有意外发送空格或任何其他字符。


问:此查询有什么问题:"SELECT * FROM table WHERE id = $_POST[ 'id' ]"
A: 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,并且会导致错误,后者则不会。< / p>


问:鉴于此代码:

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

$a = 3;
$b = doSomething( $a );

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


特定于OOP

问:类定义中publicprotectedprivate之间的区别是什么?
A: 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
    }
}

A:静态方法无法访问$ this,因为可以在不实例化类的情况下执行静态方法。


问:接口和抽象类有什么区别?
A:接口定义了实现类is和调用接口的对象之间的契约。抽象类预定义将扩展它的类的某些行为。在某种程度上,这也可以被视为合同,因为它可以保证某些方法的存在。


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


问:为什么PHP的接口使用实现次优? A: PHP不允许您定义方法的预期返回类型,这实际上使接口变得无用。 :-P

答案 1 :(得分:24)

明确的安全问题!

(这篇文章中的简单答案,当然保护php web应用程序要复杂得多)

  • 如何处理SQL注入?
用MySQL开始的mysql_real_escape_string()。然后尝试学习PDO以利用跨数据库供应商的预准备语句和可移植性。

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

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

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

htmlentities()有利于开始。

  • XXX注射的变体:LDAP注入,XPath注入等......?

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

  • 什么是明智的功能列表?

解释PHP代码(可能包含在远程文件中)或在系统上执行命令的函数。一个简短且不完整的列表可以是:exec(),passthru(),system(),popen(),eval(),preg_replace()......

  • 如何处理文件包含危险?
  • 什么是横向路径?
  • 文件上传有哪些风险?

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

  • 如何强制配置PHP配置(即你知道php.ini有什么用途)?

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

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

第一个转换条目的东西不那么恶劣。第二个检查条目是否正确,如果不是,则拒绝它。

答案 2 :(得分:14)

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

抱歉,有人不得不说:)

答案 3 :(得分:12)

php跨浏览器吗?

(我知道,这会让很多人大笑,但是在php论坛上问题更多!)

答案 4 :(得分:11)

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

答案 5 :(得分:9)

解释为什么以下代码显示2.5而不是3

$a = 012;
echo $a / 4;

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

答案 6 :(得分:9)

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

答案 7 :(得分:8)

没有人接触过它,但每个PHP开发人员应该能够详细讲述:为什么register_globals不好?

答案 8 :(得分:7)

当使用php开发网站时,它是完全废话,是吗:

a)PHPs错误

b)程序员错误

答案 9 :(得分:6)

转发用户输入的最佳做法是什么? (这个问题似乎经常出现)

答案 10 :(得分:6)

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

    • $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()”,只是伤口中的盐。

答案 11 :(得分:5)

“你最喜欢的调试器是什么?” “你最喜欢的探究者是什么?”

实际的application / ide / frontend只要超出“notepad,echo和microtime()”就没那么重要了。您不太可能雇用十亿开发人员中的那个,一直编写完美的代码,并且他/她的单元测试发现所有错误和瓶颈,甚至在他们想要有人可以分析和/或单步执行代码并查找有限时间内的错误。 (对于所有语言/平台来说都是如此,但对我来说,php开发人员似乎有点不发达的技能,纯粹是主观的说法)

答案 12 :(得分:5)

Terry Chay有一篇博文,基本上总结了每个PHP开发人员应该知道和/或期望在求职面试中得到某种程度回答的内容。

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

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

答案 13 :(得分:4)

我会问:

a)缓存怎么样?

b)如何组织缓存?

c)你确定,你不做额外的数据库查询吗? (在我的第一篇关于PHP的内容中,在foreach中有一个mysql_query来获取发表评论的用户的名字......可怕:))

d)为什么register_globals是邪恶的?

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

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

在我阅读了一些基本书籍之后,这些问题对我来说根本不明确。我已经通过网络上的数千个常见问题解答,在几天甚至几周内找到了所有关于注射和csx的信息。但在我找到这些问题的答案之前,我的代码非常糟糕:)

答案 14 :(得分:3)

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

直接从GET中打印数据等内容可能导致Cross-site scripting (XSS)个漏洞。 这就是为什么你应该总是首先通过htmlspecialchars()从客户端发送输入。

答案 15 :(得分:2)

解释

的区别
  

提取物()

     

爆炸()

     

破灭()

答案 16 :(得分:1)

以下代码有什么问题?

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