我正在经历Questions every good .Net developer should be able to answer并且对这个问题的内容和方法印象深刻,所以本着同样的精神,我正在为PHP Developer提出这个问题。
您认为优秀的 PHP程序员能够回答的问题
编辑:我将此问题标记为社区维基,因为它不是特定于用户的,它旨在为整个编程社区提供服务。
期待一些惊人的回应。
注意:请按照评论中的建议回答问题,以便人们可以了解有关该语言的新内容。
答案 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
的值是什么?为什么?
答: $a
为4
,$b
为3
。前者因为$ arg是通过引用传递的,后者是因为函数的返回值是参数初始值的副本(不是引用)。
特定于OOP
问:类定义中public
,protected
和private
之间的区别是什么?
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应用程序要复杂得多)
在每个重要请求上添加一个令牌以保护重要操作(用户必须在发送关键请求之前看过该表单)。?
htmlentities()有利于开始。
您需要知道XXX使用的“词汇”是什么,然后扣除您需要消毒和/或“检查和拒绝”的内容。
解释PHP代码(可能包含在远程文件中)或在系统上执行命令的函数。一个简短且不完整的列表可以是:exec(),passthru(),system(),popen(),eval(),preg_replace()......
打开文件或远程资源时,需要仔细检查使用的参数。
这将很长,所以我跳过答案,请阅读PHP手册。
第一个转换条目的东西不那么恶劣。第二个检查条目是否正确,如果不是,则拒绝它。
答案 2 :(得分:14)
“你为什么不用别的东西?”
抱歉,有人不得不说:)
答案 3 :(得分:12)
php跨浏览器吗?
(我知道,这会让很多人大笑,但是在php论坛上问题更多!)
答案 4 :(得分:11)
我认为一个好问题是: HTTP如何工作?在PHP开发中固有地使用其他HTTP通信中的GET
和POST
数据。了解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;