Skip to content

Instantly share code, notes, and snippets.

@mpratt
Last active October 12, 2016 13:47
Show Gist options
  • Select an option

  • Save mpratt/5399005 to your computer and use it in GitHub Desktop.

Select an option

Save mpratt/5399005 to your computer and use it in GitHub Desktop.

Revisions

  1. Michael Pratt revised this gist Apr 16, 2013. 2 changed files with 2 additions and 2 deletions.
    2 changes: 1 addition & 1 deletion dependency1.php
    Original file line number Diff line number Diff line change
    @@ -7,7 +7,7 @@ public function __construct($file) { $this->file = $file; }

    public function log($message)
    {
    $message = date('H:i:s - ') . $message . PHP_EOL;
    $message = date('H:i:s ') . $message . PHP_EOL;
    return file_put_contents($this->file, $message, FILE_APPEND);
    }
    }
    2 changes: 1 addition & 1 deletion dependency4.php
    Original file line number Diff line number Diff line change
    @@ -15,10 +15,10 @@ class Usuario
    }

    $user = new Usuario();
    $user->setLogger(new DatabaseLogger(DSN, USER, PASSWORD));

    if ($user->isLogged())
    {
    $user->setLogger(new DatabaseLogger(DSN, USER, PASSWORD));
    $user->logAction('Se enlogó correctamente');
    }
    ?>
  2. Michael Pratt revised this gist Apr 16, 2013. 1 changed file with 10 additions and 0 deletions.
    10 changes: 10 additions & 0 deletions dependency6.php
    Original file line number Diff line number Diff line change
    @@ -15,4 +15,14 @@ public function __construct()
    $container = new MyContainer();
    $a = $container['a'];
    echo $a->calculate(12345678);

    /**
    * Vale la pena aclarar que Pimple, a diferencia
    * de la mayoria de IoCs, por defecto, siempre crea
    * una instancia nueva del objeto que se pida.
    *
    * Para modificar ese comportamiento, se debe usar
    * el metodo share(); y especificar ahí la construccion
    * de los objetos.
    */
    ?>
  3. Michael Pratt revised this gist Apr 16, 2013. 5 changed files with 30 additions and 195 deletions.
    54 changes: 7 additions & 47 deletions dependency1.php
    Original file line number Diff line number Diff line change
    @@ -1,81 +1,41 @@
    <?php
    /**
    * Clase Logger
    */
    class Logger
    {
    protected $file;
    public function __construct($file) { $this->file = $file; }

    /**
    * Constructor de la clase
    *
    * @param string $file El archivo en donde se va a escribir
    * @return void
    */
    public function __construct($file)
    {
    $this->file = $file;
    }

    /**
    * Metodo para escribir en un archivo
    *
    * @param string $message El mensaje a escribir
    * @return bool
    */
    public function log($message)
    {
    return file_put_contents($this->file, date('H:i:s - ') . $message . PHP_EOL, FILE_APPEND);
    $message = date('H:i:s - ') . $message . PHP_EOL;
    return file_put_contents($this->file, $message, FILE_APPEND);
    }
    }

    /**
    * Clase Usuario
    */

    class Usuario
    {
    protected $logger;

    /**
    * Constructor de la clase
    *
    * @return void
    */

    public function __construct()
    {
    // Estamos instanciando el Logger dentro de la clase
    $this->logger = new Logger('/usuario.log');
    }

    /**
    * Metodo para guardar un mensaje del usuario
    *
    * @param string $message El mensaje a guardar
    * @return bool
    */
    public function logAction($message)
    {
    $name = $this->getUserName();
    return $this->logger->log($name . ': ' . $message);
    }

    // Aquí van un par de métodos más
    ...
    ...
    ...
    ...
    // Haz de cuenta que aquí van un par de métodos más
    }

    /**
    * Así Funcionaría:
    */
    $user = new Usuario();
    if ($user->isLogged())
    {
    ...
    ...
    ...
    ...

    $user->logAction('Se enlogó correctamente');
    }

    85 changes: 10 additions & 75 deletions dependency2.php
    Original file line number Diff line number Diff line change
    @@ -1,102 +1,37 @@
    <?php
    /**
    * Interface ILogger
    */
    // Definimos una interface, con el metodo que
    // es necesario para nuestra clase dependiente.
    interface ILogger
    {
    /**
    * Metodo para escribir en un archivo
    *
    * @param string $message El mensaje a escribir
    * @return bool
    */
    public function log($message);
    }

    /**
    * Clase Logger
    */
    // Implementamos la interface en la dependencia
    class Logger implements ILogger
    {
    protected $file;

    /**
    * Constructor de la clase
    *
    * @param string $file El archivo en donde se va a escribir
    * @return void
    */
    public function __construct($file)
    {
    $this->file = $file;
    }

    /**
    * Metodo para escribir en un archivo
    *
    * @param string $message El mensaje a escribir
    * @return bool
    */
    public function log($message)
    {
    return file_put_contents($this->file, date('H:i:s - ') . $message . PHP_EOL, FILE_APPEND);
    }

    // Basicamente el mismo contenido que en
    // el ejemplo pasado
    }

    /**
    * Clase Usuario
    */
    class Usuario
    {
    protected $logger;

    /**
    * Constructor de la clase
    *
    * @param object ILogger Instancia de objeto que sigue la
    * interface ILogger
    * @return void
    */
    // Usamos el typehint ILogger para forzar que
    // la dependencia debe implementar esa interface.
    public function __construct(ILogger $logger)
    {
    $this->logger = $logger;
    }

    /**
    * Metodo para guardar un mensaje del usuario
    *
    * @param string $message El mensaje a guardar
    * @return bool
    */
    public function logAction($message)
    {
    $name = $this->getUserName();
    return $this->logger->log($name . ': ' . $message);
    }

    // Aquí van un par de métodos más
    ...
    ...
    ...
    ...
    // Haz de cuenta que aquí van un par de métodos más
    }

    /**
    * Así Funcionaría:
    * Notese que la dependencia se esta inyectando
    * desde afuera.
    */

    // Fijate que la dependencia se esta inyectando desde afuera.
    $user = new Usuario(new Logger('/archivo.log'));
    if ($user->isLogged())
    {
    ...
    ...
    ...
    ...

    $user->logAction('Se enlogó correctamente');
    $user->logAction('Se enlogó correctamente');
    }

    ?>
    51 changes: 3 additions & 48 deletions dependency3.php
    Original file line number Diff line number Diff line change
    @@ -1,74 +1,29 @@
    <?php
    /**
    * Interface ILogger
    */
    interface ILogger
    {
    /**
    * Metodo para escribir en un archivo
    *
    * @param string $message El mensaje a escribir
    * @return bool
    */
    public function log($message);
    }

    /**
    * Clase Logger
    */
    // Esta nueva clase implementa la interface ILogger
    class DatabaseLogger implements ILogger
    {

    /**
    * Constructor de la clase
    *
    * @param string $dsn
    * @param string $user
    * @param string $password
    * @return void
    */
    public function __construct($dsn, $user, $password)
    {
    $this->pdo = new PDO($dsn, $user, $password)
    $this->pdo = new PDO($dsn, $user, $password);
    }

    /**
    * Metodo para escribir en un archivo
    *
    * @param string $message El mensaje a escribir
    * @return bool
    */
    public function log($message)
    {
    $stmt = $this->pdo->prepare('INSERT INTO table (date, message) VALUES (?,?)');
    return $stmt->execute(array(date('H:i:s'), $message));
    }

    }

    class Usuario
    {
    ...
    ...
    ...
    }

    /**
    * Así Funcionaría:
    * Notese que con facilidad se puede intercambiar la dependencia
    * mira con que facilidad se puede intercambiar la dependencia
    * siempre y cuando el nuevo objeto siga la interface pactada.
    */

    $databaseLogger = new DatabaseLogger(DSN, USER, PASSWORD);
    $user = new Usuario($databaseLogger);
    if ($user->isLogged())
    {
    ...
    ...
    ...
    ...

    $user->logAction('Se enlogó correctamente');
    }

    ?>
    26 changes: 6 additions & 20 deletions dependency4.php
    Original file line number Diff line number Diff line change
    @@ -3,36 +3,22 @@ class Usuario
    {
    protected $logger;

    /**
    * Usado para inyectar el objeto Logger
    *
    * @param object ILogger Instancia de objeto que sigue la
    * interface ILogger
    * @return void
    */
    public setLogger(ILogger $logger)
    // Ahora no usamos el constructor, sino que definimos
    // un metodo para la inyección.
    public setLogger(ILogger $logger)
    {
    $this->logger = $logger;
    $this->logger = $logger;
    }


    // Aquí van un par de métodos más
    ...
    ...
    ...
    ...
    // Haz de cuenta que aquí van un par de métodos más
    }

    $user = new Usuario();
    $user->setLogger(new DatabaseLogger(DSN, USER, PASSWORD));

    if ($user->isLogged())
    {
    ...
    ...
    ...
    ...

    $user->logAction('Se enlogó correctamente');
    }

    ?>
    9 changes: 4 additions & 5 deletions dependency6.php
    Original file line number Diff line number Diff line change
    @@ -5,15 +5,14 @@ class MyContainer extends Pimple
    {
    public function __construct()
    {
    $this['c'] = new C();
    $this['d'] = new D();
    $this['b'] = new B($this['c'], $this['d']);
    $this['a'] = new A($this['b']);
    $this['c'] = function () { return new C(); };
    $this['d'] = function () { return new D(); };
    $this['b'] = function ($c) { return new B($c['c'], $c['d']); };
    $this['a'] = function ($c) { return new A($c['b']); };
    }
    }

    $container = new MyContainer();
    $a = $container['a'];
    echo $a->calculate(12345678);

    ?>
  4. Michael Pratt revised this gist Apr 16, 2013. No changes.
  5. Michael Pratt revised this gist Apr 16, 2013. No changes.
  6. Michael Pratt revised this gist Apr 16, 2013. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion dependency3.php
    Original file line number Diff line number Diff line change
    @@ -40,7 +40,7 @@ public function __construct($dsn, $user, $password)
    */
    public function log($message)
    {
    $stmt = $this->pdo->prepare('INSERT INTO table (message, date) VALUES (?,?)');
    $stmt = $this->pdo->prepare('INSERT INTO table (date, message) VALUES (?,?)');
    return $stmt->execute(array(date('H:i:s'), $message));
    }

  7. Michael Pratt created this gist Apr 16, 2013.
    82 changes: 82 additions & 0 deletions dependency1.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,82 @@
    <?php
    /**
    * Clase Logger
    */
    class Logger
    {
    protected $file;

    /**
    * Constructor de la clase
    *
    * @param string $file El archivo en donde se va a escribir
    * @return void
    */
    public function __construct($file)
    {
    $this->file = $file;
    }

    /**
    * Metodo para escribir en un archivo
    *
    * @param string $message El mensaje a escribir
    * @return bool
    */
    public function log($message)
    {
    return file_put_contents($this->file, date('H:i:s - ') . $message . PHP_EOL, FILE_APPEND);
    }
    }

    /**
    * Clase Usuario
    */
    class Usuario
    {
    protected $logger;

    /**
    * Constructor de la clase
    *
    * @return void
    */
    public function __construct()
    {
    $this->logger = new Logger('/usuario.log');
    }

    /**
    * Metodo para guardar un mensaje del usuario
    *
    * @param string $message El mensaje a guardar
    * @return bool
    */
    public function logAction($message)
    {
    $name = $this->getUserName();
    return $this->logger->log($name . ': ' . $message);
    }

    // Aquí van un par de métodos más
    ...
    ...
    ...
    ...
    }

    /**
    * Así Funcionaría:
    */
    $user = new Usuario();
    if ($user->isLogged())
    {
    ...
    ...
    ...
    ...

    $user->logAction('Se enlogó correctamente');
    }

    ?>
    102 changes: 102 additions & 0 deletions dependency2.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,102 @@
    <?php
    /**
    * Interface ILogger
    */
    interface ILogger
    {
    /**
    * Metodo para escribir en un archivo
    *
    * @param string $message El mensaje a escribir
    * @return bool
    */
    public function log($message);
    }

    /**
    * Clase Logger
    */
    class Logger implements ILogger
    {
    protected $file;

    /**
    * Constructor de la clase
    *
    * @param string $file El archivo en donde se va a escribir
    * @return void
    */
    public function __construct($file)
    {
    $this->file = $file;
    }

    /**
    * Metodo para escribir en un archivo
    *
    * @param string $message El mensaje a escribir
    * @return bool
    */
    public function log($message)
    {
    return file_put_contents($this->file, date('H:i:s - ') . $message . PHP_EOL, FILE_APPEND);
    }

    }

    /**
    * Clase Usuario
    */
    class Usuario
    {
    protected $logger;

    /**
    * Constructor de la clase
    *
    * @param object ILogger Instancia de objeto que sigue la
    * interface ILogger
    * @return void
    */
    public function __construct(ILogger $logger)
    {
    $this->logger = $logger;
    }

    /**
    * Metodo para guardar un mensaje del usuario
    *
    * @param string $message El mensaje a guardar
    * @return bool
    */
    public function logAction($message)
    {
    $name = $this->getUserName();
    return $this->logger->log($name . ': ' . $message);
    }

    // Aquí van un par de métodos más
    ...
    ...
    ...
    ...
    }

    /**
    * Así Funcionaría:
    * Notese que la dependencia se esta inyectando
    * desde afuera.
    */

    $user = new Usuario(new Logger('/archivo.log'));
    if ($user->isLogged())
    {
    ...
    ...
    ...
    ...

    $user->logAction('Se enlogó correctamente');
    }

    ?>
    74 changes: 74 additions & 0 deletions dependency3.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,74 @@
    <?php
    /**
    * Interface ILogger
    */
    interface ILogger
    {
    /**
    * Metodo para escribir en un archivo
    *
    * @param string $message El mensaje a escribir
    * @return bool
    */
    public function log($message);
    }

    /**
    * Clase Logger
    */
    class DatabaseLogger implements ILogger
    {

    /**
    * Constructor de la clase
    *
    * @param string $dsn
    * @param string $user
    * @param string $password
    * @return void
    */
    public function __construct($dsn, $user, $password)
    {
    $this->pdo = new PDO($dsn, $user, $password)
    }

    /**
    * Metodo para escribir en un archivo
    *
    * @param string $message El mensaje a escribir
    * @return bool
    */
    public function log($message)
    {
    $stmt = $this->pdo->prepare('INSERT INTO table (message, date) VALUES (?,?)');
    return $stmt->execute(array(date('H:i:s'), $message));
    }

    }

    class Usuario
    {
    ...
    ...
    ...
    }

    /**
    * Así Funcionaría:
    * Notese que con facilidad se puede intercambiar la dependencia
    * siempre y cuando el nuevo objeto siga la interface pactada.
    */

    $databaseLogger = new DatabaseLogger(DSN, USER, PASSWORD);
    $user = new Usuario($databaseLogger);
    if ($user->isLogged())
    {
    ...
    ...
    ...
    ...

    $user->logAction('Se enlogó correctamente');
    }

    ?>
    38 changes: 38 additions & 0 deletions dependency4.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,38 @@
    <?php
    class Usuario
    {
    protected $logger;

    /**
    * Usado para inyectar el objeto Logger
    *
    * @param object ILogger Instancia de objeto que sigue la
    * interface ILogger
    * @return void
    */
    public setLogger(ILogger $logger)
    {
    $this->logger = $logger;
    }


    // Aquí van un par de métodos más
    ...
    ...
    ...
    ...
    }

    $user = new Usuario();
    $user->setLogger(new DatabaseLogger(DSN, USER, PASSWORD));
    if ($user->isLogged())
    {
    ...
    ...
    ...
    ...

    $user->logAction('Se enlogó correctamente');
    }

    ?>
    48 changes: 48 additions & 0 deletions dependency5.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,48 @@
    <?php

    interface IObjectB { public function calculate($value); }
    interface IObjectC { public function convert($value); }
    interface IObjectD { public function hash($value); }


    class A
    {
    protected $b;
    public function __construct(IObjectB $b) { $this->b = $b; }
    public function calculate($value)
    {
    return $this->b->calculate($value);
    }
    }

    class B implements IObjectB
    {
    protected $c, $d;
    public function __construct(IObjectC $c, IObjectD $d)
    {
    $this->c = $c;
    $this->d = $d;
    }

    public function calculate($value)
    {
    $value = $this->c->convert($value);
    return $this->d->hash($value);
    }
    }

    class C implements IObjectC
    {
    public function convert($value) { return intval($value); }
    }

    class D implements IObjectD
    {
    public function hash($value) { return md5($value); }
    }

    $b = new B(new C(), new D());
    $a = new A($b);

    echo $a->calculate(12345678);
    ?>
    19 changes: 19 additions & 0 deletions dependency6.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,19 @@
    <?php
    require('Pimple.php');

    class MyContainer extends Pimple
    {
    public function __construct()
    {
    $this['c'] = new C();
    $this['d'] = new D();
    $this['b'] = new B($this['c'], $this['d']);
    $this['a'] = new A($this['b']);
    }
    }

    $container = new MyContainer();
    $a = $container['a'];
    echo $a->calculate(12345678);

    ?>