Pytania każdy dobry programista PHP powinien być w stanie odpowiedzieć [zamknięty]

Przechodziłem przez pytania każdy dobry programista. Net powinien być w stanie odpowiedzieć i byłem pod wielkim wrażeniem treści i podejścia do tego pytania, więc w tym samym duchu zadaję to pytanie programiście PHP.

Jakie pytania Twoim zdaniem powinien być w stanie odpowiedzieć dobry programista PHP?

EDIT: zaznaczam to pytanie jako community wiki, ponieważ nie jest specyficzne dla użytkownika i ma służyć społeczności programistycznej na wolności.

Czekam na niesamowite odpowiedzi.

Uwaga : proszę również odpowiadać na pytania sugerowane w komentarzach, aby ludzie mogli nauczyć się czegoś nowego również w odniesieniu do języka.

 75
php
Author: Rachel, 2010-01-22

17 answers

Co prawda ukradłem to pytanie skądś indziej (nie pamiętam już gdzie to przeczytałem), ale wydawało mi się, że to zabawne:

P: czym jest T_PAAMAYIM_NEKUDOTAYIM?
A: Its operator rozdzielczości zakresu (podwójny dwukropek)

Doświadczony PHP ' er od razu wie, co to znaczy. Mniej doświadczeni (i nie hebrajscy) programiści mogą chcieć przeczytać to .

Ale teraz bardziej poważne pytania:


P: Jaka jest przyczyna tego warning: 'Warning: Cannot modify header information - Headers already sent', and what is a good practice to prevent it?
A: Cause: dane ciała zostały wysłane, powodując wysłanie nagłówków.
Prevention: upewnij się, że najpierw wykonasz kod specyficzny dla nagłówka, zanim wyprowadzisz jakiekolwiek dane ciała. Upewnij się, że nie wysłałeś przypadkowo białych znaków ani żadnych innych znaków.


P: co jest nie tak z tym zapytaniem: "SELECT * FROM table WHERE id = $_POST[ 'id' ]"?
A: 1.[[61]} jest vulnarable do SQL injection. Nigdy nie używaj danych wejściowych użytkownika bezpośrednio w zapytaniach. Najpierw odkaż. Korzystaj z prepared statements (PDO) 2. Nie zaznacza wszystkich kolumn ( * ), ale określa każdą pojedynczą kolumnę. Jest to głównie po to, aby zapobiec gromadzeniu się zapytań w pamięci, gdy na przykład kolumna BLOB zostanie dodana w pewnym momencie w przyszłości.


P: co jest nie tak z tym stwierdzeniem if: if( !strpos( $haystack, $needle ) ...?
A: strpos zwraca pozycja indeksu, gdzie po raz pierwszy znalazł $ igłę, która może być 0. Ponieważ 0 również rozwiązuje się false rozwiązaniem jest użycie ścisłego porównania: if( false !== strpos( $haystack, $needle )...


P: jaki jest preferowany sposób napisania tego if i dlaczego?
if( 5 == $someVar ) lub if( $someVar == 5 )
o: Pierwszy, ponieważ zapobiega przypadkowemu przypisaniu 5 do $someVar, gdy zapomnisz użyć 2 equalsigns ($someVar = 5), i spowoduje błąd, drugi Nie. {[26]]}


P: biorąc pod uwagę to kod:

function doSomething( &$arg )
{
    $return = $arg;
    $arg += 1;
    return $return;
}

$a = 3;
$b = doSomething( $a );

...jaka jest wartość $a i $b po wywołaniu funkcji i dlaczego?
A: $a jest 4 i $b jest 3. Pierwsza ponieważ $arg jest przekazywana przez odniesienie, druga ponieważ wartość zwracana funkcji jest kopią (nie odwołaniem się do) wartości początkowej argumentu.


OOP specific

P: Jaka jest różnica między public, protected i private w klasie definicja?
A: public czyni członka klasy dostępnym dla "wszystkich", protected czyni członka klasy dostępnym tylko dla siebie i klas pochodnych, private czyni członka klasy dostępnym tylko dla samej klasy.


P: co jest nie tak z tym kodem:

class SomeClass
{
    protected $_someMember;

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

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

A: statyczne metody nie mają dostępu do $this, ponieważ statyczne metody mogą być wykonywane bez tworzenia instancji klasy.


P: Jaka jest różnica między interfejsem a klasą abstrakcyjną?
A: interfejs definiuje umowę pomiędzy klasą implementującą is a obiektem wywołującym interfejs. Klasa abstrakcyjna wstępnie definiuje pewne zachowanie dla klas, które będą je rozszerzać. Do pewnego stopnia można to również uznać za umowę, ponieważ gwarantuje ona istnienie pewnych metod.


P: co jest nie tak z klasami, które definiują gettery i settery, które mapują wprost do niego członków wewnętrznych, bez posiadania metod, które wykonują zachowanie?
o: to może być zapach kodu, ponieważ obiekt działa jak uszlachetniona tablica, bez większego użycia.


Q: dlaczego implementacja PHP z wykorzystaniem interfejsów jest nieoptymalna?
A: PHP nie pozwala na zdefiniowanie oczekiwanego typu zwrotu metody, co zasadniczo czyni interfejsy dość bezużytecznymi. :- P

 50
Author: fireeyedboy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-15 19:49:19

Definitywne pytania bezpieczeństwa !

(proste odpowiedzi w tym poście, oczywiście zabezpieczanie aplikacji internetowych php jest znacznie bardziej złożone)

  • Jak radzić sobie z SQL injection ?

Mysql_real_escape_string() na początek MySQL. Następnie spróbuj nauczyć się PDO, aby wykorzystać przygotowane oświadczenia i przenośność między dostawcami baz danych.

  • Jak radzić sobie z CSRF (Cross-Site Request Forgery) ?

Dodaj token do każdego ważnego żądania, aby zabezpieczyć ważne operacje (użytkownik musiał zobaczyć Formularz przed wysłaniem kluczowego żądania).?

  • Jak radzić sobie z XSS (Cross-Site Scripting)?

Htmlentities() jest dobre na początek.

  • wariant zastrzyków XXX: wstrzyknięcie LDAP, wstrzyknięcie XPath itp... ?

Musisz wiedzieć, co to jest" słownictwo "używane przez XXX, a następnie odliczyć to, co musisz wyczyścić i / lub"sprawdzić i odrzucić".

  • Jaka jest lista sensible funkcje ?

Funkcje interpretujące kod PHP (prawdopodobnie zawarte w zdalnym pliku) lub wykonujące polecenia w systemie. Krótka i niekompletna lista może być: exec (), passthru (), system (), popen (), eval (), preg_replace ()...

  • Jak radzić sobie z niebezpieczeństwami dołączania plików ?
  • co to jest ścieżka poprzeczna ?
  • Jakie jest ryzyko związane z przesyłaniem plików ?

Wymaga dokładnego sprawdzenia parametrów użytych przy otwieraniu pliku lub zdalnego zasoby.

  • jak wymusić konfigurację konfiguracji PHP (tzn. czy wiesz jakie jest użycie php.ini)?

To będzie długo, więc pomijam odpowiedź, proszę przeczytać instrukcję PHP.

  • o filtrowaniu danych użytkownika: jaka jest różnica międzydezynfekowaniem Asprawdzaniem i odrzucaniem ?

Pierwszy przekształca wpis w coś mniej wrogiego. Drugi sprawdza, czy wpis jest poprawny, a jeśli nie odmawia to.

 24
Author: Kartoch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-23 00:36:39

"dlaczego nie używasz czegoś innego?"

Sorry, ktoś musiał to powiedzieć:)

 14
Author: kprobst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-22 17:44:14

Czy php jest cross-browser?

(wiem, to sprawi, że wiele osób, ale jest bardziej-zadawane pytanie na forach php!)

 12
Author: Strae,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-22 16:56:03

Myślę, że dobrym pytaniem byłoby: Jak działa HTTP? Praca z danymi GET i POST wśród innych komunikatów HTTP jest nieodłączną częścią rozwoju PHP. Zrozumienie, jak działa HTTP w szerszym kontekście i jak PHP implementuje to idzie długą drogę.

 11
Author: bkildow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-22 11:55:38

Jaka jest różnica między = = A = = i dlaczego w ogóle chcesz używać==?

 9
Author: Michael Stum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-23 00:17:54

Wyjaśnij dlaczego poniższy kod wyświetla 2.5 zamiast 3:

$a = 012;
echo $a / 4;

Odpowiedź: gdy liczba jest poprzedzona 0 w PHP, liczba jest traktowana jako ósemkowa Liczba (baza-8). Dlatego liczba ósemkowa 012 jest równa liczbie dziesiętnej 10.

 9
Author: Nathan Osman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-11 01:48:43

Nikt jeszcze nie poruszył tego tematu, ale jest to coś, o czym każdy programista PHP powinien móc mówić obszernie: dlaczego register_globals jest źle?

 8
Author: markb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-22 18:00:34

Gdy strona jest rozwijana przy użyciu php i to jest kompletna bzdura, prawda:

A) błąd PHPs

B) Błąd programistów

 7
Author: AntonioCS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-22 17:01:33

Jaka jest najlepsza praktyka unikania wprowadzania danych przez użytkownika? (To pytanie pojawia się często)

 6
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-22 16:51:09
  • Podczas wywoływania elementu" name " tablicy$, co jest poprawne?:

    • $array[name]
    • $array['name']

    Oba często działają, ale tylko cytowana forma jest poprawna. I patrzeć jak robale latają. Za dużo tego widziałem.

  • Jak wymusić, aby Elementy formularza były przesyłane jako tablica?

    Dołączenie pustych nawiasów do atrybutu name: wiele elementów {[3] } zostanie przekonwertowanych na tablicę na serwerze (np. $_POST['checkboxes'][0..n]). Nie wiem. myślę, że jest to w 100% specyficzne dla PHP, ale na pewno przebija pętlę przez {[5] } dla każdego możliwego 'checkboxes'.$i elementu.

  • Mysql_, mysqli_, czy PDO?

    Jest tylko jedna naprawdę zła odpowiedź: biblioteka mysql_ nie robi gotowych instrukcji i nie może już usprawiedliwiać swojej zdolności do zła. Nazwanie funkcji, która ma być wywołana wiele razy na wykonane zapytanie, " mysql_real_escape_string()", jest tylko solą w ranie.

 6
Author: tadamson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-22 18:58:46

"jaki jest Twój ulubiony debugger?"
"Jaki jest Twój ulubiony profiler?"

Rzeczywista aplikacja / ide / frontend nie ma większego znaczenia, o ile wykracza poza " notatnik, echo i microtime ()". Jest tak mało prawdopodobne, że zatrudnisz jednego na miliard dewelopera, który cały czas pisze doskonały kod, a jego testy jednostkowe wykryły wszystkie błędy i wąskie gardła, zanim jeszcze wystąpią, że chcesz kogoś, kto może profilować i / lub przejść przez kod i znaleźć błędy w skończonym czasie. (To prawda prawdopodobnie dla wszystkich języków / platform, ale wydaje mi się, że jest to trochę słabo rozwinięty zestaw umiejętności wśród programistów php, czysto subiektywnie mówiąc)

 5
Author: VolkerK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-22 17:49:05

Terry Chay ma wpis na blogu podsumowujący to, co każdy programista PHP powinien wiedzieć i / lub oczekiwać, że odpowie w pewnym stopniu na rozmowie kwalifikacyjnej.

Http://terrychay.com/article/php-coders.shtml

Myślę, że to świetne podsumowanie.

 5
Author: Cody Caughlan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-22 18:06:14

Zapytałbym coś w stylu:

A) a co z buforowaniem?

B) jak zorganizować pamięć podręczną?

C) czy na pewno nie robisz dodatkowych zapytań DB? (W moich pierwszych rzeczach, które zrobiłem na PHP było to mysql_query wewnątrz foreach, aby uzyskać nazwy użytkowników, którzy zrobili komentarze... straszne :))

D) dlaczego register_globals jest złem?

E) dlaczego i jak należy rozdzielać widok od kodu?

F) jaki jest główny cel "wdrożenia"?

Oto pytania, które nie były jasne w ogóle dla mnie po przeczytaniu kilku podstawowych książek. Dowiedziałem się wszystkiego o zastrzykach i csx, strpos w ciągu kilku dni\tygodni przez tysiące FAQ w Internecie. Ale dopóki nie znalazłem odpowiedzi na te pytania mój kod był naprawdę straszny:)

 4
Author: MInner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-10 11:59:23

Dlaczego nigdy nie należy bezpośrednio wysyłać danych wejściowych użytkownika!

Drukowanie takich rzeczy jak dane bezpośrednio z GET może prowadzić do luk w zabezpieczeniach Cross-Site scripting (XSS). Dlatego zawsze należy najpierw wysłać dane wejściowe od klienta za pomocą metody htmlspecialchars ().

 3
Author: lamas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-22 16:52:07

Wyjaśnij różnicę

Extract ()

Explode ()

Implode ()

 2
Author: Zeishi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-13 21:33:50

Co jest nie tak z poniższym kodem?

$a = 2;
function foo()
{
    $a = 3;
}
foo();
echo $a;
 1
Author: Nathan Osman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-24 00:10:03