Alias takrif fungsi Trait dalam kaedah sihir __callStatic
P粉226642568
2023-07-31 11:46:23
<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>
Kaedah trait boleh "dinamakan semula": (sebenarnya alias)
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();