Rumah  >  Soal Jawab  >  teks badan

Bagaimana untuk mendapatkan nama kelas pembina bagi objek yang diluluskan dalam PHP?

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粉413307845P粉413307845426 hari yang lalu593

membalas semua(1)saya akan balas

  • P粉697408921

    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.

    balas
    0
  • Batalbalas