Ich habe eine einfache (glaube ich).Implodieren von Array von Objekten
Ich habe eine Silex-Anwendung ... Ich habe eine Service-Services.yml-Datei erstellt, mit meinen Diensten mit ihren Argumenten. Von coruse können Argumente Instanz von anderen Klassen sein:
services:
Service:
class: App\Services\xxxxxService
arguments:
- App\Lib\Parser\JsonParser
- xxxxxx
Also, meiner init-Anwendung, ich habe dieses Stück Code:
$services = $this['config']['services'];
foreach ($services as $name => $service) {
$className = $service['class'];
$args = array_map(function ($arg) {
if(class_exists($arg)){
return new $arg;
} else {
return $arg;
}
}, $service['arguments']);
$args = implode(',', $args);
$this[$name] = new $className($this, $args);
}
Dieser Code gibt mir den Fehler:
Behebbarer fataler Fehler: Objekt der Klasse App \ Lib \ Parser \ JsonParser konnte in Zeile/252
nicht in string in /app/src/Application.php konvertiert werden. Mein Ziel ist $ $ [$ name] = new $ Klassenname ($ th ist, $ args [0], $ args [1] ....), aber ich kann die Implodefunktion nicht benutzen.
Irgendwelche Ideen ???
Vielen Dank im Voraus!
M.
Yesss !!! ... die Reflexion macht den Trick! +1 für dich! Denken Sie, Reflection ist zu teuer in Bezug auf die Speichernutzung? Betrachte meinen Code, glaubst du, ich bin dabei? .... Ich habe einen Application-Wrapper von Silex \ Application, und bevor ich das starte, starte ich alle Controller, die Parameter und Dienste in $ app, das ist eine Instanz von Pimple. Also in meiner Anwendung habe ich jetzt $ app ['myService'] und ich kann überall wiederverwenden. – Mauro
Sie versuchen, ein DependencyInjection-Tool zu erstellen. Obwohl es viele von ihnen gibt, ist es nicht schlecht, eigene zu bauen, da Sie eine Menge Dinge im Prozess lernen können. Für die Leistung ist es besser, Ihre Anwendung zu benchmarken und dann zu profilieren, wenn Sie denken, dass es langsam ist. In der Profilerstellung sehen Sie, wo Engpässe liegen. ReflectionClass wird auch von Symfony DI verwendet, und ich denke, das ist das einzige wawy in PHP, um aus Argumenten eine Klasseninstanz zu erstellen. – Whiteulver