PHP 초보자를 위한 7가지 면접 질문 

PHP 초보자를 위한 7가지 면접 질문 
it-postingPosted On Aug 18, 202411 min read

2024-08-18-IfYouCanAnswerThese7QuestionsCorrectlyYoureDecentatPHP_0.png

아, PHP. 90년대 중반부터 존재해온 언어로, 역할은 뒷단에서 수백만 개의 웹사이트를 제대로 구동하고 있습니다. 몇몇 개발자들은 좋아하고, 다른 사람들은 싫어합니다. 하지만 하나는 확실한데, 웹 개발을 하려면 PHP에 대한 일정 수준의 지식이 필요합니다.

새로운 언어와 프레임워크가 등장하고 있음에도 불구하고, WordPress와 같은 콘텐츠 관리 시스템의 보급으로 PHP는 여전히 중요합니다. 현재 웹의 상당 부분을 구동하고 있습니다.

하지만 실제로 PHP를 충분히 잘 알고 계신가요? 화면에 "Hello, World!"를 출력할 수 있고, 루프와 조건문을 사용하는 데 꽤 자신감이 있을지도 모릅니다.

하지만 더 심각한 내용은, PHP가 이상해지기 시작해서 굉장히 강력한 개발자들에게는 완전히 직관적이지 않다는 것을 증명합니다. 이 글에서는 PHP의 가장 어려운 일곱 가지 질문을 다룰 것입니다.

만약 이 질문들에 답할 수 있다면, PHP에 꽤 능숙한 것뿐만 아니라 고급 프로젝트에 도전할 준비가 되어있을 수도 있습니다. 하나라도 어렵다면 너무 걱정하지 마세요; PHP는 꽤 복잡하며, 경험이 풍부한 개발자들조차 가끔씩 매뉴얼을 참고해야 할 때가 있습니다.

그러니 좋아하는 음료를 즐기고, 의자에 기댓고 PHP의 세계로 떠나 봅시다.

1. PHP에서 ==와 ===의 차이는 무엇인가요?

오래 PHP를 사용해온다면 이미 == 및 === 연산자를 만난 적이 있을 것입니다. 이 연산자는 값을 비교하는 데 사용되는데, 혼동할 수 있을 수도 있지만, 실제로는 그렇지 않습니다.

  • == (느슨한 동등성): 이 연산자는 두 값이 동일한지를 테스트하며 데이터 유형을 확인하지 않습니다. PHP는 형 변환을 시도한 후 비교를 수행합니다. 예를 들어, 문자열 “5”와 정수 5는 동일하게 간주됩니다 (“5” == 5는 참).
  • === (엄격한 동등성): 이 연산자는 값과 유형이 동일한지 확인합니다. 따라서 “5” === 5는 거짓을 반환합니다. 왜냐하면 하나는 문자열이고 다른 하나는 정수이기 때문입니다. PHP는 절대로 형식을 변경하지 않습니다.

이게 왜 중요한가요?

== 을 사용하면 예상치 못한 결과가 발생할 수 있습니다, 특히 유형이 다를 수 있는 값들을 비교할 때. 이것을 고려해 보세요:

IfYouCanAnswerThese7QuestionsCorrectlyYoureDecentatPHP_1

이 조건이 true로 평가된다는 것에 놀랐나요! 그 이유는 PHP가 정수와 비교되는 비숫자 문자열을 0으로 취급하여 0 == 'string'이 true로 평가되기 때문입니다. 무서운 일이네요, 맞죠?

반면에 ===을 사용하면 이를 방지할 수 있습니다:

IfYouCanAnswerThese7QuestionsCorrectlyYoureDecentatPHP_2

여기서 비교 결과는 예상대로 false를 반환합니다.

2. PHP 트레이트는 무엇이며 어떻게 작동합니까?

언제든지 서로 직접적으로 관련이 없는 클래스 간에 메서드를 공유해야 하는 상황에 빠졌을 때 PHP 트레이트가 도와줄 것입니다. 트레이트를 사용하면 상속을 사용하지 않고 여러 클래스 간에 메서드를 공유할 수 있게 해줍니다.

기본적인 예시:

두 개의 클래스가 있다고 가정해보세요: User와 Admin이며, 둘 다 파일에 작업을 기록해야 합니다. 그래서 두 클래스 모두 함수를 복사하지 말고 trait을 사용해야 합니다.

image

이 예제에서, User 및 Admin 클래스는 공통 상위 클래스를 갖거나 직접 공통 선조로부터 상속받지 않고도 log 메서드에 액세스할 수 있습니다.

왜 Traits를 사용해야 하나요?

특성은 관련이 없는 클래스에 기능을 혼합하는 방법을 제공합니다. 특히 중대규모 애플리케이션에서는 유용한 기능으로 판명되었습니다. 그렇지 않으면 유사한 행동이 필요한 여러 클래스가 상속의 엄청난 크고 복잡하게 얽힌 웹을 만들지 않고 행동할 수 있습니다.

하지만 속담에 나와 있는 대로, 큰 권한은 큰 책임을 수반합니다. 특성은 신중하게 사용해야 합니다. 지나치게 사용하면 코드가 엉킨 코드로 또는 이 방법이 어디서 비롯된 메서드인지 명확히 알 수 없는 상황으로 이어질 수 있습니다. 특성에 지나치게 의존하는 것을 발견하면 클래스 설계를 재고해야 할 때가 올 수도 있습니다.

3. PHP는 세션을 어떻게 처리하며 최상의 실천 방법은 무엇인가요?

일반적으로, 세션이란 클라이언트와 서버 간의 일정 기간 동안 발생하는 상호 작용입니다. PHP에서 세션 관리는 클라이언트 측 쿠키와 서버 측 저장소를 통해 제어됩니다.

PHP에서 세션 작업하기

session_start() 함수로 세션을 시작하면 PHP는 서버 내에 새 세션 파일을 생성하고 동시에 고유한 세션 ID를 쿠키로 클라이언트 측에 전송합니다.

이 파일에는 다양한 사용자 데이터가 포함되어 있어서 응용 프로그램 내에서 각 페이지 전환이 발생할 때마다 이를 보존할 수 있습니다.

PHP 이미지

다음 코드는 세션을 설정하고 사용자의 이름을 세션 데이터에 저장합니다. 세션이 만료되지 않은 경우, 이 값을 다음 요청에서 검색할 수 있습니다.

image

세션의 최선의 방법:

  • 세션 ID 보안: 세션 ID가 URL에 표시되지 않도록하십시오. 일정 간격으로 세션 ID를 계속 재생성하면 세션 고정 공격을 방지할 수 있습니다. 민감한 작업(예: 로그인) 후에 session_generate_id()를 적용하는 것이 좋습니다.
  • HTTPS: 세션 쿠키의 전송은 항상 HTTPS를 통해 이루어져야 합니다. 중간자 공격을 통한 세션 탈취를 방지하기 위해서입니다.
  • 쿠키 설정: HttpOnly 및 Secure와 같은 올바른 쿠키 플래그를 설정하여 XSS에 의한 세션 쿠키 도난 위험을 줄입니다.
  • 세션 만료: 합리적인 세션 만료 및 비활동 시간 초과를 구현하여 비활성 세션이 공격자에 의해 인계되는 위험을 줄입니다.

안전한 세션 설정 예시:

이미지

이 예시에서 세션 쿠키는 HTTP를 통해서만 접근할 수 있도록 플래그가 설정되어 있고 JavaScript를 통해서는 접근할 수 없습니다. 즉, 안전한 HTTPS 연결을 통해서만 전송됩니다. 또한 세션 ID는 변경되어 Fixation 공격의 위험을 줄입니다.

세션에 어려움이 있다면, 이것을 확인해보세요:

4. include, require, include_once, require_once의 차이점을 정의합니다.

PHP는 파일을 포함하고 실행하는 여러 가지 방법을 제공합니다. 이는 다른 PHP 스크립트 내에서 발생합니다. 처음에는 차이가 사소해 보일 수 있습니다. 그러나 세부 사항은 이들을 구분짓습니다. 이들은 각각 고유한 목적을 수행합니다.

  • include: 이 표현은 파일을 포함하고 평가합니다. PHP는 지정된 파일을 찾습니다. 파일을 찾지 못하면 PHP는 경고를 발생시킵니다. 그러나 스크립트는 계속 실행됩니다.
  • require: include와 유사한 점이 있습니다. 파일을 평가합니다. PHP가 파일을 찾지 못하면 치명적입니다. 이는 오류로 이어집니다. 그런 다음 실행이 중단됩니다.
  • require_once: 이는 require 문과 유사합니다. 하지만 include_once와 같이 단일 포함만 보장합니다.
  • include_once: 이것은 include로 작동합니다. 그러나 파일이 한 번만 포함되도록 보장합니다. 스크립트의 실행이 이를 유발시킵니다. 파일이 이미 포함되어 있는 경우 다시 포함하지 않습니다.

파일의 중요성이 크거나(예: 구성 파일) 파일이 없는 것이 바람직하지 않은 경우 require를 사용하십시오. 이 경우 응용 프로그램이 계속 실행되길 원하지 않을 수 있습니다. 파일의 비필수적인 중요성이 있는 경우에는 include를 사용하십시오. 비필수적인 중요성을 가진 스크립트나 템플릿이 예시입니다.

*require_once 표현식을 사용해보세요. 이는 잠재적 문제를 피하기 위한 것입니다. 문제는 파일을 여러 번 포함할 때 발생할 수 있습니다. 이 문제에는 클래스 또는 함수 재선언이 포함됩니다.

이 상황에서는 db_config.php 파일이 있습니다. 이 파일은 데이터베이스 작업을 실행하는 데 중요합니다. 그래서 이를 포함합니다. 이는 require_once를 사용하여 이루어집니다.

반면에 사이드바 템플릿은 선택적 모듈입니다. 이를 포함해도 정상적인 작업에는 필요하지 않습니다.

5. PHP의 매직 메서드를 설명해줄 수 있을까요?

매직 메서드는 특별한 메서드들입니다. 이들은 더블 언더스코어(__)로 시작합니다. 그들은 독특한 역할을 합니다.

매직 메서드들은 특정 동작이 객체에서 발생할 때 이를 재정의하고 실행할 수 있는 기능을 제공합니다. 자주 사용되는 매직 메서드들을 살펴보겠습니다:

  • include_once: 이 메서드는 include 역할을 합니다. 그러나 파일이 한 번만 포함되도록 보장합니다. 스크립트 실행이 이를 독려합니다. 이미 포함된 파일인 경우 다시 포함하지 않습니다.
  • __construct(): 이 메서드는 생성자 메서드를 나타냅니다. 객체가 인스턴스화될 때 자동으로 호출됩니다.
  • __destruct(): 소멸자 메서드를 다루는데 사용됩니다. 객체가 해체되거나 스크립트가 종료될 때 호출됩니다.
  • __get($name): 이 메서드는 접근할 수 없는 속성을 읽으려고 시도하거나 실제로 존재하지 않을 때 호출됩니다.
  • __set($name, $value): 이 메서드는 접근할 수 없는 속성에 대한 대체가 발생했을 때 또는 존재하지 않는 속성이 작성될 때 호출됩니다.
  • __isset($name): 접근할 수 없는 속성 또는 실제로 존재하지 않는 속성에 대해 isset() 또는 empty()를 호출할 때 제어됩니다.
  • __unset($name): 접근할 수 없는 가상 속성 또는 실제로 존재하지 않는 속성에 대해 unset()이 사용될 때 작동합니다.
  • __call($name, $arguments): 존재하지 않는 메서드에 접근하려고 시도할 때 발생하며 해당 메서드도 접근할 수 없습니다.
  • **callStatic($name, $arguments): **call() 메서드와 유사하지만 정적 메서드에 대해 작동합니다.
  • __toString(): 객체가 문자열로 사용될 때 호출됩니다. 예를 들어 echo를 사용하면 발생할 수 있습니다.
  • __invoke(): 객체를 함수처럼 호출할 때 사용됩니다.

마법 메서드 사용 예시:

2024-08-18-IfYouCanAnswerThese7QuestionsCorrectlyYoureDecentatPHP_8.png

이 예제에서는 **get과 **set 메서드가 연관 배열에서 동적 속성 관리를 가능하게 하고,__toString은 객체의 문자열 표현을 제공합니다.

6. PHP 네임스페이스는 어떻게 작동하며 왜 중요한가요?

PHP에서의 네임스페이스는 중요합니다. 이들은 이름 충돌을 방지합니다. 큰 프로젝트에서 이러한 충돌은 흔히 발생합니다. 또한, 서드 파티 라이브러리를 사용할 때도 자주 발생합니다. PHP에서는 관련된 클래스 함수 및 상수를 연관시킬 수 있게 허용합니다. 이들을 특정 제목 아래에 모아둘 수 있습니다.

User belongs to the App\Model namespace

위 코드에서 User는 App\Model 네임스페이스에 속합니다. 즉, 앱 내에 다른 사용자 클래스가 있을 수 있지만 모두 사용할 수 있습니다.

Different user class in the app

table 태그를 Markdown 형식으로 변경할 수도 있습니다.

image

네임스페이스의 중요성

네임스페이스는 중요한 역할을 합니다. 프로젝트에서 이름 충돌을 방지합니다. 특히 대규모 사업에서 이는 특히 참된 것입니다.

프로젝트가 확장되면 동일한 이름을 가진 여러 클래스가 발생할 가능성이 높아집니다. 네임스페이스는 클래스를 그룹화하여 도와주기 때문에 유용합니다. 이들은 충돌을 방지하기 위해 안전하게 둘러싸줍니다.

애플리케이션의 다양한 부분에서 동일한 클래스 이름을 사용할 수 있습니다. 네임스페이스는 제한이 있지만 이를 장점으로 느낄 수 있습니다. 디자인에서 보다 더 큰 유연성을 제공하고, 다양한 구성 요소를 관리하는 데 도움이 됩니다.

  1. 네임스페이스 사용의 일관성: 각 클래스를 네임스페이스에 넣어주십시오. 이것은 작은 프로젝트에도 적용됩니다. 그 이유는? 일관성을 유지하기 위해서입니다. 또한 미래를 대비한 코드 작성이 됩니다.

  2. PSR-4 준수: 여기에서 따라야 할 표준이 있습니다. 이것은 PSR-4 표준에서 권장됩니다. 파일 구조는 네임스페이스의 레이아웃을 반영해야 합니다. 예를 들어보겠습니다. App/Models/User라는 클래스를 생각해보세요. 이것은 User.php라는 파일에 포함되어야 합니다.

  1. 깊게 중첩된 네임스페이스를 피하세요: 네임스페이스는 코드 관리에 도움이 됩니다. 하지만 여전히 어려움을 가지고 있습니다. 이는 도전적인 일입니다. 깊게 중첩된 네임스페이스는 이 문제를 악화시킬 수 있습니다. 보다 복잡성을 도입하게 될 것입니다.

7. PHP 클로저가 정확히 뭔가요? 어떻게 활용되나요?

PHP 클로저는 때때로 익명 함수라고 불리기도 합니다. 실제 이름이 없는 것이 특징입니다. 이 함수들은 보통 다른 함수에 입력으로 정의되고 적용됩니다. PHP 클로저는 변수 캡처의 잠재력과 함께 강력한 기능을 제공합니다.

이미지

예를 들어 예제에서 $greet을 고려해보세요. $greet의 정의는 클로저를 보여줍니다. 클로저는 매개변수를 가져와 문자열을 출력합니다. $greet을 일반 변수처럼 다룰 수 있습니다.

클로저로 닫기:

클로저의 특징 중 하나는 부모 스코프에서 변수를 캡처할 수 있는 능력입니다. 이는 use 키워드를 사용하여 수행됩니다.

이미지

실제 시나리오에서의 클로저:

클로저는 array_map 또는 array_filter와 같은 배열 함수와 같이 콜백 함수에서 일반적으로 사용됩니다:

img

이 경우 array_map에 전달된 클로저가 있습니다. 이는 변환을 적용합니다. 이 변환은 배열의 각 요소에 적용됩니다.

결론:

질문에 답할 수 있었나요? 이 일곱 가지 질문의 내용을 제대로 이해했다면 축하해요! PHP 학습에 확실한 이해력을 가지고 있는 거에요. 이러한 질문들은 PHP의 깊은 부분을 보여줍니다.

이를 마스터하면 능률적인 개발자로 성장할 거에요. PHP는 특이한 면이 있기는 하지만 믿을 수 없을 만큼 적응력이 뛰어나요. 더불어 광범위하게 사용되고 있어요. 미묘한 점들을 명확하게 이해하면 탁월하게 이끌어줄 거에요.

예를 들어 안전한 세션 관리를 이해하는 것이 중요해요. 엄격한 비교를 언제 사용해야 하는지 아는 것도 중요해요. 또한 특징과 네임스페이스로 코드를 구조화하는 방법을 알아내는 것도 중요해요. 이런 것들을 함께 알면 다른 개발자들과 차별화될 수 있어요.

일관된 학습과 연습. 새로운 프로젝트로 계속 도전해 보세요. 그 과정에서 두려움을 갖지 마세요. 본질적인 언어 구성 요소에 대해 망설임 없이 파고 들어보세요.

지식이 많아질수록 준비가 되어갑니다. 준비가 중요합니다. 앞으로 다가올 어떤 도전에도 효과적으로 대처할 준비가 되어야 합니다. 지속적인 학습의 길은 가혹할 수 있습니다. 그러나 보람있는 여정이기도 합니다.

여기까지 오신 것을 축하해요 🎉

  • 👏 이야기에 박수를 보내주시면 기사를 더 널리 퍼뜨리는 데 도움이 됩니다. (50 박수).
  • 📩 뉴스레터를 구독하고 싶으시다면: https://yunus-emre-adas.ck.page/c090914848

아래 링크를 통해 저에게 연락할 수 있습니다:

제 다른 글들을 읽으려면: