Nunca vi um código como este:
public static function getInstance()
{
if ( ! isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
É o mesmo que new className()
?
EDITAR
Se a classe for hereditária, para qual classe ela aponta?
Respostas:
self
aponta para a classe em que está escrito.Portanto, se o método getInstance estiver em um nome de classe
MyClass
, a seguinte linha:Fará o mesmo que:
Edit: mais algumas informações, após os comentários.
Se você tiver duas classes que se estendem, você terá duas situações:
getInstance
é definido na classe filhagetInstance
é definido na classe paiA primeira situação ficaria assim (removi todo o código não necessário, para este exemplo - você terá que adicioná-lo de volta para obter o comportamento do singleton) *:
Aqui, você obterá:
O que significa
self
significaMyChildClass
- ou seja, a classe em que está escrito.Para a segunda situação, o código seria assim:
E você obteria este tipo de saída:
O que significa
self
significaMyParentClass
- ou seja, aqui também, a classe em que está escrito .Com o PHP <5.3, que "a classe na qual está escrito" é importante - e às vezes pode causar problemas.
É por isso que o PHP 5.3 introduz um novo uso para a
static
palavra-chave: agora ela pode ser usada exatamente onde usamosself
nesses exemplos:Mas, em
static
vez deself
, você agora obterá:O que significa que
static
isso aponta para a classe que é usada (nós usamosMyChildClass::getInstance()
), e não para aquela em que está escrita.Claro, o comportamento do
self
não foi alterado, para não quebrar os aplicativos existentes - o PHP 5.3 acabou de adicionar um novo comportamento, reciclando astatic
palavra - chave.E, falando sobre PHP 5.3, você pode querer dar uma olhada na página Late Static Bindings do manual do PHP.
fonte
baseclass
,class
que se faz isso aponta para?self
herança; e também incluí algumas informações sobrestatic
no PHP 5.3 ;; espero que isso ajude :-)Esta parece ser uma implementação do padrão Singleton . A função é chamada estaticamente e verifica se a classe estática tem a variável
$_instance
definida.Se não for, ele inicializa uma instância de si mesmo (
new self()
) e a armazena em$_instance
.Se você chamar
className::getInstance()
, obterá uma e a mesma instância de classe em todas as chamadas, que é o ponto do padrão singleton.Eu nunca vi isso ser feito dessa forma, porém, e honestamente não sabia que era possível. O que é
$_instance
declarado na classe?fonte
$_instance
é declarado comopublic static $_instance;
Isso é mais provavelmente usado no padrão de design singleton, em que o construtor é definido como privado para evitar ser instanciado, o
(::)
operador de dois pontos duplos pode acessar membros que são declarados estáticos dentro da classe, portanto, se houver membros estáticos, a pseudo variável $ isso não pode ser usado, portanto, o código usado self em vez disso. Singletons são boas práticas de programação que permitirão apenas 1 instância de um objeto como manipuladores de conector de banco de dados. A partir do código do cliente, o acesso a essa instância seria feito através da criação de um único ponto de acesso, neste caso ele o nomeougetInstance()
, O getInstance em si foi a função que criou o objeto basicamente usando a nova palavra-chave para criar um objeto, o que significa que o método construtor foi também chamado.a linha
if(!isset(self::instance))
verifica se um objeto já foi criado, você não pode entender isso porque o código é apenas um fragmento, em algum lugar no topo, deve haver membros estáticos como provavelmenteem classes normais, teríamos acessado este membro simplesmente
mas é declarado como estático e, portanto, não podemos usar o código $ this que usamos
verificando se há um objeto armazenado nesta variável de classe estática, a classe pode então decidir criar ou não criar uma única instância, portanto, se não estiver definido,! isset, o que significa que nenhum objeto existe no membro estático $ _instance, então ele gera um novo objeto, armazenado no membro estático
$_instance
pelo comandoe o devolveu ao código do cliente. O código do cliente pode então usar alegremente a única instância do objeto com seus métodos públicos, mas no código do cliente, chamando o único ponto de acesso, ou seja, o
getInstance()
método também é complicado, tem que ser chamado assima razão, a função em si é declarada estática.
fonte
Sim, é como
new className()
(referindo-se à classe que contém esse método), provavelmente usado em um padrão Singleton onde o construtor é privado.fonte
Se a classe for herdada, chamar getInstance () de child não fornecerá uma instância de child. Ele retornará apenas uma instância da instância pai. Isso ocorre porque chamamos de novo self ().
Se você quiser que a classe filha retorne uma instância da classe filha, use new static () em getInstance () e ela retornará a instância da classe filha. Isso é chamado de ligação tardia !!
fonte