Created
May 17, 2013 05:35
-
-
Save AmyStephen/5597142 to your computer and use it in GitHub Desktop.
Uses Reflection to extract Constructor Parameters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| /** | |
| * Standard Dependency Injector | |
| * | |
| * @package Molajo | |
| * @license http://www.opensource.org/licenses/mit-license.html MIT License | |
| * @copyright 2013 Amy Stephen. All rights reserved. | |
| */ | |
| namespace Molajo\IoC\Handler; | |
| use Exception; | |
| use ReflectionClass; | |
| use ReflectionParameter; | |
| use Molajo\IoC\Exception\InjectorException; | |
| use Molajo\IoC\Handler\AbstractInjector; | |
| use Molajo\IoC\Api\InjectorInterface; | |
| /** | |
| * Standard Dependency Injector | |
| * | |
| * @author Amy Stephen | |
| * @license http://www.opensource.org/licenses/mit-license.html MIT License | |
| * @copyright 2013 Amy Stephen. All rights reserved. | |
| * @since 1.0 | |
| */ | |
| class StandardInjector extends AbstractInjector implements InjectorInterface | |
| { | |
| /** | |
| * Constructor | |
| * | |
| * @param $options | |
| * | |
| * @since 1.0 | |
| */ | |
| public function __construct($options) | |
| { | |
| $this->service_namespace = $options['service']; | |
| $this->store_instance_indicator = true; | |
| parent::__construct($options); | |
| } | |
| /** | |
| * Instantiate Class | |
| * | |
| * @param bool $create_static | |
| * | |
| * @return object | |
| * @since 1.0 | |
| * @throws InjectorException | |
| */ | |
| public function instantiate($create_static = false) | |
| { | |
| $options = array(); | |
| $reflect = new ReflectionClass($this->service_namespace); | |
| $parameters = $reflect->getMethod('__construct')->getParameters(); | |
| foreach ($parameters as $parameter) { | |
| if (isset($this->options[$parameter->name])) { | |
| $options[$parameter->name] = $this->options[$parameter->name]; | |
| } | |
| } | |
| try { | |
| $this->service_instance = new $this->service_namespace(implode(',', $options)); | |
| } catch (Exception $e) { | |
| throw new InjectorException | |
| ('IoC: Injector Instance Failed for ' . $this->service_namespace | |
| . ' failed.' . $e->getMessage()); | |
| } | |
| return $this; | |
| } | |
| } |
Author
I tried the call_user_func_array - but I did not try newInstanceArgs (nor had I heard about it)
I'll read up tomorrow on this http://php.net/manual/en/reflectionclass.newinstanceargs.php
Changed 65 to:
$this->service_instance = new $this->service_namespace($reflect->newInstanceArgs($options))
But - obviously that was not what you meant.
Thanks for the pointer!
Author
So, you mean quite literally - do just what you said! /me gets ready to go to sleep!
THANK YOU! Awesome!
$this->service_instance = $reflect->newInstanceArgs($options);
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
On L56, I think you're looking for
call_user_func_array(array($this->service_namespace, '__construct'), $options)instead.Update: actually, I don't think you can use
call_user_func_arraywith a__constructargument, but you can use reflection instead:$reflect->newInstanceArgs($options)