recherche

Maison  >  Questions et réponses  >  le corps du texte

Définition de l'alias de la fonction Trait dans la méthode magique __callStatic

<p>J'ai un trait Queryable qui utilise la méthode __callStatic pour créer une nouvelle instance d'un Builder et exécuter la fonction appelée dessus si elle existe. Il renvoie un générateur pour enchaîner les requêtes (similaire à Eloquent). <br /><br />Maintenant, j'essaie d'implémenter une interface qui nécessite une fonction find(), mais la fonction find() est déclarée dans le phpDoc du trait Queryable (@method static static find (mixed $primaryKeyValue) ), ce qui crée un conflit : </p><p><code></code></p> <blockquote> <p>La déclaration de find(primaryKeyValue: Mixed) de Queryable doit être compatible avec StorageInterface->find(primaryKeyValue: Mixed) et les méthodes d'interface ne peuvent pas être créées. </p> </blockquote> <p>Afin de résoudre ce conflit, j'ai essayé d'utiliser une méthode similaire aux alias de traits (utilisez Queryable { Queryable::find as queryFind; }), mais j'ai ensuite rencontré...</p> <blockquote> <p>Erreur de compilation : un alias est défini pour appFrameworkTraitsQueryable::find, mais la méthode n'existe pas.</p> </blockquote> <p>Je n'arrive pas à trouver de solution. Quelqu'un peut-il m'aider ? :) (Je crois que cela a à voir avec une sorte de vérification d'existence de la classe puisque c'est une méthode magique, mais je ne sais pas non plus comment y remédier..) </p> <pre class="brush:php;toolbar:false;"><?php espace de noms appFrameworkTraits ; utilisez appFrameworkDatabaseBuilder ; utilisez appFrameworkDatabasePaginator ; /*** @method static int count() * @method static static|array<static> premier(int $montant = 1) * @method static static|array<static> dernier(int $montant = 1) * @method chaîne statique getQuery() * @method chaîne statique getRawQuery() * @method chaîne statique getPrimaryKey() * @method static static find (mixte $primaryKeyValue) * Tableau statique @method<static> tous() * Tableau statique @method<static> obtenir() * @method Paginator statique paginate() * @method table de constructeur statique (string $tableName) * @method static Builder PrimaryKey(string $primaryKey) * @method static Builder parPage(int $perPageAmount) * @method static Builder où (string $column, mixte $operatorOrValue = null, mixte $value = null) * @method static BuilderwhereIn(string $column, array $search) * @method static BuilderwhereNotNull(string $column) * @method static Builder select(...$colonnes) * @method static Builder avec (string $relation, Closure $closure) * @method static Builder orderBy(string $column, string $direction = 'desc') * Limite du constructeur statique @method (int $amount) * @method static Builder offset(int $montant)*/ trait Interrogable { fonction statique publique __callStatic (string $name, array $arguments) { $functions = get_class_methods(Builder::class); if (in_array ($ nom, $ fonctions)) { $builder = new Builder(static::class); return $builder->$name(...$arguments); } $selfFunctions = get_class_methods($callClass = static::class); if (!in_array($name, $selfFunctions)) { throw new BadMethodCallException("La méthode statique '{$name}' n'existe pas sur {$callClass}."); } return static::$name(...$arguments); } } la classe BaseModel étend stdClass implémente QueryableInterface, StorableInterface { utilisez interrogeable { Queryable :: find en tant que queryFind ; } fonction publique find (mixte $primaryKeyValue) : statique { return self::queryFind($primaryKeyValue); } } <?php espace de noms appStorageMethods ; interfaceStockableInterface { fonction getObject(mixed $primaryKeyValue) : statique ; fonction find (mixte $primaryKeyValue) : statique ; fonction save() : statique ; }</pré> <p><br /></p>
P粉226642568P粉226642568485 Il y a quelques jours449

répondre à tous(1)je répondrai

  • P粉439804514

    P粉4398045142023-08-01 10:51:41

    Les méthodes de traits peuvent être "renommées" : (en fait un alias)

    use Queryable {
        find as MyFind;
    }
    

    Référence

    Exemple simple :

    <?php
    
    Trait myTrait
    {
        public static function __callStatic ($method, $arguments)
        {
            $className = self::class;
            
            return (new $className ())->$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(); 

    répondre
    0
  • Annulerrépondre