recherche

Maison  >  Questions et réponses  >  le corps du texte

Comment obtenir le nom de classe constructeur de l’objet transmis en PHP ?

Supposons que j'ai la structure de classe suivante :

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

Ce code fonctionne bien. Dans ce cas, le nom du canal est le nom de la classe. Cependant, je souhaite utiliser PHP DI (https://php-di.org/doc/php-definitions.html#autowired-objects) pour résoudre ce problème. Le problème est qu'il ne peut pas résoudre la situation car il ne connaît pas le nom de classe transmis au logger.

Exemple de définition PhpDI

return [
        "SomeLoggerInterface" => autowire(Logger::class)->constructorParameter("channel", // 在这里获取类的名称。在这种情况下,它将是 "UsingLogger")
    ]

J'espère que cela sera clair. Si plus de contexte est nécessaire, veuillez me le faire savoir.

J'ai décrit mes étapes

P粉413307845P粉413307845484 Il y a quelques jours631

répondre à tous(1)je répondrai

  • P粉697408921

    P粉6974089212023-09-12 09:14:07

    Je suppose que le package DI est déjà installé.

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

    L'exécution de ce script produit le résultat suivant :

    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"
      }
    }

    Peut-être devriez-vous également utiliser des interfaces. J'espère que cela vous aide.

    répondre
    0
  • Annulerrépondre