{"id":1132,"date":"2012-07-23T18:47:40","date_gmt":"2012-07-23T18:47:40","guid":{"rendered":"http:\/\/www.palentino.es\/blog\/?p=1132"},"modified":"2012-07-23T18:54:18","modified_gmt":"2012-07-23T18:54:18","slug":"ventajas-de-la-utilizacion-de-clases-en-php-caso-practico","status":"publish","type":"post","link":"https:\/\/www.palentino.es\/blog\/ventajas-de-la-utilizacion-de-clases-en-php-caso-practico\/","title":{"rendered":"Ventajas de la utilizaci\u00f3n de clases en php. Caso pr\u00e1ctico."},"content":{"rendered":"<p style=\"text-align: justify;\">Las clases proporcionan un mecanismo para poder desarrollar\u00a0 plantillas e instanciar objetos de ellas. Separan los datos (atributos) de los m\u00e9todos (funciones o procedimientos). Realmente son moldes para la construcci\u00f3n de objetos.<\/p>\n<p style=\"text-align: justify;\">Gracias a las clases, es posible implementar la programaci\u00f3n orientada a objetos.La POO u OOP posee numerosas ventajas, entre las que destacan principalmente la reutilizaci\u00f3n de c\u00f3digo, y mejora en el desarrollo de los programas. Para ello es necesario cambiar la manera de pensar, adecuar nuestros programas a la filosof\u00eda del objeto y desarrollo de la jerarqu\u00eda de clases.<\/p>\n<p style=\"text-align: justify;\">Abstraer y modelar la realidad son elementos claves a la hora de crearlas.<\/p>\n<p style=\"text-align: justify;\">Al utilizar clases en php, podemos beneficiarnos de la reutilizaci\u00f3n de c\u00f3digo, puesto que una vez creadas, podemos utilizarlas mediante la inclusi\u00f3n en cualquiera de nuestros proyectos php (web o locales).<\/p>\n<p style=\"text-align: justify;\">En si mismas aceleran el desarrollo, es m\u00e1s, gracias a la herencia podemos aprovechar lo anteriormente programado. La encapsulaci\u00f3n, herencia y polimorfismo, caracter\u00edsticas b\u00e1sicas y esenciales enla OPP se consiguen gracias\u00a0 a la clases.<\/p>\n<p style=\"text-align: justify;\">Otras ventajas que se logran:<\/p>\n<p style=\"text-align: justify;\">Permite crear sistemas programados m\u00e1s complejos.<\/p>\n<p style=\"text-align: justify;\">Relacionar el sistema al mundo real.<\/p>\n<p style=\"text-align: justify;\">Facilita la creaci\u00f3n de programas visuales.<\/p>\n<p style=\"text-align: justify;\">Permiten la construcci\u00f3n de prototipos.<\/p>\n<p style=\"text-align: justify;\">Agilizan el desarrollo de software.<\/p>\n<p style=\"text-align: justify;\">\u00a0<!--more--><\/p>\n<p style=\"text-align: justify;\">Adem\u00e1s dos caracter\u00edsticas fundamentales en el software que se da hoy en dia:<\/p>\n<p style=\"text-align: justify;\">Facilitan el trabajo en equipo.<\/p>\n<p style=\"text-align: justify;\">Facilitan el mantenimiento del software.<\/p>\n<p style=\"text-align: justify;\">Para finalizar, las clases son la esencia, el elemento principal en todo programa orientado a objetos. Sus elementos programados definir\u00e1n los futuros objetos creados.<\/p>\n<p style=\"text-align: justify;\">&nbsp;<\/p>\n<p><strong><\/p>\n<p style=\"text-align: justify;color: #000080;\">Veamos un sencillo caso pr\u00e1ctico.<\/p>\n<p><\/strong><\/p>\n<p style=\"text-align: justify;\">Enunciado ejemplo:<\/p>\n<p>Crear una clase <strong>Persona<\/strong>, con atributos nombre, apellido y tel\u00e9fono. Controlar que el tel\u00e9fono solo acepte 9 d\u00edgitos.<\/p>\n<p>Crear una clase <strong>Cuenta<\/strong>, con atributos numeroCuenta, saldo y propietario. El propietario es un objeto tipo Persona.<\/p>\n<p>Crear un constructor con par\u00e1metros y otro sin par\u00e1metros. Controlar que el saldo de la cuenta no debe ser menor que 0.<\/p>\n<p>Crear un m\u00e9todo llamado transaccion que ingrese como par\u00e1metros cantidad y tipoTransaccion; tipoTransaccion es \u201cretiro\u201d o \u201cdeposito\u201d.Si es un retiro, la cantidad se resta del saldo, y si es deposito la cantidad se incrementa al saldo. El m\u00e9todo transacci\u00f3n debe imprimir el tipo de transaci\u00f3n y el nuevo saldo.<\/p>\n<p>Crear en una clase llamada <strong>Principal<\/strong>, dos cuentas pertenecientes a dos personas distintas y hacer un deposito y un retiro en cada cuenta. Imprimir los valores de las personas, propietarios y transacciones.<\/p>\n<p style=\"text-align: justify;\">Afinar el control de acceso (declaraciones public, private, etc.) de las variables, m\u00e9todos y clases, para reforzar la separaci\u00f3n entre interfaz e implementaci\u00f3n de las mismas.<\/p>\n<p>Manos a la obra &#8230;<\/p>\n<p>Adjunto las 3 clases llamadas.<\/p>\n<p><span style=\"color: #000080;\"><strong>persona.inc.php<\/strong><\/span><\/p>\n<pre lang=\"php\" escaped=\"true\">\r\n<?php\r\nclass persona\r\n{\r\n\tprivate $nombre;\r\n\tprivate $apellido;\r\n\tprivate $telefono;\r\n\t\r\n\t\/\/ Controlamos el valor de telefono a 9 digitos\r\n\t\r\n\tfunction __construct($nombre, $apellido, $telefono)\r\n\t{\r\n\t\t\r\n\t$this->nombre=$nombre;\r\n\t$this->apellido=$apellido;\r\n\t$this->telefono=$telefono;\r\n\t\r\n     }\r\n\t\r\n\t\r\n\tfunction set_telefono($telefono)\r\n\t\t{\r\n\t\tif (strlen($telefono) >= 9)\r\n\t\t   {\r\n\t\t   $this->telefono = $telefono;\r\n\t\t   }\r\n\t\telse\r\n\t\t  {\r\n\t\t\treturn \" <br\/> Ejemplo de error: El valor del telefono es menor de 9 digitos\";\r\n\t\t   }\r\n\t\t}\r\n\t\r\n\tfunction get_telefono()\r\n\t{\r\n\t \treturn $this->telefono;\t\r\n\t}\r\n\t\r\n\tfunction get_mombre_y_apellido()\r\n\t{\r\n\t \treturn $this->nombre . \" \". $this->apellido;\t\r\n\t}\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n}\r\n\r\n?>\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong><span style=\"color: #000080;\">cuenta.inc.php<\/span><\/strong><\/p>\n<pre lang=\"PHP\" escaped=\"true\">\r\n<?php\r\n\/\/ En esta clase he encontrado el problema de la sobrecarga de constructores, comento abajo la soluci\u00f3n encontrada\r\nclass cuenta\r\n{\r\n\tprivate $numerocuenta;\r\n\tprivate $saldo;\r\n\tprivate $propietario;\r\n\t\r\n\t\/\/ He investigado y no he encontrado la forma que PHP 5 soporte sobrecarga de constructores.\r\n\t\/\/ Por lo que he necesitado emplear un truco para emular la sobrecarga.\r\n\t\r\n\tfunction __construct()\r\n\t\t{\r\n\t\t$args = func_get_args();\r\n\t\t$nargs = func_num_args();\r\n\t\tswitch($nargs) \r\n\t\t\t{\r\n\t\t\tcase 0:\r\n\t\t\t    \/\/ Si no posee parametros ir al constructor1\r\n\t\t\t\tself::__construct1();\r\n\t\t\t\tbreak;\r\n\t\t       \r\n\t\t\tcase 3:\r\n\t\t\t\t\/\/ Si posee 3 parametros in al constructor2\r\n\t\t\t\tself::__construct2($args[0], $args[1], $args[2]);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n         } \r\n\r\n\t\tfunction __construct1()\r\n\t\t\t{\r\n\t\t\t\t$this->numerocuenta =12345678901234567890;\r\n\t\t\t\t$this->saldo = 100;\r\n\t\t\t\t$this->propietario = new persona(\"Carlos\",\"Garcia\",\"900 000 000\");\r\n\t\t\t}\r\n\t\tfunction __construct2($cuenta, $saldo, $propietario)\r\n\t\t\t{\r\n\t\t\t\t$this->numerocuenta = $cuenta;\r\n\t\t\t\tif ($saldo > 0) \r\n\t\t\t\t{\r\n\t\t\t\t\t$this->saldo = $saldo;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t  {\r\n\t\t\t\t  echo \"El saldo que ha establecido es mejor que 0\";\r\n\t\t\t\t  return 0;\r\n\t\t\t\t  }\r\n\t\t\t\t$this->propietario = $propietario;\r\n\t\t\t}\r\n\t\r\n\t   function get_datospersona()\r\n\t   \t   {\r\n\t\t\t   \/\/ Para mostrar los datos de la persona, es curioso el empleo de 2 -> \r\n\t\t\t   return $this->propietario->get_mombre_y_apellido();\r\n\t\t\t   \r\n\t\t     }\r\n\t   function get_mostrarsaldo()\r\n\t       {\r\n\t\t\t return $this->saldo; \r\n\t\t   }\r\n\t    \r\n\t\t\/\/ Pedido en la pr\u00e1ctica\r\n\t\tfunction transaccion ($cantidad, $tipotransaccion)\r\n\t\t\t{\r\n\t\t\t\tswitch ($tipotransaccion)\r\n\t\t\t\t{\r\n\t\t\t \t\tcase \"retiro\":\r\n\t\t\t\t\t\t$this->saldo = $this->saldo - $cantidad;\r\n\t\t\t\t\t\techo \"<br\/> El tipo de transaccion es de retiro, y el nuevo saldo es : \" . $this->saldo;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"deposito\":\r\n\t\t\t\t\t\t$this->saldo = $this->saldo + $cantidad;\r\n\t\t\t\t\t\techo \"<br\/> El tipo de transaccion es de dep\u00f3sito, y el nuevo saldo es : \" . $this->saldo;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\techo \"<br\/> El par\u00e1metro pasado como tipo no es v\u00e1lido <\/br>\"; \r\n\t\t\t\t}\r\n\t\r\n\t\t\t}\r\n}\r\n?>\r\n\r\n<\/pre>\n<p><span style=\"color: #000080;\"><strong>principal.inc.php<\/strong><\/span><\/p>\n<pre lang=\"PHP\" escaped=\"true\">\r\n<?php\r\nclass principal\r\n{\r\n\tprivate $persona1;\r\n\tprivate $persona2;\r\n\tprivate $micuenta1;\r\n\tprivate $micuenta2;\r\n\t\r\n\t\r\n\tfunction __construct()\r\n\t\t{\r\n\t \t\t$this->persona1= new persona(\"Juan\", \"de la Cuesta\", \"645000000\");\r\n\t\t\t$this->persona2= new persona(\"Pedro\", \"de la Cuesta\", \"652000000\");\r\n\t\t\t$this->micuenta1=new cuenta(\"20106758947584\",200,$this->persona1);\r\n\t\t\t$this->micuenta2=new cuenta(\"2011758947584\",300,$this->persona2);\r\n\t\t\t$this->micuenta1->transaccion(100,\"retiro\");\r\n\t\t\t$this->micuenta1->transaccion(200,\"deposito\");\r\n\t\t\t\/\/ Despues de esto en micuenta1 tiene que existir 300\r\n\t\t\t$this->micuenta2->transaccion(100, \"retiro\");\r\n\t\t\t$this->micuenta2->transaccion(200, \"deposito\");\r\n\t\t\t\/\/ Despues de esto en micienta2 tiene que existir 400\r\n\t\t}\r\n\t\t\r\n\t\t\/\/ Mostramos el resultado.\r\n\tfunction set_mostrardatos()\r\n\t\t{\r\n\t\t\techo \"<br\/> Mostramos datos detallados <Br\/>\";\r\n\t\t\techo \"Nombre y apellidos: \" . $this->micuenta1->get_datospersona();\r\n\t\t\techo \", posee un saldo de : \" . $this->micuenta1->get_mostrarsaldo();\r\n\t\t\techo \"<br\/>\";\r\n\t\t\techo \"Nombre y apellidos: \" . $this->micuenta2->get_datospersona();\r\n\t\t\techo \", posee un saldo de : \" . $this->micuenta2->get_mostrarsaldo();\r\n\t\t}\r\n\t\t\r\n\r\n}\r\n\r\n?>\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #800080;\"><strong>Programa llamador principal.php<\/strong><\/span><\/p>\n<pre lang=\"PHP\" escaped=\"true\">\r\n<?php\r\n\/* \r\n\r\nEsta no es la clase principal , sino un probador y lanzador de lo creado.\r\nEjecuta adem\u00e1s la clase principal al final de la p\u00e1gina.\r\nProbador de clases \r\n\r\n*\/\r\ninclude (\"clases\/persona.inc.php\");\r\ninclude (\"clases\/cuenta.inc.php\");\r\ninclude (\"clases\/principal.inc.php\");\r\n?>\r\n<html>\r\n<head>\r\n<title>Probador del funcionamiento de clases<\/title>\r\n<head>\r\n<body>\r\n<?php\r\necho \"<b>He cargado en memoria las 3 clases: persona, cuenta, principal. <\/b> <br\/>\";\r\n\r\necho \"<br\/><b>---------------- Prueba de la primera clase ----------------- <\/b>\";\r\n\/\/ instanciamos la clase persona\r\n$oscar = new persona(\"oscar\",\"de la Cuesta\", \"979000000\");\r\n\r\n\/\/ creamos metodo tipo set para cumplir ley de demeter\r\necho $oscar->set_telefono(\"97900000\");\r\n\r\n\/\/ Ahora probamos que el metodo set, da error solo introducidos el prefijo.\r\necho $oscar->set_telefono(\"979\");\r\n\/* rescatamos que el valor se ha introducido correctamente, pero no accediendo\r\n directamente sino mediante metodo para lograr encapsulacion tal y como dice\r\n el enunciado, afinando el tipo de acceso *\/\r\n\r\necho \"<br\/>El telefono del objeto tipo persona oscar es: \". $oscar->get_telefono();\r\n\/\/ en vez de: echo $oscar->telefono esto no es correcto inclumple el data hidding\r\n\/\/echo $oscar->telefono;\r\n\/\/ El error marcado seria, Cannot access private property persona.\r\necho \"<b><br\/><br\/> -------------- Prueba la Segunda clase Cuenta --------------- <\/b>\";\r\n\r\n\/\/ Mostramos los parametros por defecto, llamada a constructor\r\n$micuenta=new cuenta();\r\n\r\necho \" <br> Mostramos los datos por defecto la cuenta: \" . $micuenta->get_datospersona();\r\n\/\/ El otro ejemplo parametros sobrecargados, se crea otro objeto demo cuenta pero con parametros en la llamada.\r\n$vero= new persona(\"vero\", \"de la Cuesta\", \"666666666\");\r\n\r\n\/\/ Pasamos puntero del objeto vero para meterlo dentro de la propiedad persona del objeto micuenta2\r\n$micuenta2=new cuenta(\"20106758947584\",100,$vero);\r\n\r\necho \" <br> Mostramos los datos:  \" . $micuenta2->get_datospersona() . \"<br\/>\";\r\n\/\/ Creamos otro objeto tipo cuenta pero vemos que  falla si el saldo es mejor que 0\r\n$micuenta3=new cuenta(\"20106758947584\",-100,$vero);\r\n\r\necho $micuenta3->get_mostrarsaldo();\r\n\r\necho \"<br\/><b> ---------------- Prueba de la Clase Principal ----------------- <\/b>\";\r\n$Objeto_Principal = new principal();\r\necho $Objeto_Principal->set_mostrardatos();\r\n\r\n?>\r\n<\/body>\r\n<\/html>\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Las clases proporcionan un mecanismo para poder desarrollar\u00a0 plantillas e instanciar objetos de ellas. Separan los datos (atributos) de los m\u00e9todos (funciones o procedimientos). Realmente son moldes para la construcci\u00f3n de objetos. Gracias a las clases, es posible implementar la programaci\u00f3n orientada a objetos.La POO u OOP posee numerosas ventajas, entre las que destacan principalmente la reutilizaci\u00f3n de c\u00f3digo, y mejora en el desarrollo de los programas. Para ello es necesario cambiar la manera de pensar, adecuar nuestros programas a la filosof\u00eda del objeto y desarrollo de la jerarqu\u00eda de clases. Abstraer y modelar la realidad son elementos claves a la hora de crearlas. Al utilizar clases en php, podemos beneficiarnos de la reutilizaci\u00f3n de c\u00f3digo, puesto que una vez creadas, podemos utilizarlas mediante la inclusi\u00f3n en cualquiera de nuestros proyectos php (web o locales). En si mismas aceleran el desarrollo, es m\u00e1s, gracias a la herencia podemos aprovechar lo anteriormente programado. La encapsulaci\u00f3n, herencia y polimorfismo, caracter\u00edsticas b\u00e1sicas y esenciales enla OPP se consiguen gracias\u00a0 a la clases. Otras ventajas que se logran: Permite crear sistemas programados m\u00e1s complejos. Relacionar el sistema al mundo real. Facilita la creaci\u00f3n de programas visuales. Permiten la construcci\u00f3n de prototipos. Agilizan el desarrollo de software. \u00a0<\/p>\n","protected":false},"author":1,"featured_media":1133,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[32,5,24],"tags":[45,62,129,60,667,44],"class_list":["post-1132","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-formacion","category-programacion","category-web","tag-clases","tag-objetos","tag-oop","tag-opp","tag-php","tag-programacion-2"],"_links":{"self":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/1132","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/comments?post=1132"}],"version-history":[{"count":45,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/1132\/revisions"}],"predecessor-version":[{"id":1178,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/1132\/revisions\/1178"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/media\/1133"}],"wp:attachment":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/media?parent=1132"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/categories?post=1132"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/tags?post=1132"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}