Re: Dependency Injection containers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

you could simply write your own, you simply need a class or a function that
given an identifier such as "database.connector" would return you an
instance of it, and
and maybe handle singletons.
It just a question of taste of how you want it to be.

I have just posted a few days ago my implementation, it might interest you
(I think it should work with php 5.2)

<?php
class Dependency {
    protected $_singletonInstances = array();
    protected $_setInstances = array();
    protected $_configuration;

    protected static $_instance;

    public static function getInstance() {
        if (self::$_instance===null) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    public function setConfiguration(array $configuration) {
        $this->_configuration = $configuration;
    }

    public function getConfiguration() {
        return $this->_configuration;
    }

    public function __isset($serviceName) {
        return isset($this->_serviceInstances[$serviceName]);
    }

    public function __call($serviceName, $args) {
        // singleton
        if (isset($this->_configuration[$serviceName]) &&
$this->_configuration[$serviceName]['singleton']) {
            if (!isset($this->_singletonInstances[$serviceName])) {
                $rc = new
ReflectionClass($this->_configuration[$serviceName]['class']);
                $this->_singletonInstances[$serviceName] = empty($args) ?
$rc->newInstance() : $rc->newInstanceArgs($args);
            }
            $ret = $this->_singletonInstances[$serviceName];
        } else {
            // normal
            if (isset($this->_setInstances[$serviceName])) {
                $ret = $this->_setInstances[$serviceName];
                unset($this->_setInstances[$serviceName]);
            } else {
                $rc = new
ReflectionClass($this->_configuration[$serviceName]['class']);
                $ret = $this->_singletonInstances[$serviceName] =
empty($args) ? $rc->newInstance() : $rc->newInstanceArgs($args);
            }
        }
        return $ret;
    }

    public function __get($serviceName) {
        return $this->__call($serviceName, array());
    }

    public function __set($serviceName, $instance) {
        if (!is_object($instance))
            throw new Exception('instance must be an object');
        $this->_setInstances[$serviceName] = $instance;
    }
}

$di=Dependency::getInstance();
$di->setConfiguration(array(
    'database.connector'=>array(
        'singleton'=>true,
        'class'=>'DatabaseConnector'
    ),
    'database'=>array(
        'singleton'=>true,
        'class'=>'Database'
    )
));

class DatabaseConnector{}
class Database{
    protected $_connector;
    public function __construct(){

$this->setConnector(Dependency::getInstance()->{'database.connector'});
    }

    public function setConnector($connector){
        $this->_connector=$connector;
    }
}
class Test{
    protected $_database;
    public function __construct(){
        $this->setDatabase(Dependency::getInstance()->database);
    }

    public function setDatabase($db){
        $this->_database=$db;
    }

    public function getDatabase(){
        return $this->_database;
    }
}

$test=new Test();
var_dump($test->getDatabase());


regards,

Jean-Baptiste Verrey



On 31 October 2011 21:32, robert mena <robert.mena@xxxxxxxxx> wrote:

> Hi,
>
> I am trying to avoid reinventing the wheel so I am looking for
> dependency injection containers that work with PHP 5.2.  So Symphony2
> and ZF2 DI are out of question.
>
> I found this
> http://www.potstuck.com/2010/09/09/php-dependency-a-php-dependency-injection-framework/
>  but I was wondering if anyone has a opinion about it or alternatives.
>
> regards.
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>

[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux