Necesito crear una clase inmutable que sea simplemente un contenedor de campo miembro. Quiero que sus campos sean instanciados una vez en su constructor (los valores deben darse como parámetros para el constructor). Quiero que los campos sean públicos pero inmutables. Pude haberlo hecho con Java usando la palabra clave final
antes de cada campo. ¿Cómo se hace en PHP?PHP: campos de miembros públicos inmutables
10
A
Respuesta
16
Debe utilizar __set
y __get
métodos mágicos y declarar que la propiedad protegido o privado:
class Example
{
private $value;
public function __construct()
{
$this->value = "test";
}
public function __get($key)
{
if (property_exists($this, $key)) {
return $this->{$key};
} else {
return null; // or throw an exception
}
}
public function __set($key, $value)
{
return; // or throw an exception
}
}
Uso:
$example = new Example();
var_dump($example->value);
$example->value = "invalid";
var_dump($example->value);
Salida:
string(4) "test"
string(4) "test"
2
Puede usar el método mágico __set()
y lanzar una excepción cuando alguien intenta establecer una propiedad directamente.
class ClassName {
public function __set($key, $value) {
throw new Exception('Can't modify property directly.');
}
}
Sin embargo, esto evitaría la modificación de las propiedades independientemente de si son públicas o no.
2
por lo que se puede hacer mejor - si tiene un recuento Dinamyc de campos
class ClassName {
private $fields = array();
// use class : $cl = new ClassName(array('f'=>2,'field_4'=>5,''12));
// echo $cl->field_4; echo $cl->f;
public function __construct($data= array())
{
if (!is_array($data) || !count($data)) throw new Exception('Not enough args')
foreach ($data as $key=>$val)
{
if (is_numeric($key))
$this->fields['field_'.$key] = $val;
else
$this->fields[$key] = $val;
}
}
/* in this case you can use this class like $cl = new ClassName(12,14,13,15,12); echo $cl->field_1;
public function __construct()
{
$ata = funcs_get_args();
if (!count($data)) throw new Exception('Not enough args')
foreach ($data as $key=>$val)
{
if (is_numeric($key))
$this->fields['field_'.$key] = $val;
else
$this->fields[$key] = $val;
}
}
*/
public function __get($var) {
if (isset($this->fields[$var]))
return $this->fields[$var];
return false;
//or throw new Exception ('Undeclared property');
}
}
+4
'__set' no recibe llamadas para propiedades públicas – sanmai
Cuestiones relacionadas
- 1. Accesodores contra miembros públicos
- 2. ¿Funciona el uso de campos públicos de solo lectura para estructuras inmutables?
- 3. Campos públicos frente a propiedades automáticas
- 4. Acceso a miembros de datos de plantilla heredados públicos
- 5. Cómo probar campos privados que se modifican mediante métodos públicos
- 6. Campos de miembros, orden de construcción
- 7. ¿Por qué definir miembros privados debajo de miembros públicos en C++?
- 8. Métodos que utilizan miembros privados o accesadores públicos
- 9. Miembros públicos e internos en una clase interna?
- 10. .NET: Acceder a miembros no públicos desde un ensamblaje dinámico
- 11. Orden de campos miembros en Enum
- 12. Uso de campos públicos en Play Framework 2.0
- 13. Acceder a dejar los campos vinculados de los miembros estáticos
- 14. Método para llamar a miembros o métodos públicos/privados. Buenas prácticas: C# .NET
- 15. Ignorar los campos públicos/internos para el proxy NHibernate
- 16. objetos inmutables Scala y rasgos con val campos
- 17. ¿Debo usar propiedades públicas y campos privados o campos públicos para los datos?
- 18. ¿Por qué querría uno usar los constructores públicos en Boolean y clases inmutables similares?
- 19. Serialización y objetos inmutables
- 20. Obteniendo los campos públicos (y sus respectivos valores) de una instancia en Scala/Java
- 21. ¿Es una mala práctica de programación tener miembros "públicos" dentro de una clase "interna"?
- 22. ¿Cómo obtener el valor de los miembros no públicos de picturebox?
- 23. Acceso a miembros públicos de solo lectura de estructuras en ensambles externos
- 24. Métodos estáticos públicos vs métodos públicos
- 25. En Java, ¿es una mala idea hacer públicos los miembros de un objeto?
- 26. ¿Cómo expongo los argumentos del constructor de Scala como miembros públicos?
- 27. ¿Qué hace que los miembros de la instancia sean inseguros frente a públicos estáticos?
- 28. Visibilidad predeterminada para clases C# y miembros (campos, métodos, etc.)?
- 29. Cómo ocultar los métodos públicos de IntelliSense
- 30. Frijoles inmutables en Java
Esto no es posible en PHP. – Sjoerd
¿Por qué los campos deben ser públicos? – Pete171
@ pete171 probablemente sean solo de lectura – fbstj