cari

Rumah  >  Soal Jawab  >  teks badan

Alias ​​​​takrif fungsi Trait dalam kaedah sihir __callStatic

<p>Saya mempunyai sifat Boleh Soal yang menggunakan kaedah __callStatic untuk mencipta tika baharu Pembina dan menjalankan fungsi yang dipanggil padanya jika wujud. Ia mengembalikan Pembina untuk merantai pertanyaan (serupa dengan Eloquent). <br /><br />Sekarang saya cuba melaksanakan antara muka yang memerlukan fungsi find(), tetapi fungsi find() diisytiharkan dalam phpDoc bagi sifat Boleh Soal (@method static static find (campuran $primaryKeyValue) ), yang mewujudkan konflik: </p><p><code></code></p> <blockquote> <p>Pengisytiharan penemuan Queryable(primaryKeyValue: mixed) mestilah serasi dengan StorageInterface->find(primaryKeyValue: mixed), dan kaedah antara muka tidak boleh dibuat. </p> </blockquote> <p>Untuk menyelesaikan konflik ini, saya cuba menggunakan kaedah yang serupa dengan alias sifat (gunakan Queryable { Queryable::find as queryFind; }), tetapi kemudian saya temui...</p> <blockquote> <p>Ralat kompilasi: Alias ​​ditakrifkan untuk appFrameworkTraitsQueryable::find, tetapi kaedah itu tidak wujud.</p> </blockquote> <p>Saya nampaknya tidak dapat mencari penyelesaian. Bolehkah sesiapa membantu saya? :) (Saya percaya ini ada kaitan dengan beberapa jenis pemeriksaan kewujudan pada kelas kerana ia adalah kaedah ajaib, tetapi saya juga tidak tahu bagaimana untuk membetulkannya..) </p> <pre class="brush:php;toolbar:false;"><?php namespace appFrameworkTraits; gunakan appFrameworkDatabaseBuilder; gunakan appFrameworkDatabasePaginator; /*** @kaedah statik int count() * @kaedah statik statik|tatasusunan<statik> pertama(int $amount = 1) * @kaedah statik statik|tatasusunan<statik> terakhir(int $amount = 1) * @method rentetan statik getQuery() * @method rentetan statik getRawQuery() * @method rentetan statik getPrimaryKey() * @method statik carian statik(bercampur $primaryKeyValue) * @kaedah tatasusunan statik<statik> semua() * @kaedah tatasusunan statik<statik> dapatkan() * @kaedah penomboran statik penomboran () * @method jadual Pembina statik(rentetan $tableName) * @method Builder statik primaryKey(rentetan $primaryKey) * @method Statik Builder perPage(int $perPageAmount) * @method Builder statik di mana(rentetan $lajur, bercampur $operatorOrValue = null, bercampur $value = null) * @method Builder statik whereIn(rentetan $column, array $search) * @method Builder statik whereNotNull(rentetan $column) * @method statik Builder pilih(...$columns) * @method Builder statik dengan(rentetan $relation, Closure $closure) * @method statik Builder orderBy(rentetan $lajur, rentetan $arah = 'desc') * @method had Pembina statik(int $amount) * @method statik Pembina mengimbangi(int $amount)*/ sifat Boleh Dipertanyakan { fungsi statik awam __callStatic(rentetan $nama, array $argumen) { $functions = get_class_methods(Pembina::kelas); if (in_array($name, $functions)) { $builder = new Builder(statik::class); kembalikan $builder->$name(...$arguments); } $selfFunctions = get_class_methods($calledClass = static::class); if (!in_array($name, $selfFunctions)) { throw new BadMethodCallException("Kaedah statik '{$name}' tidak wujud pada {$calledClass}."); } return static::$name(...$arguments); } } kelas BaseModel memanjangkan stdClass melaksanakan QueryableInterface, StorableInterface { gunakan Boleh Ditanya { Boleh ditanya::cari sebagai queryFind; } cari fungsi awam(campuran $primaryKeyValue): statik { return self::queryFind($primaryKeyValue); } } <?php namespace appStorageMethods; antara muka StorableInterface { function getObject(mixed $primaryKeyValue): statik; function find(mixed $primaryKeyValue): statik; fungsi simpan(): statik; }</pre> <p><br /></p>
P粉226642568P粉226642568532 hari yang lalu487

membalas semua(1)saya akan balas

  • P粉439804514

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

    Kaedah trait boleh "dinamakan semula": (sebenarnya alias)

    use Queryable {
        find as MyFind;
    }
    

    Rujukan

    Contoh mudah:

    <?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(); 

    balas
    0
  • Batalbalas