Alias-Definition der Trait-Funktion in der magischen Methode __callStatic
P粉226642568
P粉226642568 2023-07-31 11:46:23
0
1
336

Ich habe ein abfragbares Merkmal, das die __callStatic-Methode verwendet, um eine neue Instanz eines Builders zu erstellen und die aufgerufene Funktion darauf auszuführen, falls vorhanden. Es gibt einen Builder zum Verketten von Abfragen zurück (ähnlich wie Eloquent).

Jetzt versuche ich, eine Schnittstelle zu implementieren, die eine find()-Funktion erfordert, aber die find()-Funktion ist im phpDoc des Queryable-Merkmals (@method static static find) deklariert (mixed $primaryKeyValue) ), wodurch ein Konflikt entsteht:

Die Deklaration von find(primaryKeyValue: Mixed) von Queryable muss mit StorageInterface->find(primaryKeyValue: Mixed) kompatibel sein, und Schnittstellenmethoden können nicht erstellt werden.

Um diesen Konflikt zu lösen, habe ich versucht, eine Methode zu verwenden, die Merkmalsaliasen ähnelt (verwenden Sie Queryable { Queryable::find as queryFind; }), aber dann stieß ich auf ...

Kompilierungsfehler: Für appFrameworkTraitsQueryable::find ist ein Alias definiert, aber die Methode existiert nicht.

Ich kann anscheinend keine Lösung finden. Kann mir jemand helfen? :) (Ich glaube, das hat mit einer Art Existenzprüfung der Klasse zu tun, da es sich um eine magische Methode handelt, aber ich weiß auch nicht, wie ich das beheben kann.)

 first(int $amount = 1) * @method static static|array last(int $amount = 1) * @method statischer String getQuery() * @method statischer String getRawQuery() * @method statischer String getPrimaryKey() * @method static static find(mixed $primaryKeyValue) * @method statisches Array alle() * @method statisches Array erhalten() * @method static Paginator paginate() * @method static Builder-Tabelle(string $tableName) * @method static Builder PrimaryKey(string $primaryKey) * @method static Builder perPage(int $perPageAmount) * @method static Builder where(string $column, gemischt $operatorOrValue = null, gemischt $value = null) * @method static Builder whereIn(string $column, array $search) * @method static Builder whereNotNull(string $column) * @method static Builder select(...$columns) * @method static Builder mit(string $relation, Closure $closure) * @method static Builder orderBy(string $column, string $direction = 'desc') * @method static Builder limit(int $amount) * @method static Builder offset(int $amount)*/ Merkmal abfragbar { öffentliche statische Funktion __callStatic(string $name, array $arguments) { $functions = get_class_methods(Builder::class); if (in_array($name, $functions)) { $builder = new Builder(static::class); return $builder->$name(...$arguments); } $selfFunctions = get_class_methods($claimedClass = static::class); if (!in_array($name, $selfFunctions)) { throw new BadMethodCallException("Statische Methode '{$name}' existiert nicht auf {$claimedClass}."); } return static::$name(...$arguments); } } Die Klasse BaseModel erweitert die stdClass und implementiert QueryableInterface und StorableInterface { Verwenden Sie abfragbar { Queryable::find as queryFind; } öffentliche Funktion find(mixed $primaryKeyValue): statisch { return self::queryFind($primaryKeyValue); } }  


P粉226642568
P粉226642568

Antworte allen (1)
P粉439804514

Trait方法可以被“重命名”:(实际上是一个别名)

use Queryable { find as MyFind; }

Reference

简单示例:

$method(...$arguments); } private function find() { echo "\naaaaaaaaaaaaa\n"; return $this; } } interface MyInterface { public function find(); } class Test Implements MyInterface { Use myTrait { find as myFind; } public function find() { echo "\nxxxxxx\n"; } } Test::myFind()->find();
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage
    Über uns Haftungsausschluss Sitemap
    Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!