Comment obtenir le nom de classe constructeur de l'objet transmis en PHP ?
P粉413307845
P粉413307845 2023-09-11 11:23:19
0
1
606

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粉413307845
P粉413307845

répondre à tous(1)
P粉697408921

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal