Ich habe Fragen durchgearbeitet, die jeder gute .Net-Entwickler beantworten sollte, und war sehr beeindruckt vom Inhalt und Ansatz dieser Frage. In diesem Sinne stelle ich diese Frage auch für PHP-Entwickler.
Welche Fragen sollte ein guter PHP-Programmierer Ihrer Meinung nach beantworten können?
BEARBEITEN : Ich markiere diese Frage als Community-Wiki, da sie nicht benutzerspezifisch ist und der Programmier-Community insgesamt dienen soll.
Ich freue mich auf einige erstaunliche Antworten.
HINWEIS : Bitte beantworten Sie auch die in den Kommentaren vorgeschlagenen Fragen, damit die Benutzer auch etwas Neues in Bezug auf die Sprache lernen können.
Antworten:
Zugegeben, ich habe diese Frage von irgendwo anders gestohlen (kann mich nicht erinnern, wo ich sie noch gelesen habe), fand sie aber lustig:
F: Was ist
T_PAAMAYIM_NEKUDOTAYIM
?A: Es ist der Operator für die Bereichsauflösung (Doppelpunkt)
Ein erfahrener PHP'er weiß sofort, was es bedeutet. Weniger erfahrene (und nicht hebräische) Entwickler möchten dies möglicherweise lesen .
Aber jetzt ernstere Fragen:
F: Was ist die Ursache für diese Warnung: "Warnung: Header-Informationen können nicht geändert werden - Header werden bereits gesendet", und was ist eine bewährte Methode, um dies zu verhindern?
A: Ursache: Körperdaten wurden gesendet, wodurch auch Header gesendet wurden.
Prävention: Stellen Sie sicher, dass Sie zuerst den headerspezifischen Code ausführen, bevor Sie Körperdaten ausgeben. Stellen Sie sicher, dass Sie nicht versehentlich Leerzeichen oder andere Zeichen gesendet haben.
F: Was ist mit dieser Abfrage falsch :
"SELECT * FROM table WHERE id = $_POST[ 'id' ]"
?A: 1. Es ist anfällig für SQL-Injection. Verwenden Sie Benutzereingaben niemals direkt in Abfragen. Desinfizieren Sie es zuerst. Verwenden Sie vorzugsweise vorbereitete Anweisungen ( PDO ). 2. Wählen Sie nicht alle Spalten (*) aus, sondern geben Sie jede einzelne Spalte an. Dies dient vor allem dazu, zu verhindern, dass Abfragen den Speicher belasten, wenn beispielsweise zu einem späteren Zeitpunkt eine BLOB-Spalte hinzugefügt wird.
F: Was ist falsch an dieser if-Anweisung :
if( !strpos( $haystack, $needle ) ...
?A:
strpos
Gibt die Indexposition zurück, an der die $ -Nadel gefunden wurde0
. Da sich0
auchfalse
die Lösung auflöst, ist ein strikter Vergleich zu verwenden:if( false !== strpos( $haystack, $needle )...
F: Was ist die bevorzugte Methode, um diese if-Anweisung zu schreiben, und warum?
if( 5 == $someVar )
oderif( $someVar == 5 )
A: Ersteres, da es die versehentliche Zuweisung von 5 zu $ someVar verhindert, wenn Sie vergessen, 2 Equalsigns (
$someVar = 5
) zu verwenden, und einen Fehler verursacht, letzteres nicht.F: Angesichts dieses Codes:
function doSomething( &$arg ) { $return = $arg; $arg += 1; return $return; } $a = 3; $b = doSomething( $a );
... was ist der Wert von
$a
und$b
nach dem Funktionsaufruf und warum?A:
$a
ist4
und$b
ist3
. Ersteres, weil $ arg als Referenz übergeben wird, letzteres, weil der Rückgabewert der Funktion eine Kopie des Anfangswertes des Arguments ist (kein Verweis darauf).OOP-spezifisch
F: Was ist der Unterschied zwischen
public
,protected
undprivate
in einer Klassendefinition?A:
public
stellt ein Klassenmitglied "allen" zur Verfügung,protected
stellt das Klassenmitglied nur sich selbst und abgeleiteten Klassen zur Verfügung,private
stellt das Klassenmitglied nur der Klasse selbst zur Verfügung.F: Was ist mit diesem Code falsch:
class SomeClass { protected $_someMember; public function __construct() { $this->_someMember = 1; } public static function getSomethingStatic() { return $this->_someMember * 5; // here's the catch } }
A: Statische Methoden haben keinen Zugriff auf $ this, da statische Methoden ausgeführt werden können, ohne eine Klasse zu instanziieren.
F: Was ist der Unterschied zwischen einer Schnittstelle und einer abstrakten Klasse?
A: Eine Schnittstelle definiert einen Vertrag zwischen einer implementierenden Klasse und einem Objekt, das die Schnittstelle aufruft. Eine abstrakte Klasse definiert ein bestimmtes Verhalten für Klassen vor, die es erweitern. Bis zu einem gewissen Grad kann dies auch als Vertrag angesehen werden, da bestimmte Methoden garantiert werden.
F: Was ist falsch an Klassen, die vorwiegend Getter und Setter definieren, die direkt ihren internen Mitgliedern zugeordnet sind, ohne tatsächlich Methoden zu haben, die Verhalten ausführen?
A: Dies kann ein Codegeruch sein, da das Objekt ohne viel andere Verwendung als geadeltes Array fungiert.
F: Warum ist die Implementierung von Schnittstellen durch PHP nicht optimal?
A: Mit PHP können Sie den erwarteten Rückgabetyp der Methode nicht definieren, wodurch Schnittstellen im Wesentlichen ziemlich unbrauchbar werden. :-P
quelle
strpos
Frage könnte ich nicht beantworten, ohne aufzuschauenphp.net/strpos
. Ich habe nicht das Bedürfnis, Gehirnraum zu verschwenden, um das völlige Chaos auswendig zu lernen, das PHPs Grundfunktionen sind, welche -1 zurückgeben, welche falsch, welche null und welche etwas ganz anderes. Die anderen Fragen finde ich allerdings in Ordnung.T_PAAMAYIM_NEKUDOTAYIM
ist ein wertloser Test des relevanten Wissens.5 == $someVar
eine ist eine dumme Frage. Keine Ahnung, warum dieser Codierungsstil so viel Anerkennung findet, wenn er von Natur aus fehlerhaft ist.Definitiv Sicherheitsfragen!
(einfache Antworten in diesem Beitrag, natürlich ist das Sichern von PHP-Webanwendungen weitaus komplexer)
mysql_real_escape_string () für den Anfang mit MySQL. Versuchen Sie dann, PDO zu lernen, um vorbereitete Anweisungen und Portabilität zwischen Datenbankanbietern zu nutzen.
Fügen Sie jeder wichtigen Anforderung ein Token hinzu, um wichtige Vorgänge abzusichern (der Benutzer muss das Formular gesehen haben, bevor er die wichtige Anforderung sendet).
htmlentities () ist zunächst einmal gut.
Sie müssen wissen, welches "Vokabular" vom XXX verwendet wird, und dann abziehen, was Sie zum Desinfizieren und / oder "Prüfen und Ablehnen" benötigen.
Funktionen, die PHP-Code interpretieren (möglicherweise in einer Remote-Datei enthalten) oder Befehle auf Ihrem System ausführen. Eine kurze und unvollständige Liste könnte sein: exec (), passthru (), system (), popen (), eval (), preg_replace () ...
Überprüfen Sie sorgfältig die Parameter, die beim Öffnen von Dateien oder Remote-Ressourcen verwendet werden.
Es wird lange dauern, also überspringe ich die Antwort. Bitte lesen Sie das PHP-Handbuch.
Der erste verwandelt den Eintrag in etwas weniger Feindliches. Der zweite prüft, ob die Eingabe korrekt ist, und lehnt sie ab, wenn nicht.
quelle
"Warum benutzt du nichts anderes?"
Sorry, jemand musste es sagen :)
quelle
Ist PHP Cross-Browser?
(Ich weiß, das wird viele Leute zum Lachen bringen, aber es ist die am häufigsten gestellte Frage in PHP-Foren!)
quelle
Ich denke, eine gute Frage wäre: Wie funktioniert HTTP? Die Arbeit mit
GET
undPOST
Daten unter anderen HTTP-Kommunikationen sind Bestandteil der PHP-Entwicklung. Zu verstehen, wie HTTP in einem breiteren Kontext funktioniert und wie PHP dies implementiert, ist ein langer Weg.quelle
Was ist der Unterschied zwischen == und === und warum sollten Sie == überhaupt verwenden?
quelle
Erklären Sie, warum der folgende Code
2.5
anstelle von angezeigt wird3
:$a = 012; echo $a / 4;
Antwort: Wenn einer Zahl
0
in PHP ein vorangestellt ist , wird die Zahl als Oktalzahl (Basis-8) behandelt. Daher ist die Oktalzahl012
gleich der Dezimalzahl10
.quelle
Noch hat niemand darauf eingegangen, aber es ist etwas, worüber jeder PHP-Entwickler ausführlich sprechen sollte: Warum ist es
register_globals
schlecht?quelle
register_globals
ist genauso schlecht wie ein Entwickler, der eine Variable verwendet, ohne sie vorher zu definieren.Wenn eine Seite mit PHP entwickelt wird und es völliger Mist ist, ist es:
a) PHPs Fehler
b) Programmiererfehler
quelle
Was ist die beste Vorgehensweise, um Benutzereingaben zu entgehen? (Diese Frage scheint oft zu kommen)
quelle
Was ist beim Aufrufen des "name" -Elements von $ array richtig?:
$array[name]
$array['name']
Beides funktioniert oft, aber nur die angegebene Form ist korrekt.
define('name', 0);
und beobachte, wie die Käfer fliegen. Ich habe so viel gesehen.Wie können Sie die Übermittlung von Formularelementen als Array erzwingen?
Fügen Sie dem Namensattribut leere Klammern hinzu: Mehrere
<input type="checkbox" name="checkboxes[]" />
Elemente werden auf dem Server in ein Array konvertiert (z$_POST['checkboxes'][0..n]
. B. ). Ich denke nicht, dass es 100% PHP-spezifisch ist, aber es ist sicher besser$_POST
als jedes mögliche'checkboxes'.$i
Element zu durchlaufen .mysql_, mysqli_ oder PDO?
Nur eine wirklich falsche Antwort hier: Die Bibliothek mysql_ macht keine vorbereiteten Anweisungen und kann ihre Fähigkeit zum Bösen nicht länger entschuldigen. Das Benennen einer Funktion, von der erwartet wird, dass sie mehrmals pro ausgeführter Abfrage aufgerufen wird, "
mysql_real_escape_string()
", ist nur Salz in der Wunde.quelle
"Was ist dein Lieblingsdebugger?"
"Was ist dein Lieblingsprofiler?"
Die eigentliche Anwendung / ide / frontend spielt keine große Rolle, solange sie über "Notepad, Echo und Microtime ()" hinausgeht. Es ist so unwahrscheinlich, dass Sie einen Entwickler in einer Milliarde einstellen, der ständig perfekten Code schreibt, und seine Unit-Tests haben alle Fehler und Engpässe entdeckt, bevor sie überhaupt auftreten, dass Sie jemanden suchen, der den Code profilieren und / oder durchgehen und finden kann Fehler in endlicher Zeit. (Das gilt wahrscheinlich für alle Sprachen / Plattformen, aber es scheint mir eine etwas unterentwickelte Fähigkeit unter PHP-Entwicklern zu sein, rein subjektiv gesprochen)
quelle
Terry Chay hat einen Blog-Beitrag, der im Wesentlichen zusammenfasst, was jeder PHP-Entwickler wissen und / oder in einem Vorstellungsgespräch bis zu einem gewissen Grad beantworten sollte.
http://terrychay.com/article/php-coders.shtml
Ich denke, es ist eine großartige Zusammenfassung.
quelle
Ich würde etwas fragen wie:
a) Was ist mit Caching?
b) Wie kann der Cache organisiert werden?
c) Sind Sie sicher, dass Sie keine zusätzlichen DB-Abfragen durchführen? (In meinen ersten Sachen, die ich auf PHP gemacht habe, war es eine mysql_query in foreach, um Namen von Benutzern zu bekommen, die Kommentare abgegeben haben ... schrecklich :))
d) warum ist register_globals böse?
e) Warum und wie sollten Sie die Ansicht vom Code trennen?
f) Was ist das Hauptziel von "implementieren"?
Hier sind Fragen, die mir nach dem Lesen einiger grundlegender Bücher überhaupt nicht klar waren. Ich habe alles über Injektionen und CSX, Strpos in ein paar Tagen / Wochen durch Tausende von FAQs im Web herausgefunden. Aber bis ich Antworten auf diese Fragen fand, war mein Code wirklich schrecklich :)
quelle
Warum sollten Sie Benutzereingaben niemals direkt ausgeben?
Das direkte Drucken von Daten aus GET kann zu XSS- Schwachstellen (Cross-Site Scripting) führen . Deshalb sollten Sie immer zuerst Eingaben vom Client über htmlspecialchars () senden.
quelle
Erklären Sie den Unterschied von
quelle
Was ist mit dem folgenden Code falsch?
$a = 2; function foo() { $a = 3; } foo(); echo $a;
quelle
$a = 2; function foo() { $a += 3; return $a; } $a = foo(); echo $a;