2012-07-16 15 views
5

En primer lugar Sé que esta pregunta ha dado la vuelta más de una vez aquí:E_NOTICE: ¿Cuán útil es REALMENTE reparar cada una?

Pero cuanto más que puedo solucionar todos E_NOTICEs (como la gente dice que debería) más me he dado cuenta de que:

  • soy micro-optimización
  • De hecho, estoy haciendo más código y hacer mi código más difícil de MANTENER y más lento

Tomemos un ejemplo:

Digamos que su utilizando el controlador de MongoDB PHP y tiene un objeto MongoDate en una var clase llamada ts dentro una clase que representa una sola fila en una colección en su base de datos. Ahora accede a esta var como: $obj->ts->sec pero PHP arroja un ajuste (E_NOTICE) porque ts en este caso no está definido como un objeto en sí mismo porque esta fila en particular no tiene un campo ts. Entonces piensas que esto está bien, este es el comportamiento deseado, si no se establece devuelve nulo y yo mismo me ocuparé de ellos fuera de los propios trabajos robóticos del intérprete (ya que envuelves esto en una función date() que simplemente devuelve 1970 si la var es null o a none-object).

Pero ahora arreglar que E_NOTICE como otro desarrollador realmente quiere que yo tenga CUALQUIER E_NOTICE es terribad y hace que el código sea más lento para no hacerlo de acuerdo con los errores. Así que hago una nueva función en la clase $obj llama getTs y me doy 3 líneas, literalmente, no hacer nada, sino comprobar si el ts var es un objeto MongoDate y devolverlo si es ...

POR QUÉ? ¿No puede PHP hacer esto perfectamente bien para mí dentro de su intérprete mucho más rápido que tener que hacerlo en el tiempo de ejecución de la aplicación en sí? Quiero decir que cada vez que tengo que agregar un toque inútil a mi código, prácticamente funciones vacías para detectar variables que realmente manejo con la capacidad de PHP de devolver null o verificar su instanceof cuando realmente lo necesito (cuando es vital para el operación y comportamiento de dicha función) y no me inicie en el isset() s He agregado alrededor de 300 líneas de isset() s, se está yendo de las manos. Tengo, por supuesto, tiene que hacer que esta getTs funciones porque no se puede hacer:

class obj{ 
    public $ts = new MongoDate(); 
} 

yo bien tienen que almacenar el ts dentro del __constructor (que no estoy muy contento con cualquiera, estoy usando un montón de magia tal como es) o usar una función para detectar si está configurado (lo que hago ahora).

quiero decir que entiendo por qué debería fijar:

  • Indefinido vars
  • propiedades Asignación de VARs no definidas (null VARs)
  • errores constantes etc

pero si usted ha probado su código y usted sabe que es seguro y solo funcionará de la manera que desee, ¿cuál es el punto en la fijación de todos los undefined index o none-object er rors? ¿No está agregando un montón de funciones de isset() sy 2 líneas a su código en realidad micro-optimización?

Me he dado cuenta después de hacer que la mitad de mi sitio cumple con E_NOTICE que en realidad usa más CPU, memoria y tiempo ahora ... ¿de qué sirve lidiar con cada error E_NOTICE y no solo con los que SON errores?

Gracias por sus pensamientos,

+0

Usted no debería tener que. Deberías manejar excepciones en su lugar. Pero ... ¡BIENVENIDO A PHP! –

+0

@ IgnacioVazquez-Abrams De hecho, PHP se supone que es un lenguaje dinámico, pero con la fijación de todos estos 'E_NOTICES' puedo pensar en por lo menos 1000 piensa que no hacen publicidad dinámica en su comercialización, pero son más aún ... – Sammaye

+0

Usted' Veremos que PHP tiene un 90% de marketing, un 9% de esfuerzo y un 1% de locura. –

Respuesta

3

Sea o no usted debe fijarlos es ciertamente discutible, y solo dependerá de la rentabilidad en su situación; por ejemplo, es más importante si el código tendrá una vida útil más larga, más desarrolladores, etc.

En general, suponiendo que sus funciones serán utilizadas (y mal utilizadas) por otra persona es la mejor práctica, por lo que debe hacer isset /! empty/is_object checks para dar cuenta de esto. A menudo, su código encontrará su camino en usos y situaciones para las que nunca lo pensó.

En lo que respecta al rendimiento, cada vez que se produce algún tipo de error - E_NOTICE incluido - el intérprete genera el controlador de errores, crea un seguimiento de la pila y formatea el error. El punto es que, ya sea que los informes o no, los errores siempre ralentizan la ejecución; por lo tanto, 2-3 llamadas a funciones para evitar un E_NOTICE mejorarán aún más su rendimiento.

Editar: Alternativas para el ejemplo anterior

no necesariamente crear objetos adicionales para evitar los errores; puedes evitarlos con gracia sin ellos. Aquí hay un par de opciones:

1) Función que se encarga de ts que faltan:

SpecialClass class { 

    funciton getTs() { 
     return !empty($this->ts) ? $ts->sec : false; 
    } 
} 

2) Tratar con TS que faltan en la plantilla/procedimiento:

if (!empty($obj->ts->sec)) { 
    //do something 
} 

me gusta especialmente empty() porque puede usarlo para reemplazar (isset($var) && ($var or 0 != $var //etc)), guardar múltiples llamadas/comparaciones y vaciar nunca arroja avisos para la var o atributo de destino. Arrojará un error si lo está llamando en una propiedad/miembro de una variable inexistente.

+0

Digamos que tengo un flujo de actividades con 20 elementos. En mi ejemplo anterior, cada uno tendría un ts de un objeto 'MongoDate'. Es más rápido y más eficiente crear un nuevo objeto en cada objeto padre '$ obj' y hacer un cálculo en esa variable que permitir que PHP llame a la función de error global, integrada o predefinida por el usuario. – Sammaye

+0

O eso (aunque recomendaría devolver false si no se establece, en lugar de crear una extemporáneamente) o simplemente probar el retorno antes de usarlo: es decir: (! Empty ($ obj-> ts)) {// si hacer cosas ; } o $ ts =! empty ($ obj-> ts)? $ ts-> sec: // valor de retorno; –

+0

Meh decidió simplemente codearse y hacerlo al final. Todavía he notado un consumo incrementado de CPU y memoria a pesar de que todo lo que he hecho se agrega más declaraciones IF para la toma de decisiones basadas en si el objeto existe o no. Podría hacer un documento técnico en realidad. Este método es tan feo en HTML y se supone que PHP es un lenguaje dinámico ... pero de todos modos, gracias. – Sammaye

6

Sin duda hace hacer obtener un mejor rendimiento mediante el uso de isset(). Hice algunos puntos de referencia, no hace mucho tiempo, y solo los errores ocultos resultaron ser 10 veces más lentos.

http://garrettbluma.com/2011/11/14/php-isset-performance/

Dicho esto, el rendimiento por lo general no es un factor crítico en PHP. Lo que hace, personalmente me vuelve loco es silent errors.

Cuando el intérprete decide no marcará algo como un error (lo que podría conducir a la inestabilidad) es un problema enorme. PHP, en particular, tiene una tendencia a

  • advierten sobre las cosas que debe error (por ejemplo, fallo de conexión con la base de datos) y
  • emisión avisos acerca de las cosas que debe advierten (por ejemplo, intentar para acceder a un miembro de un objeto nulo).

Quizás soy demasiado obstinado en este tipo de cosas pero he sido mordido antes por estos silenciosos errores. Recomiendo siempre incluir E_NOTICE en el informe de errores.

+1

+1 Bonito enlace, estoy pensando en comparar mi sitio en un minuto, lo digo en serio cuando digo que lidiar con todas las E_NOTICE es más lento que dejar que PHP acceda al objeto de error. De hecho, el nuevo código acaba de cerrar mi servidor porque en realidad llenó toda la memoria con objetos ... Todo lo que hice fue agregar una función para definir un nuevo objeto si no existe .... la única diferencia: \ – Sammaye

+1

puede no ser una opción, pero mira en Xdebug. Puede perfilar su código y averiguar dónde se está gastando el tiempo/memoria más rápido. (WinCacheGrind es un buen visor de perfil también.) –

+0

Aye que tendrá al perfil un poco, en teoría, el código debe ser el uso de un punto de la memoria de cada iteración, pero no es, prolly un error de codificación, pero aún así es sólo un ejemplo donde están las cosas lento hay lugares mucho más difíciles de explicar ... – Sammaye