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

我正在浏览 每个问题。网络开发人员应该能够回答,对这个问题的内容和方法印象深刻,因此本着同样的精神,我为 PHP 开发人员提出这个问题。

你认为一个优秀的 PHP 程序员应该能够回答哪些问题?

EDIT : 我将这个问题标记为社区 wiki,因为它不是特定于用户的,而是为整个编程社区服务的。

期待一些惊人的回应。

注意 : 请按照评论中的建议回答问题,这样人们也可以学到一些关于语言的新东西。

251811 次浏览

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

为什么不能直接输出用户输入!

直接从 GET 打印数据可能导致 跨网站脚本(XSS)漏洞。 这就是为什么您总是应该首先通过 htmlspecalchars ()发送来自客户端的输入。

我认为一个很好的问题是: 在其他 HTTP 通信中使用 GETPOST数据是 PHP 开发的固有特性。了解 HTTP 如何在更广泛的上下文中工作,以及 PHP 如何实现这一点将大有帮助。

PHP 是跨浏览器的吗?

(我知道,这会让很多人发笑,但这是 PHP 论坛上问得最多的问题!)

绝对是安全问题!

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

  • 如何处理 SQL 注入?

MySQL _ real _ escape _ string ()作为 MySQL 的开始。然后尝试学习 PDO,以利用准备好的语句和跨数据库供应商的可移植性。

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

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

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

Htmltity ()是一个很好的开始。

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

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

  • 合理的函数列表是什么?

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

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

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

  • 如何加强 PHP 配置的配置(即,您知道 PHP.ini 的用途吗) ?

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

  • 关于过滤用户数据: 消毒检查并拒绝的区别是什么?

第一个把入口改造成不那么危险的地方。第二个检查条目是否正确,如果不拒绝。

当一个网站是用 php 开发的,而且完全是垃圾,是这样吗:

A) PHPs 故障

B)程序员的错误

诚然,这个问题是我从别的地方偷来的(我已经不记得在哪里读到过这个问题了) ,但是我觉得这个问题很有趣:

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

一个有经验的 PHP 工程师立即知道它的意思。 缺乏经验(而不是希伯来语)的开发人员可能希望阅读 这个

但现在更严肃的问题是:


问: 这个警告的原因是什么: “警告: 不能修改已发送的头信息-头信息”,有什么好的做法可以防止这种情况发生?
A: 原因:身体数据被发送,导致头也被发送。
预防: 确保在输出任何正文数据之前首先执行头特定的代码。确保您没有意外地发出空格或任何其他字符。


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


问: 这个 if 语句有什么问题: if( !strpos( $haystack, $needle ) ...
A: strpos返回它第一次找到 $绣针的索引位置,可能是 0。因为 0也解析为 false,所以解决方案是使用严格的比较: if( false !== strpos( $haystack, $needle )...


问: 写这个 if 语句的首选方法是什么? 为什么?
if( 5 == $someVar )if( $someVar == 5 )
A: 前者,因为当你忘记使用2个等号($someVar = 5)时,它可以防止意外地将5赋值给 $somVar,并且会导致错误,而后者不会。


问: 鉴于以下代码:

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


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

... 函数调用后 $a$b的值是多少? 为什么?
A: $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,因为静态方法可以在不实例化类的情况下执行。


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


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


问: 为什么 PHP 的接口实现不是最佳的?
PHP 不允许您定义方法的预期返回类型,这实际上使接口变得非常无用。翻译: 小宝宝 P- 小宝宝 P- 小宝宝 P- 小宝宝 P- 小宝宝 P- 小宝宝 P- 小宝宝 P- 小宝宝 P- 小宝宝 P- 小宝宝 P- 小宝宝 P- 小宝宝

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

对不起,总得有人说出来:)

“你最喜欢的调试器是什么?”
“你最喜欢的侧写师是什么?”

只要超越“记事本、 echo 和 microtime ()”,实际的应用程序/ide/前端就没有多大关系。你不太可能雇佣一个十亿分之一的开发人员,他/她总是编写完美的代码,他/她的单元测试甚至在错误和瓶颈出现之前就发现了所有的错误和瓶颈,因此你需要一个能够分析和/或遍历代码并在有限的时间内发现错误的人。(对于所有的语言/平台来说都是这样,但是在我看来,纯粹从主观的角度来说,这似乎是 PHP 开发人员的一项不完善的技能)

目前还没有人涉及到它,但是每个 PHP 开发人员都应该详细讨论一下: 为什么 register_globals不好?

Terry Chay 有一篇博客文章,基本上总结了每个 PHP 开发人员应该知道和/或者在工作面试中应该在一定程度上回答的问题。

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

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

  • 当调用 $array 的“ name”元素时,哪个是正确的? :

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

    这两种方法通常都有效,但只有引用的形式才是正确的。看着虫子飞。这种事我见得太多了。

  • 如何强制表单元素作为数组提交?

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

  • Mysql _,mysqli _,还是 PDO?

    这里只有一个真正错误的答案: mysql _ library 不执行事先准备好的语句,并且不能再为其邪恶的能力找借口。命名一个函数(每次执行查询都要多次调用该函数)“ mysql_real_escape_string()”只是雪上加霜。

我会问这样的问题:

A)缓存怎么样?

B)如何组织缓存?

C)你确定你没有做额外的数据库查询吗?(在我的第一篇关于 PHP 的文章中,foreach 中有一个 mysql _ query,用来获取发表评论的用户的名字... ... 糟糕:))

为什么 register _ globals 是邪恶的?

E)为什么以及如何将视图与代码分离?

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

在我读了一些基本的书之后,这里有一些问题对我来说一点也不清楚。通过网上成千上万的常见问题,我在几天内就发现了所有关于注射和 csx,strpos 的信息。但是在我找到这些问题的答案之前,我的代码真的很糟糕:)

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

下面的代码有什么问题吗?

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

解释差异

提取物()

爆炸

内爆

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

$a = 012;
echo $a / 4;

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