Last active
July 20, 2017 13:56
-
-
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
This file contains 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 | |
# 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 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.
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
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? 🤔