代码之家  ›  专栏  ›  技术社区  ›  Clay

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

php
  •  75
  • Clay  · 技术社区  · 7 年前

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

    什么问题 你认为应该 PHP程序员能够响应吗?

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

    期待一些惊人的反应。

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

    17 回复  |  直到 14 年前
        1
  •  50
  •   Roland Schneider    15 年前

    不可否认,我从别的地方偷走了这个问题(记不起我在哪里读过了),但我觉得这很有趣:

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

    一个有经验的PHP用户会立即知道它的含义。 经验不足(而不是希伯来语)的开发人员可能希望阅读 this .

    但现在更严重的问题是:


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


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


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


    问: 写这个if语句的首选方法是什么?为什么?
    if( 5 == $someVar ) if( $someVar == 5 )
    答: 前者,因为它可以防止在忘记使用2个等号时意外地将5分配给$somevar。( $someVar = 5 会导致错误,后者不会。


    问: 给定此代码:

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

    …什么是价值 $a $b 函数调用之后,为什么?
    答: $A 4 美元 3 . 前者是因为$arg是通过引用传递的,后者是因为函数的返回值是参数初始值的副本(不是对参数初始值的引用)。


    面向对象程序设计

    问: 两者有什么区别 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
        }
    }
    

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


    问: 接口和抽象类之间的区别是什么?
    答: 接口定义了实现类IS和调用接口的对象之间的协定。抽象类为将扩展它的类预先定义了某些行为。在某种程度上,这也可以被视为一种合同,因为它包含了某些存在的方法。


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


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

        2
  •  24
  •   Kartoch    16 年前

    明确的安全问题!

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

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

    第一个改变了入口的敌意。第二个检查条目是否正确,如果不正确,请拒绝。

        3
  •  14
  •   kprobst    16 年前

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

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

        4
  •  12
  •   Strae    16 年前

    PHP是跨浏览器吗?

    (我知道,这会让很多人大笑,但这是PHP论坛上更多被问到的问题!)

        5
  •  11
  •   bkildow    14 年前

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

        6
  •  9
  •   Michael Stum    16 年前

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

        7
  •  9
  •   Nathan Osman    15 年前

    解释以下代码显示的原因 2.5 而不是 3 :

    $a = 012;
    echo $a / 4;
    

    答: 当数字前面加上 0 在PHP中,该数字被视为 八进制的 数字(以8为基数)。因此八进制数 012 等于十进制数 10 .

        8
  •  8
  •   markb    16 年前

    还没有人提到它,但它是每个PHP开发人员都应该能够详细讨论的问题:为什么 register_globals 不好?

        9
  •  7
  •   AntonioCS    16 年前

    当使用PHP开发一个站点时,它完全是垃圾,是不是:

    a)PHPS故障

    b)编程器故障

        10
  •  6
  •   Matt    16 年前

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

        11
  •  6
  •   tadamson    16 年前
    • 调用$array的“name”元素时,哪个是正确的?:

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

      两者通常都有效,但只有引用的形式才是正确的。 define('name', 0); 看着虫子飞。我看得太多了。

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

      将空括号附加到名称属性:多个 <input type="checkbox" name="checkboxes[]" /> 元素将转换为服务器上的数组(例如 $_POST['checkboxes'][0..n] )我不认为它是100%特定于PHP的,但它确实比循环 $_POST 尽一切可能 'checkboxes'.$i 元素。

    • mysql,mysqli,还是pdo?

      这里只有一个真正错误的答案:mysql_uu库不做准备好的语句,也不能再为它的邪恶能力辩解。命名一个函数,每个执行的查询需要多次调用一个函数, mysql_real_escape_string() “,只是伤口里的盐。

        12
  •  5
  •   VolkerK    16 年前

    “您最喜欢的调试器是什么?”
    “你最喜欢的分析工具是什么?”

    只要实际的应用程序/ide/frontend超过“notepad,echo and microtime()”,它就不重要了。你不太可能雇用十亿分之一的开发人员一直编写完美的代码,而他/她的单元测试在错误和瓶颈出现之前就发现了所有的错误和瓶颈,你希望有人能够分析和/或单步执行代码并在有限的时间内发现错误。(这可能适用于所有语言/平台,但在我看来,在PHP开发人员中,这似乎有点不成熟,纯粹是主观的说法)

        13
  •  5
  •   Cody Caughlan    16 年前

    TerryChay有一篇博文,基本上总结了每个PHP开发人员在面试中应该知道和/或应该回答的问题。

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

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

        14
  •  4
  •   MInner    15 年前

    我会问如下问题:

    a)缓存怎么办?

    b)如何组织缓存?

    c)您确定不执行额外的数据库查询吗?(我在php上做的第一件事就是在foreach内部进行一个mysql_查询,以获取发表评论的用户的名字……可怕的:)

    d)为什么登记全球是邪恶的?

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

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

    在我读了一些基本的书之后,这些问题对我来说一点也不清楚。我通过网络上的数千个常见问题解答,在几天\几周内找到了所有关于注射和CSX、Strpos的信息。但在我找到这些问题的答案之前,我的代码非常糟糕:)

        15
  •  3
  •   lamas    16 年前

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

    直接从GET打印数据会导致 Cross-site scripting (XSS) 漏洞。 这就是为什么您应该首先通过htmlspecialchars()从客户机发送输入。

        16
  •  2
  •   Zeishi    16 年前

    解释的差异

    提取()

    分解()

    内爆()

        17
  •  1
  •   Nathan Osman    16 年前

    以下代码有什么问题?

    $a = 2;
    function foo()
    {
        $a = 3;
    }
    foo();
    echo $a;
    
    推荐文章