为什么不用 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 的问题[1]。那么这时候用 php 和用 C语言就差别不大了,都是没有预置(且不坑)的数据结构与方法的。

当然 php 数组有自己擅长解决的问题 1:在那里,它不会给你设一个死局。甚至少了类型约束有助于加快对于模式的理解。

[ 如果你追求的是答案,那么没问题,由此当然有答案;如果你在追求屏蔽编译器解释器的细节问题,那么它就是死局 结果就是付钱给你去一直翻 php manual 。如果是 C# CLS 那么就不会这样。对于大型模式 JAVA 等静态语言带来的繁文缛节显得太乖了,而对于xxx, 再怎么乖都 OK 越乖越好。


changsj
211 声望11 粉丝

changsj.


引用和评论

0 条评论