elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  [Resuelto] PHP toJSON a una clase que extiende de otra.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [Resuelto] PHP toJSON a una clase que extiende de otra.  (Leído 4,176 veces)
Pablo Videla


Desconectado Desconectado

Mensajes: 2.274



Ver Perfil WWW
[Resuelto] PHP toJSON a una clase que extiende de otra.
« en: 9 Septiembre 2015, 16:51 pm »

Hola estimados, tengo una duda respecto a una funcion toJSON que utilizo bastante y lo saque en algun momento en internet pero ahora me surgio un problema:

El siguiente metodo me permite transformar un objeto a json con un solo metodo. Esto lo hice porque cuando tienes atributos privados no lo puedes ver a travès de json_encode($objeto) creo que es un problema de serializacion. Ahora el problema es el siguiente, el metodo me funciona impecable para una clase comun y corriente con sus atributos y getters and setters pero no me muestra los atributos del objeto padre en caso de uqe la clase extienda.


Código
  1. class UsuarioTO extends PersonaTO {
  2.  

Segun yo deberìa mostrarme los atributos de PersonaTO tambien. Pero no se como se hace con el metodo que voy a poner ahora:

Código
  1.  
  2. /**
  3.      * Metodo que nos permite obtener las propiedades
  4.      * de toda la clase.
  5.      * @return type
  6.      */
  7.    public function getProperties() {
  8.        return get_object_vars($this);
  9.    }
  10.  
  11.    /**
  12.      * Nos permite obtener todos los atributos del objeto a json, de esta forma
  13.      * podemos enviar el objeto json por ajax e interactuar con el por javascript
  14.      * @return type JSON OBJECT
  15.      */
  16.    public function _toJson() {
  17.        $properties = $this->getProperties();
  18.        $object = new \StdClass();
  19.        $object->_class = get_class($this);
  20.        foreach ($properties as $name => $value) {
  21.            $object->$name = $value;
  22.        }
  23.        return json_encode($object);
  24.    }


« Última modificación: 12 Septiembre 2015, 13:41 pm por #!drvy » En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: PHP toJSON a una clase que extiende de otra.
« Respuesta #1 en: 9 Septiembre 2015, 17:32 pm »

Pues poner la definición de los constructores y de las propiedades de las clases?


En línea

Pablo Videla


Desconectado Desconectado

Mensajes: 2.274



Ver Perfil WWW
Re: PHP toJSON a una clase que extiende de otra.
« Respuesta #2 en: 9 Septiembre 2015, 17:33 pm »

Pues poner la definición de los constructores y de las propiedades de las clases?

Ohhh.... esto de programar solo en PHP me tiene el cerebro atrofiado... gracias MinusFour!!!! (En java no me pasa esta wea ni cagando)

Un momento... pero si lo tengo!


Código
  1.  public function __construct() {
  2.        parent::__construct();
  3.    }
  4.  
« Última modificación: 9 Septiembre 2015, 17:35 pm por Pablo Videla » En línea

Pablo Videla


Desconectado Desconectado

Mensajes: 2.274



Ver Perfil WWW
Re: PHP toJSON a una clase que extiende de otra.
« Respuesta #3 en: 9 Septiembre 2015, 17:36 pm »

Sorry por el doble post, dejare las definciones de las clases
Clase usuario
Código
  1. <?php
  2.  
  3.  
  4. namespace octavius\controlador\intranet\usuario;
  5.  
  6. /**
  7.  * Clase que representa a un usuario.
  8.  * Extiende persona porque un usuario es una persona.
  9.  *
  10.  * author : Pablo Videla .
  11.  * @email : pablovidelayanez@gmail.com
  12.  *
  13.  */
  14. use octavius\controlador\intranet\persona\PersonaTO;
  15.  
  16. class UsuarioTO extends PersonaTO {
  17.  
  18.    private $idUsuario;
  19.    private $strPassword;
  20.    private $Rol;
  21.    private $strLoginEmail;
  22.  
  23.    public function __construct() {
  24.        parent::__construct();
  25.    }
  26.  
  27.    public function __destruct() {
  28.  
  29.    }
  30.  
  31.    public function getStrPassword() {
  32.        return $this->strPassword;
  33.    }
  34.  
  35.    public function getRol() {
  36.        return $this->Rol;
  37.    }
  38.  
  39.    public function getStrLoginEmail() {
  40.        return $this->strLoginEmail;
  41.    }
  42.  
  43.    public function setStrPassword($strPassword) {
  44.        $this->strPassword = md5($strPassword);
  45.    }
  46.  
  47.    public function setRol($Rol) {
  48.        $this->Rol = $Rol;
  49.    }
  50.  
  51.    public function setStrLoginEmail($strLoginEmail) {
  52.        $this->strLoginEmail = $strLoginEmail;
  53.    }
  54.  
  55.    public function getIdUsuario() {
  56.        return $this->idUsuario;
  57.    }
  58.  
  59.    public function setIdUsuario($idUsuario) {
  60.        $this->idUsuario = $idUsuario;
  61.    }
  62.  
  63.    /**
  64.      * Metodo que nos permite obtener las propiedades
  65.      * de toda la clase.
  66.      * @return type
  67.      */
  68.    public function getProperties() {
  69.        return get_object_vars($this);
  70.    }
  71.  
  72.    /**
  73.      * Nos permite obtener todos los atributos del objeto a json, de esta forma
  74.      * podemos enviar el objeto json por ajax e interactuar con el por javascript
  75.      * @return type JSON OBJECT
  76.      */
  77.    public function _toJson() {
  78.        $properties = $this->getProperties();
  79.        $object = new \StdClass();
  80.        $object->_class = get_class($this);
  81.        foreach ($properties as $name => $value) {
  82.            $object->$name = $value;
  83.        }
  84.        return json_encode($object);
  85.    }
  86.  
  87. }
  88.  
  89. ?>

clase persona

Código
  1. <?php
  2.  
  3. namespace octavius\controlador\intranet\persona;
  4.  
  5. /**
  6.  * @author PabloV
  7.  * @version 1.0
  8.  * @created 07-may-2015 12:39:25
  9.  */
  10. class PersonaTO {
  11.  
  12.    private $idPersona = "";
  13.    private $strNombres = "";
  14.    private $strApellidoPaterno = "";
  15.    private $strApellidoMaterno = "";
  16.    private $strRut = "";
  17.    private $strDv = "";
  18.    private $Empresa = "";
  19.    private $strImagenPersona = "";
  20.  
  21.    public function __construct() {
  22.  
  23.    }
  24.  
  25.    public function __destruct() {
  26.  
  27.    }
  28.  
  29.    public function getStrNombres() {
  30.        return $this->strNombres;
  31.    }
  32.  
  33.    public function getStrApellidoPaterno() {
  34.        return $this->strApellidoPaterno;
  35.    }
  36.  
  37.    public function getStrApellidoMaterno() {
  38.        return $this->strApellidoMaterno;
  39.    }
  40.  
  41.    public function getStrRut() {
  42.        return $this->strRut;
  43.    }
  44.  
  45.    public function getStrDv() {
  46.        return $this->strDv;
  47.    }
  48.  
  49.    /**
  50.      * Devuelve un objeto Empresa con todos sus atributos.
  51.      * @return Empresa
  52.      */
  53.    public function getEmpresa() {
  54.        return $this->Empresa;
  55.    }
  56.  
  57.    public function getStrImagenPersona() {
  58.        return $this->strImagenPersona;
  59.    }
  60.  
  61.    public function setStrNombres($strNombres) {
  62.        $this->strNombres = $strNombres;
  63.    }
  64.  
  65.    public function setStrApellidoPaterno($strApellidoPaterno) {
  66.        $this->strApellidoPaterno = $strApellidoPaterno;
  67.    }
  68.  
  69.    public function setStrApellidoMaterno($strApellidoMaterno) {
  70.        $this->strApellidoMaterno = $strApellidoMaterno;
  71.    }
  72.  
  73.    public function setStrRut($strRut) {
  74.        $eliminarElementos = "/[-][0-9]/";
  75.        $strRut = preg_replace($eliminarElementos, "", $strRut);
  76.        $eliminarElementos = "/[-][k]/";
  77.        $strRut = preg_replace($eliminarElementos, "", $strRut);
  78.        $eliminarElementos = "/[-][K]/";
  79.        $strRut = preg_replace($eliminarElementos, "", $strRut);
  80.        $eliminarElementos = "/[-]/";
  81.        $strRut = preg_replace($eliminarElementos, "", $strRut);
  82.        $eliminarElementos = "/[.]/";
  83.        $strRut = preg_replace($eliminarElementos, "", $strRut);
  84.  
  85.        $multiplicaciones = array();
  86.        $multiplicaciones[0] = 2;
  87.        $multiplicaciones[1] = 3;
  88.        $multiplicaciones[2] = 4;
  89.        $multiplicaciones[3] = 5;
  90.        $multiplicaciones[4] = 6;
  91.        $multiplicaciones[5] = 7;
  92.  
  93.        $formula = "";
  94.        $suma = 0;
  95.        $contadorMultiplo = 0;
  96.        for ($i = strlen($strRut); $i >= 0; $i--) {
  97.            if (isset($strRut[$i])) {
  98.                $formula.=$strRut[$i];
  99.            }
  100.        }
  101.        for ($i = 0; $i < strlen($strRut); $i++) {
  102.            if ($i == count($multiplicaciones)) {
  103.                $contadorMultiplo = 0;
  104.            }
  105.            if (isset($strRut[$i])) {
  106.                $suma = $suma + $multiplicaciones[$contadorMultiplo] * $formula[$i];
  107.            }
  108.            $contadorMultiplo++;
  109.        }
  110.        $resultadoResto = $suma % 11;
  111.        $resultadoDigitoVerificador = 11 - $resultadoResto;
  112.        switch ($resultadoDigitoVerificador) {
  113.            case "11":
  114.                $resultadoDigitoVerificador = 0;
  115.                break;
  116.            case "10":
  117.                $resultadoDigitoVerificador = "k";
  118.                break;
  119.        }
  120.        $this->setStrDv($resultadoDigitoVerificador);
  121.        //echo "El digito verificador es $resultadoDigitoVerificador <br/>";
  122.        // echo "Rut invertido $formula";    
  123.        $this->strRut = (string) $strRut;
  124.    }
  125.  
  126.    public function setStrDv($strDv) {
  127.        $this->strDv = $strDv;
  128.    }
  129.  
  130.    public function setEmpresa($Empresa) {
  131.  
  132.        $this->Empresa = $Empresa;
  133.    }
  134.  
  135.    /**
  136.      * http://carluys.blogspot.cl/2013/01/codificar-imagenes-en-base64-con-php.html
  137.      * @param type $strImagenPersona
  138.      */
  139.    public function setStrImagenPersona($strImagenPersona) {
  140.        /**
  141.          * $img_src = "image/sample.png";  
  142.           $imgbinary = fread(fopen($img_src, "r"), filesize($img_src));
  143.           $img_str = base64_encode($imgbinary);
  144.           echo '<img src="data:image/jpg;base64,'.base64_encode($imgbinary).'" />';
  145.          */
  146.        $this->strImagenPersona = $strImagenPersona;
  147.    }
  148.  
  149.    public function getIdPersona() {
  150.        return $this->idPersona;
  151.    }
  152.  
  153.    public function setIdPersona($idPersona) {
  154.        $this->idPersona = $idPersona;
  155.    }
  156.  
  157.    /**
  158.      * Metodo que nos permite obtener las propiedades
  159.      * de toda la clase.
  160.      * @return type
  161.      */
  162.    public function getProperties() {
  163.        return get_object_vars($this);
  164.    }
  165.  
  166.    /**
  167.      * Nos permite obtener todos los atributos del objeto a json, de esta forma
  168.      * podemos enviar el objeto json por ajax e interactuar con el por javascript
  169.      * ---
  170.      * Se agrega una validacion que nos permite identificar si el valor a  agregar es un Objeto
  171.      * independiente, si es así, entonces esa propiedad se convierte a json de forma completa.
  172.      * if(is_object($value)){
  173.       $object->$name=$value->_toJSON(); <----- aqui.
  174.       }else{
  175.       $object->$name = $value; <--- Originalmente solo estaba esto.
  176.       }
  177.      *
  178.      * @return type JSON OBJECT
  179.      */
  180.    public function _toJson() {
  181.        $properties = $this->getProperties();
  182.        $object = new \StdClass();
  183.        $object->_class = get_class($this);
  184.        foreach ($properties as $name => $value) {
  185.            if (is_object($value)) {
  186.                $object->$name = $value->_toJson();
  187.            } else {
  188.                $object->$name = $value;
  189.            }
  190.        }
  191.        return json_encode($object);
  192.    }
  193.  
  194. }
  195.  
  196. ?>

Ojo que estan en construccion xD
En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: PHP toJSON a una clase que extiende de otra.
« Respuesta #4 en: 9 Septiembre 2015, 17:38 pm »

Quizás:

Código
  1. $properties = get_class_vars(get_class($this));

¿Sea mas apropiado? No estoy muy seguro pero creo que get_obj_vars() solo regresa propiedades que el objeto tiene inicializadas.
En línea

Pablo Videla


Desconectado Desconectado

Mensajes: 2.274



Ver Perfil WWW
Re: PHP toJSON a una clase que extiende de otra.
« Respuesta #5 en: 9 Septiembre 2015, 17:41 pm »

Quizás:

Código
  1. $properties = get_class_vars(get_class($this));

¿Sea mas apropiado? No estoy muy seguro pero creo que get_obj_vars() solo regresa propiedades que el objeto tiene inicializadas.

Eso solo me retorna las propiedades de la clase UsuarioTO y en nulo, en cambio en la version original solo me entrega las propiedades del UsuarioTO pero con los valores seteados como corresponde.
En línea

moikano→@


Desconectado Desconectado

Mensajes: 572


Cultiva tu mente y cuerpo, son tu única propiedad


Ver Perfil WWW
Re: PHP toJSON a una clase que extiende de otra.
« Respuesta #6 en: 9 Septiembre 2015, 17:46 pm »

Y algo así?

Código
  1.    $properties = get_class_vars(get_class(parent));

No lo he probado.
En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: PHP toJSON a una clase que extiende de otra.
« Respuesta #7 en: 9 Septiembre 2015, 17:48 pm »

Eso solo me retorna las propiedades de la clase UsuarioTO y en nulo, en cambio en la version original solo me entrega las propiedades del UsuarioTO pero con los valores seteados como corresponde.

Cuando llamas a _toJson() ya tienes inicializadas las variables en el objeto? (i.e. llamaste a los setters?) Si haces:

Código

Te regresa las propiedades con strings vacios?

Creo que deberia funcionar tal y como lo tienes al principio si haces esto:

Código
  1. class PersonaTO {
  2.  
  3.    private $idPersona;
  4.    private $strNombres;
  5.    private $strApellidoPaterno;
  6.    private $strApellidoMaterno;
  7.    private $strRut;
  8.    private $strDv;
  9.    private $Empresa
  10.    private $strImagenPersona;
  11.  
  12.    public function __construct() {
  13.      $this->idPersona = '';
  14.      $this->strNombres = '';
  15.      $this->strApellidoPaterno = '';
  16.      $this->strApellidoMaterno = '';
  17.      $this->strRut = '';
  18.      $this->strDv = '';
  19.      $this->Empresa = '';
  20.      $this->strImagenPersona = '';
  21.    }
  22.   ..
  23.  
  24. }

Porque esto debe asignar las propiedades al objeto en lugar de mirar la definición de la clase, pero no estoy muy seguro del modelo de objetos de PHP.
« Última modificación: 9 Septiembre 2015, 17:59 pm por MinusFour » En línea

Pablo Videla


Desconectado Desconectado

Mensajes: 2.274



Ver Perfil WWW
Re: PHP toJSON a una clase que extiende de otra.
« Respuesta #8 en: 9 Septiembre 2015, 18:02 pm »

...


probaré lo que me dices. Acabo de salir a comer ajjaj gracias. Te digo cualquier cosa!



...
lo pruebo apenas llegue, gracias !


Mod: No hacer doble post.

« Última modificación: 12 Septiembre 2015, 13:38 pm por #!drvy » En línea

Pablo Videla


Desconectado Desconectado

Mensajes: 2.274



Ver Perfil WWW
Re: PHP toJSON a una clase que extiende de otra.
« Respuesta #9 en: 9 Septiembre 2015, 19:43 pm »

...

Hice lo que me dijiste

Código
  1. $properties = get_class_vars(get_class());

y puse en el constructor de persona

Código
  1. public function __construct() {
  2.      $this->idPersona = '';
  3.      $this->strNombres = '';
  4.      $this->strApellidoPaterno = '';
  5.      $this->strApellidoMaterno = '';
  6.      $this->strRut = '';
  7.      $this->strDv = '';
  8.      $this->Empresa = '';
  9.      $this->strImagenPersona = '';
  10.    }

Pero ahora solo me arroja el nombre de la clase sin las propiedades, y ojo que seteo las propiedades como corresponde, con los setter y todo lo que eso significa.



...

Lo probe y solo me arroja el nombre de la clase.


Mod: No hacer doble post.
« Última modificación: 12 Septiembre 2015, 13:39 pm por #!drvy » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines