programacion - Preguntas que cada buen desarrollador de PHP debería poder responder
programacion android pdf 2018 (17)
Estaba repasando Cuestiones que todo buen desarrollador de .Net debería poder responder y quedó muy impresionado con el contenido y el enfoque de esta pregunta y, por lo tanto, con el mismo espíritu, hago esta pregunta al Desarrollador de PHP.
¿A qué preguntas crees que debería responder un buen programador de PHP?
EDITAR : Estoy marcando esta pregunta como wiki de la comunidad, ya que no es específico del usuario y tiene como objetivo servir a la comunidad de programación en general.
Esperando respuestas sorprendentes.
NOTA : responda las preguntas también como se sugiere en los comentarios para que las personas también puedan aprender algo nuevo sobre el idioma.
"¿Cuál es tu depurador favorito?"
"¿Cuál es tu perfilador favorito?"
La aplicación / ide / frontend real no importa tanto si va más allá de "notepad, echo y microtime ()". Es tan improbable que contrate uno en mil millones de desarrolladores que escribe código perfecto todo el tiempo y las pruebas de su unidad detectaron todos los errores y cuellos de botella antes de que ocurran, que usted quiere a alguien que pueda perfilar y / o recorrer el código y encontrar errores en tiempo finito. (Eso es cierto para todos los lenguajes / plataformas, pero parece un conjunto de habilidades subdesarrollado entre los desarrolladores de PHP para mí, puramente subjetivo)
"¿Por qué no estás usando algo más?"
Lo siento, alguien tuvo que decirlo :)
¡Por qué nunca se debe enviar la entrada del usuario directamente!
Imprimir cosas como los datos de GET directamente puede conducir a vulnerabilidades de scripts entre sitios (XSS) . Es por eso que siempre debe enviar la entrada del cliente a través de htmlspecialchars () primero.
¿Cuál es la diferencia entre == y === y por qué te gustaría usar == en absoluto?
¿Cuál es la mejor práctica para escapar de la entrada del usuario? (Esta pregunta parece surgir a menudo)
¿Qué pasa con el siguiente código?
$a = 2;
function foo()
{
$a = 3;
}
foo();
echo $a;
Creo que una buena pregunta sería: ¿cómo funciona HTTP? Trabajar con datos GET
y POST
entre otras comunicaciones HTTP es inherente al desarrollo de PHP. Comprender cómo funciona HTTP en un contexto más amplio y cómo PHP implementa esto recorre un largo camino.
Cuando un sitio se desarrolla utilizando php y es una mierda, es:
a) Falla de PHP
b) Fallo de los programadores
Definitivamente preguntas de seguridad!
(Las respuestas simples en esta publicación, por supuesto, proteger las aplicaciones web de php son mucho más complejas)
- cómo lidiar con la inyección SQL?
mysql_real_escape_string () para comenzar con MySQL. Luego intente aprender PDO para aprovechar las declaraciones preparadas y la portabilidad entre los proveedores de bases de datos.
- ¿Cómo lidiar con CSRF (Falsificación de solicitudes entre sitios)?
Agregue un token en cada solicitud importante para asegurar operaciones importantes (el usuario debe haber visto el formulario antes de enviar la solicitud crucial).
- cómo tratar XSS (Cross-Site Scripting) reflejado y almacenado?
htmlentities () es bueno para empezar.
- variante de inyecciones XXX: inyección LDAP, inyección XPath, etc ...?
Necesita saber cuál es el "vocabulario" utilizado por XXX y luego deducir lo que necesita desinfectar y / o "verificar y rechazar".
- ¿Cuál es la lista de funciones sensatas?
Funciones que interpretan código PHP (posiblemente incluido en un archivo remoto) o que ejecutan comandos en su sistema. Una lista corta e incompleta podría ser: exec (), passthru (), system (), popen (), eval (), preg_replace () ...
- cómo lidiar con los peligros de inclusión de archivos?
- ¿Qué es un camino transversal?
- ¿Cuáles son los riesgos asociados con la carga de archivos?
Necesita una verificación cuidadosa de los parámetros utilizados al abrir archivos o recursos remotos.
- cómo hacer cumplir la configuración de su configuración de PHP (es decir, ¿sabe cuál es el uso de php.ini)?
Va a ser largo, así que omito la respuesta, por favor lea el manual de PHP.
- sobre el filtrado de datos de usuario: ¿cuál es la diferencia entre desinfectar y verificar y rechazar ?
El primero transforma la entrada en algo menos hostil. El segundo revisa si la entrada es correcta y, si no la rechazas.
Es cierto que robé esta pregunta de otro lado (no recuerdo dónde la leí más) pero pensé que era divertida:
P: ¿Qué es T_PAAMAYIM_NEKUDOTAYIM
?
A: Es el operador de resolución de alcance (doble colon)
Un PHP''er experimentado sabe inmediatamente lo que significa. Los desarrolladores menos experimentados (y no hebreos) pueden querer leer this .
Pero preguntas más serias ahora:
P: ¿Cuál es la causa de esta advertencia: ''Advertencia: no se puede modificar la información del encabezado - cabeceras ya enviadas'', y ¿cuál es una buena práctica para evitarlo?
A: Causa: se enviaron los datos del cuerpo y se enviaron los encabezados también.
Prevención: asegúrese de ejecutar primero el código específico del encabezado antes de generar cualquier información del cuerpo. Asegúrese de no haber enviado accidentalmente espacios en blanco u otros caracteres.
P: ¿Qué hay de malo con esta consulta: "SELECT * FROM table WHERE id = $_POST[ ''id'' ]"
?
A: 1. Es vulnerable a la inyección SQL. Nunca use la entrada del usuario directamente en las consultas. Desinfecte primero. Preferiblemente use declaraciones preparadas ( PDO ) 2. No seleccione todas las columnas (*), pero especifique cada columna individual. Esto es predominantemente para evitar que las consultas acaparen la memoria cuando, por ejemplo, se agrega una columna BLOB en algún momento en el futuro.
P: ¿Qué está mal con esta declaración if: if( !strpos( $haystack, $needle ) ...
?
A: strpos
devuelve la posición del índice donde encontró por primera vez $ needle, que podría ser 0
. Como 0
también resuelve como false
la solución es usar una comparación estricta: if( false !== strpos( $haystack, $needle )...
P: ¿Cuál es la forma preferida de escribir este enunciado if y por qué?
if( 5 == $someVar )
o if( $someVar == 5 )
R: El primero, ya que evita la asignación accidental de 5 a $ someVar cuando se olvida de usar 2 signos iguales ( $someVar = 5
), y provocará un error, este último no.
P: Dado este código:
function doSomething( &$arg )
{
$return = $arg;
$arg += 1;
return $return;
}
$a = 3;
$b = doSomething( $a );
... ¿Cuál es el valor de $a
y $b
después de la llamada de función y por qué?
A: $a
es 4
y $b
es 3
. El primero porque $ arg se pasa por referencia, el último porque el valor de retorno de la función es una copia (no una referencia) del valor inicial del argumento.
OOP específico
P: ¿Cuál es la diferencia entre public
, protected
y private
en una definición de clase?
A: public
hace que un miembro de la clase esté disponible para "todos", protected
hace que el miembro de la clase esté disponible solo para sí mismo y para las clases derivadas; private
hace que el miembro de la clase solo esté disponible para la clase en sí.
P: ¿Qué pasa con este código?
class SomeClass
{
protected $_someMember;
public function __construct()
{
$this->_someMember = 1;
}
public static function getSomethingStatic()
{
return $this->_someMember * 5; // here''s the catch
}
}
R: Los métodos estáticos no tienen acceso a $ this, porque los métodos estáticos se pueden ejecutar sin instanciar una clase.
P: ¿Cuál es la diferencia entre una interfaz y una clase abstracta?
R: Una interfaz define un contrato entre una clase implementadora y un objeto que llama a la interfaz. Una clase abstracta define previamente cierto comportamiento para las clases que lo extenderán. Hasta cierto punto esto también puede considerarse un contrato, ya que garantiza la existencia de ciertos métodos.
P: ¿Qué hay de malo en las clases que definen predominantemente getters y setters, que se asignan directamente a sus miembros internos, sin tener realmente métodos que ejecuten el comportamiento?
R: Esto podría ser un olor a código ya que el objeto actúa como una matriz ennoblecida, sin otro uso.
P: ¿Por qué la implementación de PHP del uso de interfaces es subóptima?
R: PHP no le permite definir el tipo de retorno esperado del método, lo que esencialmente hace que las interfaces sean bastante inútiles. :-PAG
Es php cross-browser?
(Lo sé, esto hará reír a mucha gente, ¡pero es la pregunta más hecha en los foros de php!)
Explica la diferencia de
extraer()
explotar()
implode ()
Explica por qué el siguiente código muestra 2.5
lugar de 3
:
$a = 012;
echo $a / 4;
Respuesta: Cuando un número está precedido por un 0
en PHP, el número se trata como un número octal (base-8). Por lo tanto, el número octal 012
es igual al número decimal 10
.
Nadie lo tocó todavía, pero es algo que todo desarrollador de PHP debería poder hablar extensamente: ¿Por qué register_globals
es malo?
Preguntaría algo como:
a) ¿qué pasa con el almacenamiento en caché?
b) ¿cómo se puede organizar el caché?
c) ¿Está seguro de que no realiza consultas DB adicionales? (En mis primeras cosas que hice en PHP, fue una mysql_query dentro de foreach para obtener los nombres de los usuarios que hicieron comentarios ... terrible :))
d) ¿por qué register_globals es malo?
e) ¿por qué y cómo debe dividir la vista del código?
f) ¿Cuál es el objetivo principal de "implementar"?
Aquí hay preguntas que no estaban claras para mí después de haber leído algunos libros básicos. He descubierto todo sobre inyecciones y csx, strpos en unos días / semanas a través de miles de preguntas frecuentes en la web. Pero hasta que encontré las respuestas a estas preguntas, mi código era realmente terrible :)
Terry Chay tiene una publicación de blog que básicamente resume lo que todo desarrollador de PHP debe saber y / o esperar que responda en cierta medida en una entrevista de trabajo.
http://terrychay.com/article/php-coders.shtml
Creo que es un gran resumen.
Al llamar al elemento "nombre" de $ array, ¿cuál es el correcto ?:
-
$array[name]
-
$array[''name'']
Ambas funcionarán a menudo, pero solo la forma citada es correcta.
define(''name'', 0);
y mira los insectos volar. He visto demasiado esto.-
¿Cómo se puede forzar que los elementos del formulario se envíen como una matriz?
Añada corchetes vacíos al atributo de nombre: múltiples
<input type="checkbox" name="checkboxes[]" />
elementos se convertirán a una matriz en el servidor (por ejemplo,$_POST[''checkboxes''][0..n]
) No creo que sea 100% específico de PHP, pero seguro que supera el bucle de$_POST
para cada elemento de''checkboxes''.$i
mysql_, mysqli_ o PDO?
Aquí solo hay una respuesta realmente incorrecta: la biblioteca mysql_ no hace declaraciones preparadas y ya no puede excusar su capacidad para el mal. Nombrar una función, que se espera sea llamada varias veces por consulta ejecutada, "
mysql_real_escape_string()
", es solo una sal en la herida.