每个优秀的PHP开发人员都应该能够回答的问题 [已关闭]

php
2022-08-30 08:35:00

我正在研究每个优秀的.Net开发人员应该能够回答的问题,并且对这个问题的内容和方法印象深刻,因此本着同样的精神,我向PHP开发人员提出这个问题。

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

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

期待一些惊人的回应。

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


答案 1

诚然,我从其他地方偷了这个问题(不记得我在哪里读过它了),但觉得这很有趣:

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

一个有经验的PHP'er立即知道它意味着什么。经验不足(不是希伯来语)的开发人员可能想阅读这篇文章

但现在有更严肃的问题:


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


问:此查询有什么问题:?
答:1.它对SQL注入是脆弱的。切勿在查询中直接使用用户输入。首先对其进行消毒。最好使用预准备语句 (PDO2.不要选择所有列 (*),而是指定每一列。这主要是为了防止查询在将来的某个时候添加 BLOB 列时占用内存。"SELECT * FROM table WHERE id = $_POST[ 'id' ]"


问:这个 if 语句有什么问题: ?
A: 返回它首次找到$needle的索引位置,可以是 。由于也解析到的解决方案是使用严格的比较:if( !strpos( $haystack, $needle ) ...strpos00falseif( false !== strpos( $haystack, $needle )...


问:编写此 if 语句的首选方法是什么,为什么?

A:前者,因为它可以防止当您忘记使用2个等号()时意外分配5到$someVar,并且会导致错误,后者不会。if( 5 == $someVar )if( $someVar == 5 )$someVar = 5


问:给定此代码:

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

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

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


特定于 OOP

问:和 类定义中 有什么区别?
答:使类成员对“所有人”可用,使类成员仅对自身和派生类可用,使类成员仅对类本身可用。publicprotectedprivatepublicprotectedprivate


问:此代码有什么问题:

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 的类有什么问题,它们直接映射到它的内部成员,而实际上没有执行行为的方法?
答:这可能是一种代码异味,因为该对象充当了一个 ennobled 数组,没有太多其他用途。


问:为什么PHP对接口使用的实现不是最优的?
答:PHP不允许你定义方法的预期返回类型,这基本上使接口变得毫无用处。9-3


答案 2

明确的安全问题!

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

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

第一个将条目转换为不那么敌对的东西。第二个检查输入是否正确,如果没有拒绝它。


推荐