无法使用字符串键解压缩数组

2022-08-30 10:10:23

错误消息是:

致命错误未捕获错误:无法解压缩带有字符串键的数组

我知道我可以简单地运行该方法两次并传递 and ,但我试图掌握使用新的解包值。我想像这样传递值:fetch()['q']['bind']...

(string) SQL, (Array) Bind Values

但我认为它试图从方法中解压缩绑定值数组以及响应数组。是否可以解压缩此数组?fetch()

它看起来像这样:

array(2) {
    ["q"] => string(7) "example"
    ["bind"] => array(1) {
        ["example"] => string(3) "one"
    }
}

这是整个代码,以防您需要查看它们是如何组合在一起的:

class ModelController {
    public static function execute($sql, $vals) {
        var_dump($vals);
    }
}

class ModelContainer {

    private $queries = [];

    public function add_model(Model $model, $name) {
        $this->queries[$name] = $model;
        return $this;
    }

    public function exec_all() {
        foreach($this->queries as $q) {
            ModelController::execute(...$q->fetch());
        }
    }

    public function exec($name) {

    }

}

class Model {

    private $sql;
    private $vals = [];


    public function set_q($statement) {
        $this->sql = $statement;
        return $this;
    }

    public function bind($vals = []) {
        $this->vals = $vals;
        return $this;
    }

    public function fetch() {
        return ['q' => (string)$this->sql,
            'bind' => $this->vals ];
    }
}

$m = new ModelContainer();
$m->add_model((new Model)->set_q('example SQL content here')->bind(['example' => 'example value here']), 'one');
$m->exec_all();

答案 1

问题在于 splat 运算符(数组解包运算符或 )不适用于关联数组。例:...

$array = [1, 2, 3];
$assoc = ["one" => 1, "two" => 2, "three" => 3];

var_dump(...$array); //Works
var_dump(...$assoc); //Doesn't work

您需要强制对数组进行数字索引才能解压缩它。您可以使用array_values执行此操作:

$values = array_values($q->fetch());
ModelController::execute(...$values);

数组值将确保所有值都具有连续的数字键。

更新

从 PHP 8 开始,将支持命名参数,这将使这两种情况都有效。在建议的 RFC 中记录了一个命名参数的示例,该示例表示以下代码应从 PHP 8 开始工作

$params = ['start_index' => 0, 'num' => 100, 'value' => 50];
array_fill(...$params);

答案 2

更新 PHP 8.1

从 PHP 8.1 开始,解压缩数组也适用于字符串键数组,因此错误 FATAL ERROR Uncaught 错误:无法使用字符串键解压缩数组将不再适用。

例:

$array1 = ["a" => 1];
$array2 = ["a" => 2];
$array = ["a" => 0, ...$array1, ...$array2];
var_dump($array); // ["a" => 2]

RFC: PHP RFC: 使用字符串键解压缩数组