Alias ​​​​takrif fungsi Trait dalam kaedah sihir __callStatic
P粉226642568
P粉226642568 2023-07-31 11:46:23
0
1
472
<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粉226642568
P粉226642568

membalas semua(1)
P粉439804514

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(); 
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan