49

エラーメッセージは次のとおりです。

FATAL ERROR Uncaught Error: 文字列キーで配列をアンパックできません

メソッドを 2 回実行して and を渡すだけでよいことはわかっていますが、fetch()newを使用して値をアンパックする方法を理解しようとしています。次のように値を渡したい:['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();
4

3 に答える 3

80

問題は、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 以降では、両方のケースが機能する名前付き引数がサポートされる予定です。次のコードが PHP 8 以降で動作するはずであるという名前付き引数の提案された RFC に例が文書化されています。

$params = ['start_index' => 0, 'num' => 100, 'value' => 50];
array_fill(...$params);
于 2016-11-17T19:53:46.550 に答える