为什么不用 PHP 做算法题

为什么不用 PHP 做算法题, php 不是有很多 array function 吗

 'x', '42' => 'y'];

function foo(string $k, string $v):void {
    echo "{$k}={$v}\n";
}

// foreach ($a as $k => $v) {
//     foo($k, $v); // 失败, 因为在 foo signature 的要求之下 第一个参数应该是 string
// }

foreach ($a as $k => $v) {
    foo((string)$k, $v); // OK
}

// https://twitter.com/FredBouchery/status/1410570286337085440
// https://twitter.com/exakat

// https://phpstan.org/r/78d9db49-1684-4149-85e6-391ddde26411

// 这个其实涉及到 array key 原理了(某个机制会自动把 numeric string key 转化为 int key ), 属于历史包袱, 不太可能改变
// https://stackoverflow.com/questions/4100488/a-numeric-string-as-array-key-in-php

这里谈到了, 的机制

Reason that comes to my mind relates to array functions like array_merge "If the input arrays have the same string keys, then the later value for that key will overwrite the previous one. If, however, the arrays contain numeric keys, the later value will not overwrite the original value, but will be appended."

如果用 php 做算法题,那么需要在保证算法质量的基础上保证 php 内容质量,这一点是额外工作量。如果不用 php (作为内容质量的基点) 那么就可以省略这部分工作量,至少将算法质量和 php 内容质量解耦。

至于 “将 php 内容质量交给 php 内容质量” 本身,这就包括了是否根本不要声明变量类型,是否根本不用 strict_types 类型约束等(何时会出现“用了也没用”的情况1)。

 'x', '42' => 'y'];

function foo($k, $v) {
    echo "{$k}={$v}\n";
}

foreach ($a as $k => $v) {
    foo($k, $v);
}

它给了你选择的空间,权衡的空间,那么就有 defensive 的空间,这就是额外工作量、额外 credits 。反而 一个 “只有一种写法” 的语言是剥夺了这部分空间的,心智负担也就同时剥夺了。

当然,另一种办法是,像使用静态类型语言那样使用 php 。在使用静态语言 php 时候,然而这样又会遇到文章开始时候遇到的问题,因为这是 array 本身的机制决定的,导致 array function 好看不好用。这时候应该在输入处确定变量类型和值,同时拒绝类型混搭现象(拒绝将 string 和 int 放在同一个 array 里, 即使这是 php 解释器允许的、可高效处理的、优化过的、以此见长的 作为 php 解释器的优点来宣传和夸赞的),尤其是 numeric string 的问题。

你可能感兴趣的:(心得)