2010-01-23 21 views
17

Hay muchos debates sobre si la Programación Orientada a Objetos es buena o no. Pero, usar OOP en Php es más lento. ¿Sería un buen negocio usar programación de procedimientos y una velocidad más rápida y OOP con una velocidad más lenta (ya que las clases tienen que iniciarse cada vez que se carga una página y los sitios web grandes comenzarán a ser lentos).¿Vale la pena usar OOP en PHP?

Más importante aún, ¿sería bueno envolver cosas dentro de una clase y usar funciones estáticas o sería mejor tener simplemente muchas funciones de mentir con un prefijo ex: wp_function().

+20

son microsegundos de procesamiento vale la pena las células cerebrales? abra la fuente de algo como CakePHP o CodeIgniter, luego compárelo con la fuente de wordpress, y luego dígame que este último no lo anima a aplastar su cara contra el teclado. – seanmonstar

+5

Tienes razón. La vida es demasiado corta para tratar de optimizar esos 50 milisegundos de optimizaciones por solicitud. – ambiguousmouse

+0

@seanmonstar: ¿Quieres decir que Wordpress no es OO? ** o_O '** –

Respuesta

10

Sí, casi siempre es una buena idea usar OOP. Esto se debe a que OOP es un estilo de codificación, y los estilos de codificación en su mayor parte se pueden transferir fácilmente a través de diferentes idiomas.

Las personas no usan estilos de codificación porque usan un cierto idioma. Las personas utilizan estilos de codificación porque el estilo de codificación ofrece buenos métodos para hacer cosas que consideran deseables. Por lo tanto, siempre que los elementos básicos estén ahí (herencia, propiedades de clase, etc.), siempre será viable escribir en ese estilo de codificación.

No, usar funciones de procedimiento para acceder a ellas probablemente no sea una buena idea. Esto se debe a que probablemente deba hacer algo como esto para mantener el estado.

function myFunc() 
{ 
    global $class; 
    $class->doMethod(); 
} 

function myFunc2() 
{ 
    global $class; 
    $class->doMethod2(); 
} 

Esta es una mala idea, ya que crea un montón de estado global.

+0

Usar siempre global en funciones es una mala idea porque ocupa mucho espacio. Pero, ¿sería bueno usar $ GLOBALS ['class']? Puede que sea más largo escribir, pero sería bueno usarlo si solo estuvieras usando la clase una vez. – ambiguousmouse

+3

'$ GLOBALS' es básicamente lo mismo. Estás creando una variable global. –

+0

Así que solo puedo usar $ GLOBALS ['clase']. Luego, en otra línea, ¿solo usas $ class? – ambiguousmouse

12

Si la razón por la que te preocupa utilizar OO con PHP es la velocidad, no temas: PHP es un lenguaje lento. Si está haciendo algo que es lo suficientemente intensivo en el procesador para la pérdida de velocidad al usar objetos para importar, no debería usar PHP en absoluto.

En cuanto a las funciones estáticas, esta es una opción de diseño, pero me gustaría evitar las clases compuestas por funciones estáticas. Realmente no hay ninguna ventaja sobre los prefijos, y usar una construcción solo porque está allí no es una buena idea.

2

Sí, ya que su aplicación crece ... (y lo hará) le ahorrará muchas horas de frustración. Y repitiendo usted mismo (copiar pegando código por todas partes) ... :)

+0

Huh. ¿Por qué el uso de OOP no implica copiar + pegar-codificación? –

+0

programación de procedimiento no es reutilizable. aunque también puedes cometer este error en OOP :) – Chris

+0

¿Por qué no reutilizables? Puede escribir un código de procedimiento muy, muy genérico. Consulte la biblioteca estándar de C++ (por ejemplo, 'std :: sort'), consulte la biblioteca estándar C (más prominente' qsort'). El código de procedimiento no reutilizable implicaría totalmente que puede usar todas las funciones una sola vez, lo que por supuesto no es bueno. –

5

En mi humilde opinión, los desarrolladores de PHP no deberían intentar ir únicamente en una dirección. (procedural vs object-oriented) En algunos casos, todo lo que necesita son algunas funciones globales, otras veces es más beneficioso usar objetos. No intente forzarlo todo de una forma u otra, sea flexible y use lo que funcione mejor para cada situación.

5

Estoy totalmente en desacuerdo con la respuesta de Chacha102.

Una respuesta adecuada a esta pregunta llenaría varios libros, no importa una publicación de 20 líneas aquí.

Ambos enfoques tienen sus ventajas e inconvenientes. Recomendaría a cualquiera que quiera considerarse un buen programador que tenga una gran experiencia en programación procedimental, no procedimental y orientada a objetos. Además de experiencia con diferentes metodologías como SCRUM, cascada y RAD.

En cuanto a la idoneidad de PHP para OO frente a la codificación de procedimiento, sin duda las raíces del lenguaje están en este último (pero tenga en cuenta que tanto Java como ASP son híbridos en lugar de verdaderos lenguajes de OO).

Peronally, tiendo a escribir código de procedimiento cuando necesito producir algo que es muy simple o debe tener su comportamiento para ser completamente definido y predecible. Sin embargo, al escribir código complejo donde el comportamiento variará mucho en tiempo de ejecución, encuentro que OO es mucho más eficiente en términos de tiempo de desarrollo, a pesar de que el diseño se basa en un conjunto finito de casos de uso.

argumentar que siempre se debe escribir el código de procedimiento porque va a correr más rápido que el código OO:

1) no es necesariamente cierto 2) ignora totalmente el costo relativo del tiempo de desarrollo frente a los costes de hardware

¿sería bueno para envolver cosas dentro de una clase y utilizar funciones estáticas

Dado que los espacios de nombres ya están disponibles en PHP, esta es una manera muy sucia para evitar col espacio de nombres lisions y no algo que recomendaría.

C. se hicieron

5

Los mismos argumentos sobre el rendimiento sobre C Objetivo y C++ de nuevo en el día. Y la respuesta a ese problema fue aprovechar la memoria disponible y la potencia de procesamiento que cada vez es más grande, mejor y más rápida.

Sí, OO requiere más recursos para ejecutarse. Pero los beneficios de usar OO superan el costo de hardware $$ (que es probable que sea insignificante) de admitir aplicaciones OO.

Sin embargo, es bueno preocuparse por el rendimiento del software. Sin embargo, mirar bajo el capó de procedimiento vs. oo como un lugar para comenzar es un poco equivocado. Para empezar, debe centrarse en escribir un código eficiente, ya sea de procedimiento o de OO (y ambos son relevantes).

Tenga en cuenta que aunque PHP puede no ser la plataforma más rápida (Java, por ejemplo, patea el trasero) PHP se usa para alimentar algunos de los sitios web con más tráfico en Internet: Facebook.

Si tiene alguna otra duda sobre PHP y OO, simplemente mire Zend y Magento (basado en Zend). Magento es una plataforma de MUY de uso intensivo de recursos, el uso de memoria puede ser de más de 36 MB por instancia. Sin embargo, la plataforma en sí es capaz de manejar millones de visitas. Esto se debe a que un entorno de servidor configurado correctamente con una porción saludable de recursos de hardware hace que todos los beneficios de usar OO superen con creces el costo del servidor en sí. Pero en un mundo de computadoras agrupadas, NO utilizar la capacidad de procesamiento y la memoria (de manera responsable) disponible para usted es, en mi humilde opinión, locura clínica.

3

Realmente no hay una respuesta perfecta ya que depende de tantas variables desconocidas, y entonces no tiene que ser todo o nada.

Por ejemplo, si divide su aplicación en el modelo MVC, puede hacer que su modelo sea OO pero mantenga el controlador más simplistamente de procedimiento.

Puede utilizar las clases como un medio para simplemente agrupar funciones estáticas comunes, o puede llevarlo mucho más lejos en el patrón de registro activo.

Si está creando un formulario web de una sola página que elimina un mensaje POST en un correo electrónico, realmente no necesita OO, por ejemplo, quizás incluya una clase de correo existente para aprovechar.

Nadie puede darle consejos adecuados sin entender el proyecto que está asumiendo.

Dicho esto, si su única preocupación es la velocidad, entonces OO será será un poco más lento. Y hay muchas cosas furtivas que puedes hacer incluso en PHP de procedimientos para imitar algunas de las ganancias de OO. Pero a menos que esté asumiendo un gran proyecto, la sobrecarga adicional nunca será demasiado. Y para cuando tenga un gran proyecto, los pros de OO podrían superar los inconvenientes de su sobrecarga.

2

Tenía curiosidad de esto yo mismo. Lamentablemente, después de cambiar mi código de procedural a oop ejecuté algunos puntos de referencia y no de antemano.

Aquí está el código de referencia.

class game{ 
    function maxp($val){ 
    return max(0,pow($val,0.5));   
    } 
} 

$game = new game; 

for($i=0;$i<100000;$i++){ 
    $game->maxp(100); 
    //game::maxp(100); 
} 

Los resultados de OOP se extendieron entre 0.13 y 0.2 segundos;

Los resultados del procedimiento variaron entre 0.08 y 0.1 segundos.

Los resultados se mantuvieron constantes durante un buen período de tiempo.

Lo invito a realizar sus propias pruebas.

php 5.4.3