Frage Fragen, die jeder gute PHP-Entwickler beantworten kann [geschlossen]


Ich ging durch Fragen, die jeder gute .Net-Entwickler beantworten können sollte und ich war sehr beeindruckt von dem Inhalt und der Herangehensweise dieser Frage und deshalb stelle ich diese Frage für PHP Developer.

Welche Fragen Meinst du, sollte es gut sein? PHP-Programmierer in der Lage zu reagieren?

BEARBEITEN : Ich markiere diese Frage als Community-Wiki, da es nicht benutzerspezifisch ist und der Programmiergemeinschaft insgesamt dienen soll.

Ich freue mich auf einige tolle Antworten.

HINWEIS : Bitte beantworte auch Fragen wie in den Kommentaren vorgeschlagen, damit die Leute auch etwas Neues über die Sprache lernen können.


75


Ursprung


Antworten:


Zugegeben, ich habe diese Frage von irgendwo anders gestohlen (kann mich nicht mehr erinnern, wo ich es gelesen habe), dachte aber, dass es lustig ist:

F: Was ist T_PAAMAYIM_NEKUDOTAYIM?
EIN: Es ist der Scope-Resolution-Operator (doppelter Doppelpunkt)

Ein erfahrener PHP'er weiß sofort, was es bedeutet. Weniger erfahrene (und nicht hebräische) Entwickler möchten vielleicht lesen Dies.

Aber ernstere Fragen jetzt:


F: Was ist der Grund für diese Warnung: "Warnung: Header-Informationen können nicht geändert werden - Header bereits gesendet", und was ist eine gute Praxis, um es zu verhindern?
EIN:  Ursache: Body-Daten wurden gesendet, wodurch auch Kopfzeilen gesendet wurden.
Verhütung: Stellen Sie sicher, dass Sie den Header-spezifischen Code zuerst ausführen, bevor Sie Body-Daten ausgeben. Stellen Sie sicher, dass Sie nicht versehentlich Whitespace oder andere Zeichen gesendet haben.


F: Was ist mit dieser Abfrage falsch? "SELECT * FROM table WHERE id = $_POST[ 'id' ]"?
EIN:  1. Es ist anfällig für SQL-Injection. Verwenden Sie Benutzereingaben niemals direkt in Abfragen. Sanitize es zuerst. Verwenden Sie vorzugsweise vorbereitete Aussagen (PDO) 2. Wählen Sie nicht alle Spalten (*) aus, sondern geben Sie jede einzelne Spalte an. Dies ist hauptsächlich dazu gedacht, Abfragen zu verhindern, die Speicherplatz beanspruchen, wenn zum Beispiel zu irgendeinem Zeitpunkt in der Zukunft eine BLOB-Spalte hinzugefügt wird.


F: Was ist falsch an dieser if-Anweisung? if( !strpos( $haystack, $needle ) ...?
EIN:  strpos gibt die Indexposition zurück, wo die Nadel zuerst gefunden wurde 0. Schon seit 0 löst auch auf false Die Lösung besteht im strikten Vergleich: if( false !== strpos( $haystack, $needle )...


F: Was ist der bevorzugte Weg, um diese if-Anweisung zu schreiben, und warum?
if( 5 == $someVar ) oder if( $someVar == 5 )
EIN: Ersteres, da es die zufällige Zuweisung von 5 zu $ ​​someVar verhindert, wenn Sie vergessen, 2 Gleichheitszeichen zu verwenden ($someVar = 5), und wird einen Fehler verursachen, letzteres nicht.


F: Mit diesem Code:

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?
EIN:  $a ist 4 und $b ist 3. Ersteres, weil $ arg als Referenz übergeben wird, Letzteres, weil der Rückgabewert der Funktion eine Kopie des Arguments ist (keine Referenz auf).


OOP spezifisch

F: Was ist der Unterschied zwischen public, protected und private in einer Klassendefinition?
EIN:  public macht ein Klassenmitglied für "alle" verfügbar, protectedmacht das Klassenmitglied nur für sich selbst und abgeleitete Klassen verfügbar, private macht das Klassenmitglied nur für die Klasse selbst verfügbar.


F: Was ist falsch an diesem Code:

class SomeClass
{
    protected $_someMember;

    public function __construct()
    {
        $this->_someMember = 1;
    }

    public static function getSomethingStatic()
    {
        return $this->_someMember * 5; // here's the catch
    }
}

EIN: 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?
EIN: Eine Schnittstelle definiert einen Vertrag zwischen einer implementierenden Klasse is und einem Objekt, das die Schnittstelle aufruft. Eine abstrakte Klasse definiert ein bestimmtes Verhalten für Klassen vor, die sie erweitern. Bis zu einem gewissen Grad kann dies auch als ein Vertrag angesehen werden, da er bestimmte Methoden garantiert.


F: Was ist los mit Klassen, die überwiegend Getter und Setter definieren, die direkt auf ihre internen Mitglieder abbilden, ohne dass sie tatsächlich Methoden haben, die Verhalten ausführen?
EIN: Dies könnte ein Code-Geruch sein, da das Objekt als ein geadeltes Array ohne viel anderen Gebrauch agiert.


F: Warum ist PHP die Verwendung von Schnittstellen suboptimal?
EIN: PHP erlaubt es nicht, den erwarteten Rückgabetyp der Methode zu definieren, der die Schnittstellen im Wesentlichen nutzlos macht. :-P


50



Definitiv Sicherheitsfragen!

(einfache Antworten in diesem Post, natürlich Sicherung php Web-Anwendungen ist viel komplexer)

  • Wie geht man mit SQL-Injection um?

mysql_real_escape_string () für einen Start mit MySQL. Versuchen Sie dann, PDO zu lernen, um die vorbereiteten Anweisungen und die Portabilität zwischen Datenbankanbietern zu nutzen.

  • Wie behandelt man CSRF (Cross-Site Request Forgery)?

Fügen Sie bei jeder wichtigen Anfrage ein Token hinzu, um wichtige Vorgänge abzusichern (der Benutzer muss das Formular gelesen haben, bevor er die entscheidende Anfrage gesendet hat).

  • Wie behandelt man XSS (Cross-Site Scripting) reflektiert und gespeichert?

htmlentities () ist gut für den Anfang.

  • Variante von XXX Injektionen: LDAP-Injektion, XPath-Injektion, etc ...?

Sie müssen wissen, was das "Vokabular" ist, das vom XXX verwendet wird, und dann abziehen, was Sie zum Desinfizieren und / oder zum "Prüfen und Zurückweisen" benötigen.

  • Was ist die Liste der sinnvollen Funktionen?

Funktionen, die PHP-Code interpretieren (möglicherweise in einer Remote-Datei enthalten) oder den Befehl auf Ihrem System ausführen. Eine kurze und unvollständige Liste könnte sein: exec (), passthru (), system (), popen (), eval (), preg_replace () ...

  • Wie geht man mit Dateieinschlussgefahren um?
  • Was ist ein transversaler Weg?
  • Welche Risiken bestehen beim Hochladen von Dateien?

Überprüfen Sie sorgfältig die Parameter, die beim Öffnen von Datei- oder Remote-Ressourcen verwendet werden.

  • Wie erzwinge ich die Konfiguration Ihrer PHP-Konfiguration (d. h. wissen Sie, was php.ini verwendet)?

Es wird lange dauern, also überspringe ich die Antwort. Bitte lesen Sie das PHP-Handbuch.

  • zum Filtern von Benutzerdaten: Worin besteht der Unterschied? Desinfektion und check-and-ablehnen ?

Der erste transformiert den Eintrag in etwas weniger feindseliges. Der zweite prüft, ob der Eintrag korrekt ist, und wenn nicht, lehnen Sie ihn ab.


24



"Warum benutzt du nicht etwas anderes?"

Tut mir leid, jemand musste es sagen :)


14



Ist PHP Cross-Browser?

(Ich weiß, das wird viele Leute zum Lachen bringen, aber das ist die mehr gestellte Frage in PHP-Foren!)


12



Ich denke, eine gute Frage wäre: Wie funktioniert HTTP? Arbeiten mit GET und POST Daten unter anderen HTTP-Kommunikationen sind in der PHP-Entwicklung inhärent. Zu verstehen, wie HTTP in einem breiteren Kontext funktioniert und wie PHP das implementiert, geht weit.


11



Was ist der Unterschied zwischen == und === und warum sollten Sie == überhaupt verwenden?


9



Erklären Sie, warum der folgende Code angezeigt wird 2.5 Anstatt von 3:

$a = 012;
echo $a / 4;

Antworten: Wenn einer Zahl ein a vorangestellt wird 0 In PHP wird die Nummer wie eine behandelt Oktal Nummer (Basis-8). Daher die Oktalzahl 012 ist gleich der Dezimalzahl 10.


9



Bisher hat noch niemand darüber gesprochen, aber es ist etwas, über das jeder PHP-Entwickler ausführlich sprechen könnte: Warum? register_globals Schlecht?


8



Wenn eine Website mit PHP entwickelt wird und es ist völliger Mist, ist es:

a) PHPs Fehler

b) Programmierer Fehler


7