{"id":133,"date":"2013-12-18T11:00:29","date_gmt":"2013-12-18T10:00:29","guid":{"rendered":"https:\/\/blogs.ua.es\/idesweb\/?p=133"},"modified":"2013-12-18T10:19:10","modified_gmt":"2013-12-18T09:19:10","slug":"php-ejemplo-de-pagina-web-con-orientacion-a-objetos-parte-1","status":"publish","type":"post","link":"https:\/\/blogs.ua.es\/idesweb\/2013\/12\/18\/php-ejemplo-de-pagina-web-con-orientacion-a-objetos-parte-1\/","title":{"rendered":"PHP: ejemplo de p\u00e1gina web con orientaci\u00f3n a objetos (parte 1)"},"content":{"rendered":"<p>V\u00eddeo:\u00a0<a href=\"http:\/\/www.youtube.com\/watch?v=ZIdQstGwoxQ\">PHP: ejemplo de p\u00e1gina web con orientaci\u00f3n a objetos (parte 1)<\/a><\/p>\n<p>Descarga de ficheros del ejemplo:\u00a0<a href=\"http:\/\/hdl.handle.net\/10045\/34635\">iDESWEB: PHP: ejemplo de p\u00e1gina web con orientaci\u00f3n a objetos<\/a><\/p>\n<p>[kml_flashembed movie=&#8221;http:\/\/www.youtube.com\/v\/ZIdQstGwoxQ&#8221; width=&#8221;560&#8243; height=&#8221;315&#8243; wmode=&#8221;transparent&#8221; \/]<\/p>\n<p><strong>Transcripci\u00f3n:<\/strong><\/p>\n<p>Hola, soy Sergio Luj\u00e1n Mora, profesor de inform\u00e1tica de la Universidad de Alicante, y en este v\u00eddeo que forma parte del curso \u201cIntroducci\u00f3n al desarrollo web\u201d, te voy a mostrar un ejemplo de desarrollo de una p\u00e1gina web con orientaci\u00f3n a objetos.<\/p>\n<p>Si no conoces la sintaxis de la orientaci\u00f3n a objetos en PHP, te invito a que veas los v\u00eddeos \u201cPHP: orientaci\u00f3n a objetos (PHP4)\u201d, y \u201cPHP: orientaci\u00f3n a objetos (PHP5)\u201d. En estos dos v\u00eddeos te explico lo m\u00ednimo que necesitas conocer sobre la orientaci\u00f3n a objetos en PHP.<\/p>\n<p>El siguiente ejemplo que te voy a mostrar lo voy a realizar con la sintaxis de orientaci\u00f3n a objetos de PHP5.<\/p>\n<p>En esta primera parte del v\u00eddeo voy a desarrollar el ejemplo con el estilo procedural. En el estilo procedural el c\u00f3digo se encuentra en procedimientos o funciones.<\/p>\n<p>Para almacenar los datos del programa que voy a realizar voy a utilizar arrays.<\/p>\n<p>En el siguiente v\u00eddeo, transformar\u00e9 este ejemplo en orientado a objetos y los arrays los sustituir\u00e9 por clases y objetos.<\/p>\n<p>\u00bfCu\u00e1l de los dos estilos es el mejor, el procedural o el orientado a objetos?<\/p>\n<p>Desde hace a\u00f1os, el estilo de programaci\u00f3n que se aconseja es el orientado a objetos. Es el mejor para grandes proyectos en los que trabajan muchas personas al mismo tiempo. Pero esto no significa que el estilo procedural ya no se deba usar. En este ejemplo vamos a ver algunos de los problemas del estilo procedural, pero en ciertas situaciones es una muy buena opci\u00f3n.<\/p>\n<p>Pasemos a ver el ejemplo.<\/p>\n<p>Aqu\u00ed tenemos el ejemplo que te voy a mostrar. El c\u00f3digo ya lo tengo escrito para ir m\u00e1s r\u00e1pido y tambi\u00e9n para no cometer errores durante la grabaci\u00f3n del video.<\/p>\n<p>F\u00edjate que no voy a construir una p\u00e1gina web real, es decir, no voy a preocupar por ponerle el DOCTYPE, el &lt;html&gt;, etc\u00e9tera, ya que el objetivo del v\u00eddeo no es hacer una p\u00e1gina web real sino trabajar con PHP con las clases, con los objetos, etc\u00e9tera.<\/p>\n<p>He puesto aqu\u00ed esta etiqueta &lt;pre&gt; para activar la visualizaci\u00f3n de texto preformateado. Esto me va a permitir que los saltos de l\u00ednea que yo escriba, muestre desde PHP se respete.<\/p>\n<p>En PHP primero he declarado una funci\u00f3n llamada \u201ce\u201d que va a ser un alias de la funci\u00f3n eco de PHP. Es la funci\u00f3n que voy a emplear para mostrar, para visualizar algo en la p\u00e1gina. Esta funci\u00f3n a\u00f1ade a lo que yo quiero mostrar, a la cadena, le a\u00f1ade un salto de l\u00ednea.<\/p>\n<p>A continuaci\u00f3n tengo declarado el array $comunidad. Este array es multidimensional, tiene en concreto dos dimensiones. En la primera dimensi\u00f3n vamos a encontrar una serie de arrays. Cada array representa un miembro de la comunidad universitaria.<\/p>\n<p>Tenemos dos tipos de miembros: el tipo profesor y el tipo estudiante. Los dos tipos comparten alguna informaci\u00f3n, los dos tienen nombres y apellidos, como podemos ver aqu\u00ed. Sin embargo, el tipo profesor tiene un campo propio, el cargo que ocupa el profesor y el tipo estudiante tiene un campo propio, el curso en el que estudia el estudiante.<\/p>\n<p>Tenemos aqu\u00ed cinco miembros de la comunidad universitaria. F\u00edjate que he empleado arrays asociativos, esta posici\u00f3n, este \u00edndice en el array no es un n\u00famero sino que es una cadena. Lo primero que voy a hacer es visualizar este array en la p\u00e1gina web para ver si se muestra como yo espero. As\u00ed que me voy a la p\u00e1gina web y aqu\u00ed lo tenemos, tal como se muestra.<\/p>\n<p>F\u00edjate algo muy importante, la p\u00e1gina que estoy haciendo la estoy ejecutando a trav\u00e9s de localhost, no la puedo ejecutar directamente porque tiene c\u00f3digo PHP. El array, como puedes ver, tiene cinco posiciones que van de la posici\u00f3n cero a la posici\u00f3n cuatro.<\/p>\n<p>Lo siguiente que voy a hacer, voy a quitar este comentario, lo siguiente que voy a hacer es mostrar el array con un formato que yo quiero. Para ello voy a recorrer el array, el array $comunidad con un bucle foreach. Y entonces aqu\u00ed nos encontramos el primer problema del estilo procedural. Tenemos dos tipos de miembros, el tipo profesor y el tipo estudiante. Cada uno tiene informaci\u00f3n diferente, as\u00ed que vamos a necesitar dos funciones para mostrar cada uno de ellos. Si tuvi\u00e9semos diferentes tipos, tres, cuatro, cinco, seis, necesitar\u00edamos tres, cuatro, cinco, seis funciones para cada uno de los tipos.<\/p>\n<p>Aqu\u00ed tengo la primera funci\u00f3n para mostrar el tipo profesor, la he llamado ProfesorToString(), es decir, me va a convertir un array de este tipo me lo va a convertir en una cadena, es lo que va a devolver esta funci\u00f3n. $p va a ser el array de tipo profesor que va a recibir la funci\u00f3n y se tienen que hacer algunas comprobaciones para hacer el c\u00f3digo \u201ca prueba de bombas\u201d, para que no surjan problemas. As\u00ed que lo primero que voy a comprobar es si el array que me pasan es realmente un array; si la variable, el par\u00e1metro que han pasado $p es realmente un array.<\/p>\n<p>Si es un array, lo siguiente que compruebo es que exista una posici\u00f3n llamada tipo, y si existe esa posici\u00f3n, lo siguiente que compruebo es que sea de tipo profesor, porque esta funci\u00f3n es para mostrar un profesor. Y si es as\u00ed entonces ya viene el c\u00f3digo concreto para mostrar un profesor. Primero compruebo si tiene nombre y apellidos, si no tiene nombre y apellidos entonces el resultado, lo que voy a mostrar, es desconocido, no sabemos su nombre y sus apellidos y a continuaci\u00f3n el cargo. Si no es as\u00ed, si el nombre y los apellidos es distinto de cadena vac\u00eda, entonces el resultado es el nombre, coma apellidos, coma cargo.<\/p>\n<p>Esto mismo lo tengo que repetir con el tipo estudiante. EstudianteToString recibe $e, recibe este par\u00e1metro y otra vez volvemos a realizar las mismas comprobaciones. Primero compruebo que sea un array, luego compruebo que est\u00e9 definida la posici\u00f3n tipo, luego compruebo que sea de tipo estudiante y finalmente, si es as\u00ed, ya muestro, en realidad ya devuelvo una cadena con el resultado y otra vez, si no hay nombres y apellidos, devuelvo desconocido y si s\u00ed que hay, pues devuelvo nombre, apellidos y el curso del estudiante que es lo que va a devolver la funci\u00f3n EstudianteToString.<\/p>\n<p>Bien, esto ya lo podemos probar, voy a poner ahora aqu\u00ed un comentario, esto lo veremos despu\u00e9s, as\u00ed que ahora se va a ejecutar este c\u00f3digo, va a recorrer el array y para cada miembro vamos a ver si tenemos que llamar a ProfesorToString si es de tipo profesor o a EstudianteToString si es de tipo estudiante.<\/p>\n<p>Como he dicho antes, si tuvi\u00e9semos m\u00e1s tipos, lo tendr\u00eda que ir a\u00f1adiendo aqu\u00ed uno tras uno.<\/p>\n<p>Bien, grabo el fichero y ejecuto la p\u00e1gina. Me sale el array con el print_r() que ya lo ten\u00edamos antes, y aqu\u00ed ya me sale la visualizaci\u00f3n en mi formato. Aqu\u00ed tenemos un profesor, aqu\u00ed tenemos un estudiante, otro estudiante, aqu\u00ed tenemos un profesor y por \u00faltimo aqu\u00ed tenemos este estudiante del cual no sabemos ni su nombre y apellidos ni su curso.<\/p>\n<p>Bien, ahora ya empiezan los problemas. \u00bfQu\u00e9 ocurre si en mi c\u00f3digo pues por error, por ejemplo, realizo este bucle?<\/p>\n<p>Con este bucle voy a cambiar todos los miembros de la comunidad universitaria y les voy a poner tipo estudiante. Pero quiz\u00e1s eso no se deber\u00eda de poder hacer, quiz\u00e1s se deber\u00eda comprobar que por ejemplo este miembro, que es de profesor, no puede cambiar de tipo.<\/p>\n<p>Esto, en la programaci\u00f3n procedural con arrays, es imposible, esto no se puede controlar, no se puede impedir que se hagan cosas como \u00e9sta. Y tampoco se puede impedir que se haga esto, por ejemplo le podemos poner que el curso de los estudiantes es quinto, cuando en realidad a lo mejor no es posible, no existe, el curso solamente existe de uno a cuatro, de primero a cuarto.<\/p>\n<p>Como he dicho antes, todo esto no lo podemos impedir en la programaci\u00f3n procedural, pero luego ya veremos que en la programaci\u00f3n orientada a objetos si que lo podemos controlar.<\/p>\n<p>Bien, vamos a probarlo y ahora veremos, bien primero tenemos que mostrarlo, voy a quitar este comentario, ahora explicar\u00e9 esto para qu\u00e9 est\u00e1, y vamos a probarlo.<\/p>\n<p>Y ahora vemos como todos nuestros miembros, todo el contenido de nuestro array ha cambiado a tipo estudiante y a todos le ha puesto el curso quinto.<\/p>\n<p>Y si ahora lo visualizamos pues efectivamente nos lo saca como que todos son estudiantes.<\/p>\n<p>Bien, para finalizar este v\u00eddeo, te he dicho que te iba a comentar esto para qu\u00e9 estaba puesto. Bueno, no te lo digo, te lo dejo como ejercicio que averig\u00fces por qu\u00e9 est\u00e1 puesto esto aqu\u00ed y qu\u00e9 ocurre si no lo ponemos, qu\u00e9 ocurre si yo esta l\u00ednea la quito.<\/p>\n<p>Como pista, f\u00edjate que aqu\u00ed le hab\u00eda puesto un ampersand en el bucle foreach. Este ampersand hace que miembro sea una referencia a las posiciones del array. Este ampersand est\u00e1 relacionado con esto y como digo, si no se pone, aqu\u00ed ocurre algo curioso.<\/p>\n<p>Ya para finalizar, me gustar\u00eda recordarte algunos de los sitios web en los que puedes encontrar m\u00e1s informaci\u00f3n sobre m\u00ed y sobre mi trabajo, y dos formas de contactar conmigo, a trav\u00e9s de mi correo electr\u00f3nico sergio.lujan@ua.es y a trav\u00e9s de mi cuenta en Twitter @sergiolujanmora.<\/p>\n<p>Recuerda que este v\u00eddeo forma parte del curso \u201cIntroducci\u00f3n al desarrollo web\u201d que est\u00e1 disponible en la direcci\u00f3n idesweb.es.<\/p>\n<p>Muchas gracias por tu atenci\u00f3n.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>V\u00eddeo:\u00a0PHP: ejemplo de p\u00e1gina web con orientaci\u00f3n a objetos (parte 1) Descarga de ficheros del ejemplo:\u00a0iDESWEB: PHP: ejemplo de p\u00e1gina web con orientaci\u00f3n a objetos [kml_flashembed movie=&#8221;http:\/\/www.youtube.com\/v\/ZIdQstGwoxQ&#8221; width=&#8221;560&#8243; height=&#8221;315&#8243; wmode=&#8221;transparent&#8221; \/] Transcripci\u00f3n: Hola, soy Sergio Luj\u00e1n Mora, profesor de inform\u00e1tica de la Universidad de Alicante, y en este v\u00eddeo que forma parte del curso \u201cIntroducci\u00f3n &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blogs.ua.es\/idesweb\/2013\/12\/18\/php-ejemplo-de-pagina-web-con-orientacion-a-objetos-parte-1\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;PHP: ejemplo de p\u00e1gina web con orientaci\u00f3n a objetos (parte 1)&#8221;<\/span><\/a><\/p>\n","protected":false},"author":40,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[676],"tags":[],"class_list":["post-133","post","type-post","status-publish","format-standard","hentry","category-sin-categoria"],"_links":{"self":[{"href":"https:\/\/blogs.ua.es\/idesweb\/wp-json\/wp\/v2\/posts\/133","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.ua.es\/idesweb\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.ua.es\/idesweb\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.ua.es\/idesweb\/wp-json\/wp\/v2\/users\/40"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.ua.es\/idesweb\/wp-json\/wp\/v2\/comments?post=133"}],"version-history":[{"count":2,"href":"https:\/\/blogs.ua.es\/idesweb\/wp-json\/wp\/v2\/posts\/133\/revisions"}],"predecessor-version":[{"id":135,"href":"https:\/\/blogs.ua.es\/idesweb\/wp-json\/wp\/v2\/posts\/133\/revisions\/135"}],"wp:attachment":[{"href":"https:\/\/blogs.ua.es\/idesweb\/wp-json\/wp\/v2\/media?parent=133"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.ua.es\/idesweb\/wp-json\/wp\/v2\/categories?post=133"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.ua.es\/idesweb\/wp-json\/wp\/v2\/tags?post=133"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}