Rumah > Soal Jawab > teks badan
Andaikan saya mempunyai struktur kelas berikut:
class Logger { public function __construct(string $channel) { // Logger初始化工作 } } class UsingLogger { private Logger $logger; public function __construct(Logger $logger) { $this->logger = $logger; } } $logger = new Logger("UsingLogger"); $usingLogger = new UsingLogger($logger);
Kod ini berfungsi dengan baik. Dalam kes ini, nama saluran ialah nama kelas. Walau bagaimanapun, saya mahu menggunakan PHP DI (https://php-di.org/doc/php-definitions.html#autowired-objects) untuk menyelesaikan masalah ini. Masalahnya ialah ia tidak dapat menyelesaikan keadaan kerana ia tidak mengetahui nama kelas yang diserahkan kepada pembalak.
Contoh definisi PhpDI
return [ "SomeLoggerInterface" => autowire(Logger::class)->constructorParameter("channel", // 在这里获取类的名称。在这种情况下,它将是 "UsingLogger") ]
Semoga ini menjelaskannya. Jika lebih banyak konteks diperlukan, sila beritahu saya.
Saya telah menggariskan langkah saya
P粉6974089212023-09-12 09:14:07
Saya andaikan anda sudah memasang pakej DI.
<?php
declare(strict_types=1);
require_once 'vendor/autoload.php';
final class Logger
{
public function __construct(private readonly string $channel) {}
}
final class UsingLogger {
public function __construct(private readonly Logger $logger) {}
}
$container = new DI\Container([
'channel' => 'UsingLogger',
'Logger' => DI\create()->constructor(DI\get('channel')),
'UsingLogger' => DI\create()->constructor(DI\get('Logger')),
]);
final class TestClass
{
public function __construct(UsingLogger $usingLogger) {
var_dump($usingLogger);
}
}
new TestClass($container->get('UsingLogger'));
Menjalankan skrip ini menghasilkan output berikut:
php index.php path/to/script.php:25: class UsingLogger#20 (1) { private readonly Logger $logger => class Logger#25 (1) { private readonly string $channel => string(11) "UsingLogger" } }
Mungkin anda juga perlu menggunakan antara muka. Harap ini membantu anda.