beforePackCb)) $frame = call_user_func($this->beforePackCb, $frame); if ($this->escapeSpecial) { $frame = array_map(quotemeta(...), $frame); } if ($this->quoteStrings) { $frame = array_map(fn($v) => is_string($v) ? ('"'.str_replace('"',"\\\"",$v).'"') : $v, $frame); } $data = join(" ", $frame); $data .= $this->lineBreak; if (is_callable($this->afterPackCb)) $data = call_user_func($this->afterPackCb, $data); return $data; } public function unpackFrame(string $data): array { return str_getcsv($data, ' ', '"', "\\"); } public function consumeFrame(string &$data): ?array { // check for $this->lineBreak $p = strpos($data, $this->lineBreak); if ($p === false) { return null; } // break on separator $frame = substr($data, 0, $p); $data = substr($data, $p + strlen($this->lineBreak)); return $this->unpackFrame($frame); } }