Start · Sprachen · PHP · Referenz · MongoDB\BSON\JavascriptInterface

MongoDB\BSON\JavascriptInterface

Interface

Interface für Klassen, die BSON-JavaScript-Code repräsentieren und den Zugriff auf Code und optionalen Scope ermöglichen.

seit PHP 1.0.0 Kategorie: db

Signatur

interface JavascriptInterface

Beschreibung

MongoDB\BSON\JavascriptInterface ist ein Interface aus der MongoDB PHP-Extension (ext-mongodb), das Klassen beschreibt, welche den BSON-Typ JavaScript (BSON-Typ 13) abbilden. BSON-JavaScript wird in MongoDB verwendet, um serverseitigen JavaScript-Code – zum Beispiel für $where-Abfragen oder MapReduce-Operationen – zu speichern und zu übertragen.

Das Interface schreibt zwei Methoden vor: getCode() liefert den JavaScript-Code als Zeichenkette, während getScope() ein optionales MongoDB\BSON\Document-Objekt (oder null) zurückgibt, das Variablen und deren Werte für den Ausführungskontext des Scripts enthält. Ist kein Scope definiert, handelt es sich um ein einfaches JavaScript-Objekt; mit Scope entspricht es dem BSON-Typ JavaScript with Scope (Typ 15).

Typischerweise wird die konkrete Klasse MongoDB\BSON\Javascript verwendet, die dieses Interface implementiert. Das Interface selbst ist nützlich, wenn eigene Klassen als BSON-JavaScript-Code fungieren sollen oder wenn Typdeklarationen in Methoden und Funktionen die Flexibilität gegenüber beliebigen Implementierungen gewährleisten sollen.

  • getCode(): string – Gibt den gespeicherten JavaScript-Code zurück.
  • getScope(): ?MongoDB\BSON\Document – Gibt den optionalen Scope des JavaScript-Codes zurück oder null.

Beispiele

Eigene Implementierung von JavascriptInterface

<?php
use MongoDB\BSON\JavascriptInterface;
use MongoDB\BSON\Document;

class MeinJavascript implements JavascriptInterface
{
    private string $code;
    private ?Document $scope;

    public function __construct(string $code, ?Document $scope = null)
    {
        $this->code  = $code;
        $this->scope = $scope;
    }

    public function getCode(): string
    {
        return $this->code;
    }

    public function getScope(): ?Document
    {
        return $this->scope;
    }

    public function serialize(): string
    {
        return serialize(['code' => $this->code]);
    }

    public function unserialize(string $data): void
    {
        $values = unserialize($data);
        $this->code  = $values['code'];
        $this->scope = null;
    }

    public function __serialize(): array
    {
        return ['code' => $this->code];
    }

    public function __unserialize(array $data): void
    {
        $this->code  = $data['code'];
        $this->scope = null;
    }
}

$js = new MeinJavascript('function() { return this.aktiv === true; }');
echo $js->getCode();
function() { return this.aktiv === true; }

Typsichere Funktion mit JavascriptInterface

<?php
use MongoDB\BSON\Javascript;
use MongoDB\BSON\JavascriptInterface;

function bsonJsInfo(JavascriptInterface $js): void
{
    echo 'Code: ' . $js->getCode() . PHP_EOL;
    $scope = $js->getScope();
    if ($scope !== null) {
        echo 'Scope vorhanden: ' . json_encode($scope) . PHP_EOL;
    } else {
        echo 'Kein Scope definiert.' . PHP_EOL;
    }
}

// Einfaches JavaScript ohne Scope
$jsOhneScope = new Javascript('function() { return this.preis < 100; }');
bsonJsInfo($jsOhneScope);

// JavaScript mit Scope (Variable wird an das Script übergeben)
$jsMitScope = new Javascript('function() { return this.preis < maxPreis; }', ['maxPreis' => 50]);
bsonJsInfo($jsMitScope);
Code: function() { return this.preis < 100; } Kein Scope definiert. Code: function() { return this.preis < maxPreis; } Scope vorhanden: {"maxPreis": 50}

// Wichtig · Fallstricke

Sicherheit: Die Verwendung von serverseitigem JavaScript in MongoDB (z. B. $where-Operator) ist sicherheitskritisch und kann JavaScript-Injection-Angriffe ermöglichen, wenn Benutzereingaben unkontrolliert eingebettet werden. Seit MongoDB 4.4 ist der $where-Operator deprecated; es sollten stattdessen native Abfrageoperatoren verwendet werden.

BSON-Typen: JavaScript ohne Scope entspricht BSON-Typ 13 (0x0D), JavaScript mit Scope BSON-Typ 15 (0x0F). Letzterer gilt in modernen MongoDB-Versionen ebenfalls als veraltet.

Kompatibilität: Dieses Interface gehört zur ext-mongodb-Extension (PECL) und ist nicht Teil der älteren ext-mongo-Extension. Eigene Implementierungen dieses Interfaces werden von der Extension beim BSON-Serialisieren nicht automatisch erkannt – dafür müssen zusätzlich die Interfaces MongoDB\BSON\Serializable und MongoDB\BSON\Unserializable implementiert werden.