Skip to content

Instantly share code, notes, and snippets.

@githubnando
Last active July 20, 2017 13:56
Show Gist options
  • Save githubnando/bf231702b02e85e0eb25869cdae4f9a7 to your computer and use it in GitHub Desktop.
Save githubnando/bf231702b02e85e0eb25869cdae4f9a7 to your computer and use it in GitHub Desktop.
Returns each time called the same instance using functions, not methods in OOP
<?php
# Returns each time called the same instance using functions, not methods in OOP
if ( ! function_exists('logger')) {
function logger() {
static $logger;
if ( ! $logger) {
$logger = new Logger('starlight');
}
return $logger;
}
}
# Instance #5
logger()->info('I\'ll be chasing a Starlight, until the end of my life');
# Instance #5
logger()->warning('Far away');
# Instance #5
logger()->critical('From the people who cares if i live or die');
@jmurowaniecki
Copy link

O static não fica declarado em escopo global, nesse caso ele reinstancia o Logger a cada chamado da função.. Era pra ser isso? 🤔

@githubnando
Copy link
Author

githubnando commented Jul 20, 2017

@jmurowaniecki Não, independemente de quem a invoca ou em qual escopo, a função "lembra" o valor da variável $logger a cada chamada por causa do static, e por causa daquele IF sempre será a mesma instância retornada, nunca uma nova (veja abaixo).

Achei uma solução diferente e muito simples pra ser obter um Singleton no PHP, sempre ví as pessoas usando herança, métodos estáticos, etc.. Acabo preferindo usar uma função com static por causa da simplicidade.

selection_323

Tens algum caso de uso em que ele reinstacia, usando o exemplo da imagem (código abaixo)?

if ( ! function_exists('logger')) {
    function logger() {
        static $logger;
        if ( ! $logger) {
            $logger = new stdClass();
        }
        return $logger;
    }
}

class A { function getInstanceId() { var_dump(logger()); } }
class B { function getInstanceId() { var_dump(logger()); } }

# instance id #1
var_dump(logger());
# instance id #1
var_dump(logger());
# instance id #1
(new A)->getInstanceId();
# instance id #1
(new B)->getInstanceId();

die();

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment