Wie erhalte ich den Konstruktorklassennamen des übergebenen Objekts in PHP?
P粉413307845
P粉413307845 2023-09-11 11:23:19
0
1
465

Angenommen, ich habe die folgende Klassenstruktur:

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

Dieser Code funktioniert einwandfrei. In diesem Fall ist der Name des Kanals der Name der Klasse. Ich möchte jedoch PHP DI (https://php-di.org/doc/php-definitions.html#autowired-objects) verwenden, um dieses Problem zu lösen. Das Problem besteht darin, dass die Situation nicht gelöst werden kann, da der an den Logger übergebene Klassenname nicht bekannt ist.

Beispiel PHPDI-Definition

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

Ich hoffe, das macht es klar. Wenn mehr Kontext benötigt wird, lassen Sie es mich bitte wissen.

Ich habe meine Schritte beschrieben

P粉413307845
P粉413307845

Antworte allen(1)
P粉697408921

我假设你已经安装了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'));

运行这个脚本会产生以下输出:

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

也许你还应该使用接口。希望这对你有帮助。

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!