当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《每个优秀的PHP开发人员应该能够回答的问题》经验,为你挑选了13个好方法。

我所经历的问题,每一个良好的.NET开发人员应该能够回答,是这个问题的内容和方法非常深刻的印象,因此在同样的精神,我要求的PHP开发这个问题.

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

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

期待一些惊人的回应.

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



1> Decent Dabbl..:

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

问:什么是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功能调用之后,为什么?
答: $a4$b3.前者因为$ 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


尽管如此,"T_PAAMAYIM_NEKUDOTAYIM"对相关知识进行了毫无价值的考验.
`5 == $ someVar`一个是一个愚蠢的问题.不知道为什么这种编码风格在它本身存在缺陷的情况下会获得如此多的荣誉.
如果没有查找`php.net/strpos`,我将无法回答`strpos`问题.我觉得没有必要浪费大脑空间来记忆PHP的基本功能集,它们返回-1,哪些是假的,哪些是null,哪些是完全不同的.但我发现其他问题都没问题.
Pekka:但你*应该*知道字符串是零索引的,因此strpos*必须*能够为找到的前缀返回零.
抱歉,但是...... -1.这些问题仅检查基本知识,如访问修饰符或类'(静态)和对象(动态)方法/字段之间的差异.此外,这些问题不会检查任何*思考技巧*(对不起,我不知道用英语单词来解释它).我的意思是你不检查程序员是否能够创建*非标准*算法等.
@fireeyedboy:刚发现这个问题(一年后!),我想我会澄清一下我的评论.ryeguy已经提到了几个很好的理由.我的主要理由是,如果你能记得把整数放在第一位,你可以记得检查你把`==`.并且你仍然没有受到'$ someVar == $ otherVar`的"保护".
看看你的SQL select语句,我认为它首先出现的问题是它在语法上是错误的.的$ _POST ["ID"]需要被包裹在括号即{​​$ _POST ["ID"]},以便被在双引号评价.

2> Kartoch..:

明确的安全问题!

(这篇文章中的简单答案,当然保护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手册.

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

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


+1.虽然大多数答案是:使用适当的框架或库...

3> kprobst..:

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

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


实际上,我认为这是一个很好的问题.开发人员应该能够解释为什么他们选择一种语言/框架/技术而不是另一种语言/框架/技术,答案不应该是"因为我从未尝试过其他任何东西".与备选方案相比,PHP确实有优点和缺点,与流行(或可能是精英主义)信念相反,使用它有正当理由.
在PHP/LAMP工作的采访中我肯定被问过.我同意这是一个有效的问题.

4> Strae..:

是php跨浏览器吗?

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


+1.我不知道是笑还是哭...:D

5> bkildow..:

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



6> Michael Stum..:

==和===之间的区别是什么?为什么要使用==?



7> Nathan Osman..:

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

$a = 012;
echo $a / 4;

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



8> markb..:

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


`register_globals`和使用变量而没有先定义变量的开发人员一样糟糕.

9> AntonioCS..:

当一个网站使用PHP开发并且它是彻头彻尾的垃圾时,它是:

a)PHPs错误

b)程序员错误


但是php*是*魔法:magic_quotes_gpc
或者可能是你的!
@Felix:许多人将PHP归咎于网站X或Y,这很可怕,因为它显然是程序员的错.PHP做了你告诉它做的事情,它并不神奇,它没有自己的想法.

10> Matt..:

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


这当然是个棘手的问题.它的输出需要转义,而不是输入.任何建议"消毒"或逃避$ _GET数组中的所有内容的人都有Done It Wrong.
这不是输入/输出的问题.您必须了解数据移动*进入*的上下文.如果这是一个SQL查询,它必须以一种方式进行转义,如果它的HTML输出必须以另一种方式转义,如果它是一个URL,它必须以另一种方式转义,等等.我认为bobince强调的危险是如果你逃避了在一个上下文的入口点的数据,并在以后的另一个上下来使用它,你仍然是脆弱的.
使用框架为你做这个......数据库抽象层将保护你免受注入...正确的HTML渲染引入将逃避输出...
@bobince错了.需要在db交互之前转义输入.当然,如果你像一个好的小开发人员一样使用存储过程,这就变得没必要了(除非你在SQL服务器上使用参数来生成和执行动态SQL,在这种情况下你应该回去并在技术支持中工作)部门)

11> tadamson..:

调用$ 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()",只是伤口中的盐.


最后一点:这就是值数组的foreach.此外,你不应该直接使用mysql或mysqli.应该有一些抽象,所以你可以在某些时候切换到pgsql(例如).

12> VolkerK..:

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

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



13> Cody Caughla..:

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

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

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

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有