Nueva pregunta

Pregunta:

Fecha: 26-08-2019 07:07:05 (En Español)

Funcionamiento anómalo en el manejo de los atributos de un objeto.[Resuelta]

Me he topado con un problema con PHP, para lo cual hice un script aislado de mi proyecto para presentar el problema.

Se trata del establecimiento de Atributos que no existen en la clase, y que el objeto los acepta y procesa como tales. Aquí mi ejemplo:
<?php
	class Clase{
		public function __construct(){
		}
		
		public function set($atributo, $contenido){
			$this->{$atributo} = $contenido;
			echo "Agregado el atributo {$atributo} con el valor {$contenido}<br>";
		}
		
		public function ver(){
			$datos = "id = {$this->id} nombre = {$this->nombre} ";
			return $datos;
		}
	}

$ob = new Clase();
$ob->set("id","7");
$ob->set("nombre","José");
$resultado = $ob->ver();

echo $ob->id . "<br>";
echo $ob->nombre . "<br>";
echo $resultado;
?>


Se supone que me debiera arrojar un error pero, lejos de ello, me devuelve los resultados. Estoy utilizando WAMP 3.1.9 con PHP 7.3.5

¿Qué estaré omitiendo?
Etiquetas: PHP Votos: 1 - Respuestas: 2 - Vistas: 7 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 26-08-2019 08:15:29 Hola Victor,
    PHP the permite declarar atributos|propiedades al vuelo.

    Si quieres evitar el funcionamiento y tener más control entonces tienes que implementar los métodos mágicos correspondientes.

    Ejemplo:

    <?php
    
    class Clase
    {
        public $miPropiedad;
    
        public function __construct()
        {
            $this->miPropiedad = 1;
        }
    
        public function set($name, $value) {
            $this->$name = $value;
        }
    
        /**
         * @inheritDoc
         */
        public function __set($name, $value)
        {
            if(!in_array($name, get_object_vars($this), false)) {
                throw new \RuntimeException('Atributo no existente');
            }
            $this->$name = $value;
        }
    
        /**
         * @inheritDoc
         */
        public function __get($name)
        {
            if(!in_array($name, get_object_vars($this), false)) {
                throw new \RuntimeException('Atributo no existente');
            }
    
            return $this->$name;
        }
    
        /**
         * @inheritDoc
         */
        public function __isset($name)
        {
            return isset($this->$name);
        }
    
        /**
         * @inheritDoc
         */
        public function __toString()
        {
            return (string)json_encode($this);
        }
    }
    
    $ob = new Clase();
    try {
        $ob->id = '7';
        $ob->nombre = 'José';
    } catch (\RuntimeException $exception) {
        echo "Falló la asignación directa: {$exception->getMessage()}" . PHP_EOL;
    }
    echo $ob . PHP_EOL;
    
    try {
        $ob->set('id', '7');
        $ob->set('nombre', 'José');
    } catch (\RuntimeException $exception) {
        echo "Falló el método 'set': {$exception->getMessage()}" . PHP_EOL;
    }
    echo $ob . PHP_EOL;
    
    $ob->set('miPropiedad', '3');
    
    echo $ob . PHP_EOL;
    
    $ob->miPropiedad = 7;
    
    echo $ob . PHP_EOL;
    
      Votos: 4 - Link respuesta
     
  • Fecha: 27-08-2019 04:07:17 Vaya! esa nota no la conocía.

    No queda más que validar, como lo presentas.
    Gracias Ernesto.

    Saludos.
      Votos: 1 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com