Foros del Web » Programando para Internet » PHP »

Duda sobre Funciones

Estas en el tema de Duda sobre Funciones en el foro de PHP en Foros del Web. Estuve leyendo, tus viejas cartas...jejejee.. no, Estuve leyendo el manual de PHP y estoy viendo el capítulo de Funciones... comenzando a estudiarlo.. y tengo unas ...
  #1 (permalink)  
Antiguo 18/08/2003, 07:32
 
Fecha de Ingreso: marzo-2003
Ubicación: onde toy?
Mensajes: 1.437
Antigüedad: 21 años
Puntos: 9
Información Duda sobre Funciones

Estuve leyendo, tus viejas cartas...jejejee.. no, Estuve leyendo el manual de PHP y estoy viendo el capítulo de Funciones... comenzando a estudiarlo.. y tengo unas pequeñas dudas.. se dice que las funciones deben estar finidas antes de utilizarlas...ajjj en PHP 4.0 ya no es requisito..(disculpen pero es que estoy leyendo el manual) . Entonces la consulta es.. las funciones, pueden estar en la misma página en la que van a ser uilizadas o deben estar en otro archivo que luego es llamado con el Include? o se pueden utilizar ambas formas?



De antemano Grax.
__________________
Buena Vida...
Francisco
  #2 (permalink)  
Antiguo 18/08/2003, 09:15
Avatar de TheRock  
Fecha de Ingreso: mayo-2002
Ubicación: Sucre - Bolivia
Mensajes: 189
Antigüedad: 21 años, 10 meses
Puntos: 0
Todo es posible hacer en PHP, las funciones que son una herramiento poderosa, las puedes crear en cualquier parte del código y utilizarlas en el mismo, Por lo general las funciones se las definen en otro archivo por ej. "funciones.php", esto nos permite usar este archivo no solo en un solo script si no en varios, usando la función include logramos que todo el codigo del archivo "funciones.php" se incluyan en nuestro script.....

Saludos
  #3 (permalink)  
Antiguo 18/08/2003, 09:19
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 8 meses
Puntos: 1
Hola mi amigo,

Casi me descojono de risa con lo de tus viejas cartas... :)

Respecto a lo de las funciones, y como ya lo ha dicho nuestro amigo, en realidad no hay ningún problema si las defines dentro del mismo archivo en donde haces los llamados, o si las colocas en archivos separados que luego serán incluidos mediante include(), require() y otras funciones.

A propósito, ya que hablas del manual de PHP, quisiera preguntarte, sólo por curiosidad, ¿estás leyendo la versión en Inglés o en Castellano? En caso de estar leyendo la traducción, ¿qué tal te ha parecido el documento en general? ¿has encontrado fallos, imprecisiones, o algo que pueda mejorarse de alguna forma? Sólo por curiosidad.. :)


Un cordial saludo
  #4 (permalink)  
Antiguo 18/08/2003, 09:24
 
Fecha de Ingreso: marzo-2003
Ubicación: onde toy?
Mensajes: 1.437
Antigüedad: 21 años
Puntos: 9
Gracias de TheRock, en realidad es bueno eso de dejar en otro archivo las funciones, se les puede llamar desde donde quieras, ahora otra pregunta....En ese archivo puede ir más de una función, me explico... por ejemplo dos funciones una que te sqque los numeros primos y otra que efectué algún tipo de validación... y luego yo pueda llamarlo desde una página dependiendo solo de la función que necestie utilizar.. no se i me entiendes... pero es como almacenar en un solo archivo varias funciones que realicen distintas cosas y utilizar cada una de estas dependiendo el caso... o definitivamente debes crear un archivo distinto para cada función y luego llamarlo para el caso en que la necesite.. grax
__________________
Buena Vida...
Francisco
  #5 (permalink)  
Antiguo 18/08/2003, 09:50
 
Fecha de Ingreso: agosto-2003
Ubicación: Piura
Mensajes: 238
Antigüedad: 20 años, 7 meses
Puntos: 0
claro que si... no hay ningún problema es mas haty demasiados beneficios pues te ahorras espacio, tus códigos son mas fáciles de enterner y mantener, puedes tener n funciones dentro de un solo archivo .php e invocarlas cuantas veces quieras, como quieras y donde quieras...
Un gran saludo
Paco
__________________
Un hombre inteligente, caminando, llega mucho mas rápido que un torpe en coche
  #6 (permalink)  
Antiguo 18/08/2003, 10:01
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 2 meses
Puntos: 5
Claro que pueden ir muchas funciones, de hecho eso es algo que yo uso muy frecuentemente. En un solo archivo tengo una función para conectarme a la BD, otra para enviar mails, otra para la fecha en español, otra para recoger las variables de request... etc.

Y luego en cada página solo incluyo (include) este archivo.

Solo debes tomar en cuenta que este archivo demanda recursos como cualquiera, así que si en una pagina solo vas a usar una funcion, y tu include tiene 50 funciones, vas a estar desperdiciando recursos y haciendo tu sitio mas lento.

Una buena idea es clasificar los archivos por los tipos de funciones que tengas ahi dentro...

func_BD.php
func_Mail.php
func_generales.php
func_especiales.php

etc...

Así solo incluyes los archivos realmente necesarios para que esa pagina funcione.


Todo esto es mi punto de vista.

Salud!!!
__________________
Manoloweb
  #7 (permalink)  
Antiguo 18/08/2003, 11:13
 
Fecha de Ingreso: marzo-2003
Ubicación: onde toy?
Mensajes: 1.437
Antigüedad: 21 años
Puntos: 9
Manoloweb: Gracias por tu explicación.. y tu idea es bastante buena, no lo había pensado, eso de ordenar tus funciones de acuerdo a lo que hacen... bien.

Lonardop : Gracias a ti tambien por tu comentario... y estoy leyendo la versión en español de PHP es un CHM que bajé de la página oficial...de PHP.. ahora si lo que hay que arreglarle.. no sé si tendrá que ver directamente con ese manual pero es que en todo caso va de la mano... es el asunto de MYSQL, todavía no he podido hacer nada con Bases de datos puesto que es un tanto confuso eso de la configuración y otras cosas que creo le hacen falta a un manual de PHP porque en fin es Mysql conque vas a trabajar....




En cuanto a MySQL me ha costado mucho aprender a usarla y todavía no he podido ... si alguien me puede explicar con manzanas, peras, guayavas, melones, limones... la fruta que sea de vuestro pais(esa es una forma de decir que te enseñen con cualquier método) cómo puedo empezar con MySql se los agradeceré enormemente...
__________________
Buena Vida...
Francisco
  #8 (permalink)  
Antiguo 18/08/2003, 15:30
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 8 meses
Puntos: 1
Hola nuevamente Bluesman... a propósito ¿ese nick tiene algo que ver con el hermoso género musical?

Y bueno, te agradezco los comentarios que haces sobre el manual. Tan solo queria hacerte saber que en caso de que encontrases errores en la traducción al castellano del manual, o tuvieras cualquier comentario al respecto, me gustaría que me lo hicieras saber. Y ya que hablo de esto, aprovecharé para invitar a todas aquellas personas que deseen colaborar con una buena causa, que le echen un vistazo al grupo PHPDoc-es, en donde se trabaja por generar y administrar la versión en Castellano del manual oficial de PHP. La colaboración de todos es muy bienvenida. Quizás ya se ha hablado sobre este grupo en este foro, pero por si acaso... :)

Respecto a MySQL, pues me alegra que estés dispuesto a aprender, mas allá de los inconvenientes con que te puedes topar al principio. La pregunta que te haría inicialmente es, ¿en qué punto empiezas a confundirte un poco? ¿ya estás familiarizado con las bases de datos relacionales en general y el lenguaje SQL? De ser así, y si se trata de un asunto de MySQL ¿tu problema es específico a la instalación, configuración o uso de MySQL?

Quizás me anime a escribir, un día de estos, un pequeño documento de introducción a las bases de datos relacionales, entrando quizás en algunos detalles particulares a MySQL y PostgreSQL, si llegara a motivarme la necesidad. :)


Finalmente, quería comentar un poco sobre un comentario de nuestro amigo Manoloweb.

Cita:
Solo debes tomar en cuenta que este archivo demanda recursos como cualquiera, así que si en una pagina solo vas a usar una funcion, y tu include tiene 50 funciones, vas a estar desperdiciando recursos y haciendo tu sitio mas lento.
Desconozco si la verdadera intención de Manoloweb era recomendar la curiosa práctica de mantener el menor número posible de funciones y código por archivo, basándose exclusivamente en razones de rendimiento.

Digo `curiosa', porque ciertamente me intriga mucho esta percepción, que por lo demás, he notado en muchos programadores. Hay quienes eventualmente piensan que es mejor tener la menor cantidad de código posible dentro de cada archivo fuente, ya que esto repercutiría de alguna forma significativa en el rendimiento de la aplicación, especialmente en su tiempo de ejecución.

Yo considero esto un mito que produce un efecto más negativo que positivo a la labor de un programador. Ciertamente, y creo que nadie defendería lo contrario, no es lo mismo contar con un archivo de 10 líneas que con uno de 10,000. Pero, si consideramos las variables de las que depende el tiempo de ejecución de un programa con un poco de detalle, veremos que el hecho de tener un archivo con una cantidad enorme de funciones que no serán ejecutadas, no tienen impacto significativo alguno en la ejecución de las aplicaciones.


En términos generales, los lenguajes interpretados como PHP realizan más o menos los siguientes pasos cuando se ejecuta un script:

* (el paso obvio) Se abre el archivo fuente para lectura.

* En este punto, dependiendo del lenguaje, pueden ejecutarse varias acciones. Por ejemplo, pasar por un paso de preprocesamiento (muy al estilo C). En PHP, quizás lo más cercano a las labores de preprocesamiento son las sentencias tipo include() o require(), aunque estas en realidad son protagonistas en tiempo de ejecución. Curiosamente, construcciones del lenguaje como include(), require(), o la función define() no trabajan en tiempo de compilación por decisión de diseño.

* Después del preprocesamiento se pasa a la compilación. Inicialmente, suele hacerse un análisis lexical, lo cual implica un procesamiento del contenido completo del archivo, y en donde se verifican correspondencias entre los símbolos del código y los lexemas del lenguaje.

* Nuevamente dependiendo del lenguaje, usualmente se pasa a la generación de un árbol sintáctico. En el proceso de construcción del árbol se pueden verificar algunos aspectos de la gramática del código original.

* Una vez se cuenta con el árbol sintáctico, puede hacerse uso de otro paso de análisis semántico, en donde se verifican otros aspectos de la integridad del código.

* En fin, ya después de los análisis sintácticos, los intérpretes pueden pasar a la generación de código intermedio para su ejecución. Opcionalmente, puede haberse pasado por una o más fases de optimización.

* El resultado final de todo el proceso es el lenguaje de máquina que finalmente es pasado a la unidad de procesamiento de la máquina. Aquí comienza efectivamente la ejecución del programa, y lo que suceda de aquí en adelante recae enteramente en el diseño del programa original.


Es comprensible la adopción de apreciaciones que sugieren que es buena idea ser frugal en cuanto a líneas de código por archivo se refiere. Pero lo que se está desconociendo en tales situaciones es la tremenda sofisticación a la que llegan los intérpretes modernos para lograr que las fases fundamentales de análisis del código sean eficaces.

Por supuesto que para un programador, la tarea de escribir una cantidad considerable de código (digamos, unas 100,000 líneas de código relativamente interesante) ¡es muy apreciable! Pero para el intérprete todas estas sentencias no representan más que elementos lexicales que corresponden a un número finito de ciclos de procesamiento elementales en las etapas de generación de código intermedio.

Intuitivamente, podría decirse que la complejidad computacional de las fases de generación de código intermedio del intérprete sería algo como O(n), donde `n' corresponde al número de expresiones, operadores, y demás símbolos dentro del código fuente original. Claro está que en la realidad, la expresión de esta complejidad sería algo más cercano a: O(n) + k, en donde k es una constante que representa el tiempo que toma el intérprete realizando tareas que son independientes al código que llega como entrada.

Ahora bien, sin entrar a hablar de cifras exactas, que por lo demás no considero necesarias en este punto, creo que todos podríamos coincidir en que el tiempo de procesamiento de un símbolo dado, usando el tipo de equipos (procesadores) que existen hoy en día, es algo muy, muy rápido. Probablemente estoy diciendo una barbaridad, y muy seguramente, y deliberadamente, me referiré a un número exageradamente grande. Digamos que un símbolo dado, en las etapas de generación de código intermedio de un intérprete, se procesa en aproximadamente 1e-6 segundos. Digamos que en nuestro ejemplo anterior, en donde hablábamos de 100,000 líneas de código, cada línea tenía en promedio unos 5 símbolos (cosa por lo demás difícil de creer si se consideran los espacios en blanco, los comentarios, las expresiones como cadenas de caracteres de considerable tamaño, etc.). Estamos pensando entonces de un programa con unos 500,000 símbolos. Este programa con nuestro intérprete, y en nuestro procesador imaginario tomaría: 500,000 * 1e-6 segundos, siendo procesado en las etapas previas a la ejecución real de la aplicación. Es decir, unos 0.5 segundos.


Como sé que es más fácil ver las cosas con valores reales, y no con cifras aleatorias que se le ocurren a cualquier aparecido (es decir, éste servidor :), preparé el siguiente ejercicio que ejecuté en mi máquina personal. Mi máquina no es nada sofisticada, cuenta con un procesador de ~750Mhz (pentium3) y unos 384MB de memoria RAM.

Estos son los resultados de reunir una cantidad grande de código --unas 2400 líneas de código tomado del proyecto Smarty de PHP (inicialmente quise hacerlo con el repositorio completo de clases de PEAR, pero abandoné la idea después de observar la enorme cantidad de errores que hay dentro del código de este repositorio, y que no permitían ejecutar el script de prueba). El código se reúne en un único archivo, y luego es ejecutado. Internamente, en el archivo sólo se hace un llamado a una función, de las muchas que hacen parte del archivo.

Para poner las resultados en perspectiva, al final realicé el mismo experimento con un archivo que únicamente incluía una función, la cual es llamada una sola vez. Comparando los tiempos de ejecución finales puede verse que no hay alguna diferencia significativa entre los dos casos.

(continúa)
  #9 (permalink)  
Antiguo 18/08/2003, 15:31
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 8 meses
Puntos: 1
(continuación)

Código:
# Se descarga la version 2.5 del modulo `smarty' desde el repositorio
# CVS de PHP

$ cvs -d :pserver:[email protected]:/repository co -r Smarty_2_5_0 smarty


# Nos aseguramos de que no exista inicialmente el archivo
# `ejemplo_grande.php'

$ test -f ejemplo_grande.php && rm ejemplo_grande.php


# tomando como base el conjunto de archivos con extension .php del
# directorio `smarty/libs/plugins', se copia su contenido en el
# archivo `ejemplo_grande.php', concentrandonos en aquellos archivos
# que contengan la palabra `function', e ignorando las lineas que
# contengan `require_once'

$ for archivo in `find smarty/libs/plugins -name "*.php"`; do \
`grep -q function $archivo` && \
grep -v require_once $archivo >>ejemplo_grande.php; done


# contemos el numero de lineas que tiene ahora el archivo
# `ejemplo_grande.php'

$ wc -l ejemplo_grande.php
   2415 ejemplo_grande.php


# contemos el numero de ocurrencias de la palabra `function' en
# `ejemplo.php'

$ grep function ejemplo_grande.php | wc -l
    111


# Agreguemos una pequenya funcion al final del archivo, que sera la
# unica que va a ser llamada cuando se ejecute el script.

$ echo "<?php
function funcion_cualquiera ()
{ echo \"Esta funcion no hace mucho...\n\"; }
echo \"Llamando una funcion cualquiera..\n\";
funcion_cualquiera ();
?>" >>ejemplo_grande.php


# Probemos que el script se ejecuta exitosamente

$ php ejemplo_grande.php
Llamando una funcion cualquiera..
Esta funcion no hace mucho...


# Ahora consultemos la cantidad maxima de memoria residente que
# requiere el script cuando es ejecutado, asi como el tiempo de
# ejecucion.

$ /usr/bin/time -f \
"Tiempo total real: %e\nMemoria maxima residente : %M" \
php ejemplo_grande.php

Llamando una funcion cualquiera..
Esta funcion no hace mucho...
#############################
Tiempo total real: 0.26
Memoria maxima residente : 0
#############################


# 0.26 segundos. Que tal si ejecutaramos un script que solo incluyera
# nuestra funcion final? Aqui esta la prueba:


# Crear el archivo `ejemplo.php', y agregarle nuestra pequenya funcion

$ test -f ejemplo.php && rm ejemplo.php

$ echo "<?php
function funcion_cualquiera ()
{ echo \"Esta funcion no hace mucho...\n\"; }
echo \"Llamando una funcion cualquiera..\n\";
funcion_cualquiera ();
?>" >ejemplo.php


# Confirmemos la cantidad de lineas que tiene el archivo, y la
# cantidad de ocurrencias de la palabra `function'

$ wc -l ejemplo.php
      6 ejemplo.php

$ grep function ejemplo.php | wc -l
      1


# Bien, consultemos ahora el tiempo de ejecucion de este script

$ /usr/bin/time -f \
"Tiempo total real: %e\nMemoria maxima residente : %M" \
php ejemplo.php

Llamando una funcion cualquiera..
Esta funcion no hace mucho...
#############################
Tiempo total real: 0.24
Memoria maxima residente : 0
#############################

# 0.24 segundos. Ciertamente no hay mucha diferencia...

Ahora bien, el consejo de separar el contenido de tus archivos de acuerdo a las funciones que incluyen es una práctica muy recomendable. Por supuesto, está sujeto a los gustos particulares del programador, pero siempre es bueno contar con cierto grado de organización en el manejo de código.

Éste tipo de prácticas fomentan la reusabilidad y modularización de las aplicaciones, así que si lo deseas olvida lo que he dicho del rendimiento y separa todo en diferentes archivos. :) Solo ten presente que si algún día te enfrentas a una cantidad enorme de código que bien podrías incluir dentro de un solo archivo, no rechaces esta idea meramente por razones de rendimiento, ya que no tal postura no tiene mucho sentido. :)


Un cordial saludo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 19:35.