Eu quero criar uma classe estática em PHP e fazê-la se comportar como em C #, então
- O construtor é chamado automaticamente na primeira chamada da classe
- Não é necessária instanciação
Algo desse tipo ...
static class Hello {
private static $greeting = 'Hello';
private __construct() {
$greeting .= ' There!';
}
public static greet(){
echo $greeting;
}
}
Hello::greet(); // Hello There!
php
design-patterns
oop
static
aleemb
fonte
fonte
Respostas:
Você pode ter classes estáticas no PHP, mas elas não chamam o construtor automaticamente (se você tentar chamar,
self::__construct()
você receberá um erro).Portanto, você teria que criar uma
initialize()
função e chamá-la em cada método:fonte
Therefore you'd have to create an initialize() function and call it in each method:
, seria mais fácil criarinitialize
uma função pública e chamá-la logo após a declaração da classe.__callStatic
, você pode ver se foi inicializado e depois fazerself::$method
ou o que você está chamando. Se ainda estiver chamando o método diretamente, tente alterar tudo para privado e veja lá.Além da resposta de Greg, eu recomendaria definir o construtor como privado para que seja impossível instanciar a classe.
Então, na minha humilde opinião, este é um exemplo mais completo, baseado no de Greg:
fonte
você pode ter essas classes "estáticas". mas suponho que algo realmente importante esteja faltando: no php você não tem um ciclo de aplicativos, para que não obtenha uma estática real (ou singleton) em todo o aplicativo ...
veja Singleton em PHP
fonte
a estrutura de b é chamada de manipulador singeton, você também pode fazê-lo em um
este é o uso singleton
$a = a::getA(...);
fonte
Geralmente, prefiro escrever classes não estáticas regulares e usar uma classe de fábrica para instanciar instâncias únicas (sudo static) do objeto.
Dessa forma, o construtor e o destruidor funcionam normalmente, e eu posso criar instâncias não estáticas adicionais, se desejar (por exemplo, uma segunda conexão com o banco de dados)
Eu uso isso o tempo todo e é especialmente útil para criar manipuladores de sessão personalizados do repositório de banco de dados, pois quando a página termina, o destruidor envia a sessão ao banco de dados.
Outra vantagem é que você pode ignorar a ordem em que chama as coisas, pois tudo será configurado sob demanda.
A classe DB ...
Em qualquer lugar que você quiser usá-lo, basta ligar para ...
Em seguida, trate todos os métodos como não estáticos (porque são)
fonte
O objeto não pode ser definido estático, mas isso funciona
fonte