Estou criando uma classe de usuário para meu novo site, mas desta vez eu estava pensando em criá-la de forma um pouco diferente ...
C ++ , Java e até Ruby (e provavelmente outras linguagens de programação) estão permitindo o uso de classes aninhadas / internas dentro da classe principal, o que nos permite tornar o código mais orientado a objetos e organizado.
Em PHP, gostaria de fazer algo assim:
<?php
public class User {
public $userid;
public $username;
private $password;
public class UserProfile {
// some code here
}
private class UserHistory {
// some code here
}
}
?>
Isso é possível em PHP? Como posso conseguir isso?
ATUALIZAR
Se for impossível, as futuras versões do PHP podem suportar classes aninhadas?
User
, por exemplo:public class UserProfile extends User
epublic class UserHestory extends User
.Respostas:
Introdução:
As classes aninhadas se relacionam com outras classes de maneira um pouco diferente das classes externas. Tomando Java como exemplo:
As classes aninhadas não estáticas têm acesso a outros membros da classe envolvente, mesmo se forem declarados privados. Além disso, as classes aninhadas não estáticas requerem que uma instância da classe pai seja instanciada.
Existem vários motivos convincentes para usá-los:
Em PHP
Você pode ter um comportamento semelhante em PHP sem classes aninhadas.
Se tudo o que você deseja alcançar é estrutura / organização, como Package.OuterClass.InnerClass, namespaces de PHP podem ser suficientes. Você pode até declarar mais de um namespace no mesmo arquivo (embora, devido aos recursos de carregamento automático padrão, isso possa não ser aconselhável).
Se você deseja emular outras características, como a visibilidade dos membros, é preciso um pouco mais de esforço.
Definindo a classe "pacote"
Caso de uso
Testando
Resultado:
NOTA:
Eu realmente não acho que tentar emular innerClasses em PHP seja uma ideia tão boa. Acho que o código é menos limpo e legível. Além disso, provavelmente existem outras maneiras de obter resultados semelhantes usando um padrão bem estabelecido, como o Observer, Decorator ou COmposition Pattern. Às vezes, mesmo uma simples herança é suficiente.
fonte
Classes aninhadas reais com
public
/protected
/private
acessibilidade foram propostas em 2013 para PHP 5.6 como um RFC, mas não conseguiram (nenhuma votação ainda, nenhuma atualização desde 2013 - a partir de 2016/12/29 ):https://wiki.php.net/rfc/nested_classes
Pelo menos, classes anônimas chegaram ao PHP 7
https://wiki.php.net/rfc/anonymous_classes
A partir desta página RFC:
Portanto, podemos obter classes aninhadas em alguma versão futura, mas ainda não está decidido.
fonte
Você não pode fazer isso em PHP. No entanto, existem maneiras funcionais de fazer isso.
Para obter mais detalhes, verifique este post: Como fazer uma classe aninhada de PHP ou métodos aninhados?
Essa forma de implementação é chamada de interface fluente: http://en.wikipedia.org/wiki/Fluent_interface
fonte
Desde a versão 5.4 do PHP você pode forçar a criação de objetos com construtor privado por meio de reflexão. Ele pode ser usado para simular classes Java aninhadas. Código de exemplo:
fonte
De acordo com o comentário de Xenon à resposta de Anil Özselgin, classes anônimas foram implementadas no PHP 7.0, que é o mais próximo das classes aninhadas que você verá agora. Aqui estão os RFCs relevantes:
Classes aninhadas (status: retirado)
Classes anônimas (status: implementado no PHP 7.0)
Um exemplo para a postagem original, esta é a aparência do seu código:
Isso, porém, vem com uma advertência muito desagradável. Se você usar um IDE como PHPStorm ou NetBeans e adicionar um método como este à
User
classe:... tchau tchau autocompletar. Este é o caso mesmo se você codificar para interfaces (o I em SOLID), usando um padrão como este:
A menos que suas únicas chamadas para
$this->profile
sejam do__construct()
método (ou qualquer método$this->profile
definido em), você não obterá qualquer tipo de sugestão de tipo. Sua propriedade está essencialmente "escondida" em seu IDE, tornando a vida muito difícil se você confiar em seu IDE para autocompletar, farejar código e refatorar.fonte
Você não pode fazer isso em PHP. PHP suporta "incluir", mas você não pode fazer isso dentro de uma definição de classe. Não há muitas opções boas aqui.
Isso não responde sua pergunta diretamente, mas você pode estar interessado em "Namespaces", uma sintaxe \ hackeada \ on \ top \ de PHP OOP: http://www.php.net/manual/en/language .namespaces.rationale.php
fonte
Ele está esperando para votar como RFC https://wiki.php.net/rfc/anonymous_classes
fonte
Acho que escrevi uma solução elegante para esse problema usando namespaces. No meu caso, a classe interna não precisa conhecer sua classe pai (como a classe interna estática em Java). Como exemplo fiz uma classe chamada 'User' e uma subclasse chamada 'Type', usada como referência para os tipos de usuário (ADMIN, OTHERS) no meu exemplo. Saudações.
User.php (arquivo de classe de usuário)
Using.php (Um exemplo de como chamar a 'subclasse')
fonte
Você pode, assim, no PHP 7:
fonte
Coloque cada classe em arquivos separados e "solicite".
User.php
UserProfile.php
UserHistory.php
fonte