为什么不必 PHP 做算法题,php 不是有很多 array function 吗
<?php declare(strict_types=1);
$a = ['a' => '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)。
<?php declare(strict_types=1);
$a = ['a' => '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 的问题。