Estoy construyendo una clase de usuario para mi nuevo sitio web, sin embargo, esta vez estaba pensando en hacerlo un poco diferente ...
C ++ , Java e incluso Ruby (y probablemente otros lenguajes de programación) están permitiendo el uso de clases anidadas / internas dentro de la clase principal, lo que nos permite hacer que el código esté más orientado a objetos y organizado.
En PHP, me gustaría hacer algo como esto:
<?php
public class User {
public $userid;
public $username;
private $password;
public class UserProfile {
// some code here
}
private class UserHistory {
// some code here
}
}
?>
¿Es eso posible en PHP? ¿Cómo puedo lograrlo?
ACTUALIZAR
Si es imposible, ¿las futuras versiones de PHP admitirán clases anidadas?
User
, ejemplo:public class UserProfile extends User
ypublic class UserHestory extends User
.Respuestas:
Introducción:
Las clases anidadas se relacionan con otras clases de manera un poco diferente a las clases externas. Tomando Java como ejemplo:
Las clases anidadas no estáticas tienen acceso a otros miembros de la clase adjunta, incluso si se declaran privadas. Además, las clases anidadas no estáticas requieren una instancia de la clase principal para crear una instancia.
Hay varias razones de peso para usarlos:
En PHP
Puede tener un comportamiento similar en PHP sin clases anidadas.
Si todo lo que desea lograr es estructura / organización, como Package.OuterClass.InnerClass, los espacios de nombres PHP pueden ser suficientes. Incluso puede declarar más de un espacio de nombres en el mismo archivo (aunque, debido a las características estándar de carga automática, eso podría no ser aconsejable).
Si desea emular otras características, como la visibilidad de los miembros, se necesita un poco más de esfuerzo.
Definición de la clase "paquete"
Caso de uso
Pruebas
Salida:
NOTA:
Realmente no creo que tratar de emular innerClasses en PHP sea una buena idea. Creo que el código es menos limpio y legible. Además, probablemente haya otras formas de lograr resultados similares utilizando un patrón bien establecido, como el patrón Observador, Decorador o Colocación. A veces, incluso la simple herencia es suficiente.
fuente
Las clases anidadas reales con
public
/protected
/private
accesibilidad se propusieron en 2013 para PHP 5.6 como un RFC, pero no lo lograron (aún no se votó, no se actualizó desde 2013, a partir del 29/12/2016 ):https://wiki.php.net/rfc/nested_classes
Al menos, las clases anónimas llegaron a PHP 7
https://wiki.php.net/rfc/anonymous_classes
Desde esta página de RFC:
Por lo tanto, podríamos obtener clases anidadas en alguna versión futura, pero aún no está decidido.
fuente
No puede hacer esto en PHP. Sin embargo, existen formas funcionales de lograrlo.
Para obtener más detalles, consulte esta publicación: ¿Cómo hacer una clase anidada PHP o métodos anidados?
Esta forma de implementación se llama interfaz fluida: http://en.wikipedia.org/wiki/Fluent_interface
fuente
Desde PHP versión 5.4, puede forzar la creación de objetos con constructor privado a través de la reflexión. Se puede utilizar para simular clases anidadas de Java. Código de ejemplo:
fuente
Según el comentario de Xenon a la respuesta de Anıl Özselgin, las clases anónimas se han implementado en PHP 7.0, que es lo más parecido a las clases anidadas que obtendrá en este momento. Aquí están las RFC relevantes:
Clases anidadas (estado: retirado)
Clases anónimas (estado: implementado en PHP 7.0)
Un ejemplo de la publicación original, así es como se vería su código:
Sin embargo, esto viene con una advertencia muy desagradable. Si usa un IDE como PHPStorm o NetBeans, y luego agrega un método como este a la
User
clase:... adiós autocompletado. Este es el caso incluso si codifica en interfaces (la I en SOLID), usando un patrón como este:
A menos que sus únicas llamadas a
$this->profile
sean desde el__construct()
método (o cualquier método en el que$this->profile
esté definido), no obtendrá ningún tipo de sugerencia de tipo. Su propiedad está esencialmente "oculta" para su IDE, lo que le hace la vida muy difícil si confía en su IDE para la finalización automática, la detección de olores de código y la refactorización.fuente
No puedes hacerlo en PHP. PHP admite "incluir", pero ni siquiera puede hacerlo dentro de una definición de clase. No hay muchas buenas opciones aquí.
Esto no responde a su pregunta directamente, pero puede estar interesado en "espacios de nombres", una \ sintaxis \ pirateada \ en \ top \ de PHP OOP terriblemente fea: http://www.php.net/manual/en/language .namepaces.rationale.php
fuente
Está esperando la votación como RFC https://wiki.php.net/rfc/anonymous_classes
fuente
Creo que escribí una elegante solución a este problema usando espacios de nombres. En mi caso, la clase interna no necesita conocer su clase principal (como la clase interna estática en Java). Como ejemplo, hice una clase llamada 'Usuario' y una subclase llamada 'Tipo', utilizada como referencia para los tipos de usuario (ADMIN, OTROS) en mi ejemplo. Saludos.
User.php (archivo de clase de usuario)
Using.php (Un ejemplo de cómo llamar a la 'subclase')
fuente
Puede, así, en PHP 7:
fuente
Coloque cada clase en archivos separados y "solicítelos".
User.php
UserProfile.php
UserHistory.php
fuente