정보실

웹학교

정보실

php 직업을 구할 수도 있는 중요한 PHP 면접 질문

본문

호주의 평균 PHP 개발자 급여는 연간 $95,000 또는 시간당 $48.72입니다. 

엔트리 레벨 직책은 매년 $55,000에서 시작하는 반면 대부분의 숙련된 근로자는 매년 최대 $161,500를 합니다. 

당신을 구할 수도 있는 45 가지 중요한 PHP 인터뷰 질문을 따라 배우십시오.


https://dev.to/aershov24/45-important-php-interview-questions-that-may-land-you-a-job-1794 


Q1 : ==와 ===의 차이점은 무엇입니까? 


  • 연산자 ==는 서로 다른 두 가지 유형 사이에 캐스팅 됩니다.
  • === 연산자는 'typesafe 비교'를 수행합니다.

즉, 두 피연산자가 동일한 유형과 동일한 값을 갖는 경우에만 true를 리턴 합니다.


1 === 1: true
1 == 1: true
1 === "1": false // 1 is an integer, "1" is a string
1 == "1": true // "1" gets casted to an integer, which is 1
"foo" === "foo": true // both operands are strings and have the same value


Q2 : 변수를 참조로 어떻게 전달할 수 있습니까? 


참조로 변수를 전달할 수 있도록 다음과 같이 앞에 앰퍼샌드를 사용합니다.


$var1 = &$var2


Q3 : $GLOBALS는 무엇을 의미합니까? 


$GLOBALS는 현재 스크립트의 전체 범위에 정의 된 모든 변수에 대한 참조를 포함하는 연관 배열입니다.


Q4 : ini_set()의 사용법은 무엇입니까? 


PHP는 사용자가 ini_set()을 사용하여 php.ini에 언급 된 일부 설정을 수정할 수 있도록 합니다. 이 함수에는 두 개의 문자열 인수가 필요합니다. 첫 번째는 수정할 설정의 이름이고 두 번째는 할당 할 새 값입니다.


지정된 코드 줄은 스크립트가 사용 중지 된 경우 display_error 설정을 사용하도록 설정합니다.


ini_set('display_errors', '1'); 


위의 문장을 스크립트의 맨 위에 두어야 설정이 끝날 때까지 활성화 된 상태로 유지됩니다. 또한 ini_set()을 통해 설정된 값은 현재 스크립트에만 적용됩니다. 그 후, PHP는 php.ini의 원래 값을 사용하기 시작합니다.


Q5 : require 대 include은 언제 사용해야 합니까?


require() 함수는 오류를 다르게 처리한다는 점을 제외하면 include()와 동일합니다. 오류가 발생하면 include() 함수가 경고를 생성하지만 스크립트는 계속 실행됩니다. require()는 치명적인 오류를 생성하고 스크립트가 중지됩니다.


내 제안은 99.9%의 시간을 require_once 사용하는 것입니다.


require 또는 include를 대신 사용하면 코드를 다른 곳에서 재사용 할 수 없다는 것을 의미합니다. 즉, 가져 오는 스크립트가 클래스 또는 일부 함수 라이브러리를 사용하는 대신 실제로 코드를 실행합니다.


Q6 : PHP에서 stdClass 란 무엇입니까? 


stdClass는 다른 유형을 객체에 캐스트 할 때 사용되는 일반적인 '빈'클래스입니다. stdClass는 PHP에서 객체의 기본 클래스가 아닙니다. 이것은 상당히 쉽게 입증 될 수 있습니다 :


class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N'; // outputs 'N'


익명 객체, 동적 속성 등에 유용합니다.


StdClass를 고려하는 쉬운 방법은 연관 배열의 대안입니다. 

json_decode()가 StdClass 인스턴스 또는 연관 배열을 얻는 방법을 보여주는 아래 예제를 참조하십시오.


이 예제에서는 표시되지 않았지만 SoapClient :: __ soapCall은 StdClass 인스턴스를 반환합니다.


//Example with StdClass
$json = '{ "foo": "bar", "number": 42 }';
$stdInstance = json_decode($json);

echo $stdInstance - > foo.PHP_EOL; //"bar"
echo $stdInstance - > number.PHP_EOL; //42

//Example with associative array
$array = json_decode($json, true);

echo $array['foo'].PHP_EOL; //"bar"
echo $array['number'].PHP_EOL; //42


Q7 : PHP에서 die()와 exit() 함수의 차이점은 무엇입니까? 


차이점은 없습니다. 동일합니다. exit()보다 die()를 선택할 때의 유일한 장점은 추가 문자를 입력 할 때 시간을 절약 할 수 있다는 것입니다.


Q8 : const와 define 주요 차이점은 무엇입니까? 


const와 define의 근본적인 차이점은 const는 컴파일 타임에 상수를 정의하고 define은 런타임에 상수를 정의한다는 것입니다.


const FOO = 'BAR';
define('FOO', 'BAR');

// but
if (...) {
    const FOO = 'BAR';    // Invalid
}
if (...) {
    define('FOO', 'BAR'); // Valid
}


또한 PHP 5.3까지 const는 전역 범위에서 사용할 수 없습니다. 클래스 내에서만 사용할 수 있습니다. 

일정 종류의 상수 옵션을 설정하거나 해당 클래스와 관련된 설정을 하려는 경우에 사용해야 합니다. 또는 일종의 열거 형을 만들고 싶을 수도 있습니다. const 사용이 좋은 예는 매직 넘버를 없애는 것입니다.


Define은 동일한 목적으로 사용될 수 있지만 전역 범위에서만 사용할 수 있습니다. 전체 응용 프로그램에 영향을 미치는 전역 설정에만 사용해야 합니다.


조건부 또는 표현식 정의 유형이 필요하지 않은 경우, 단순히 가독성을 위해 define() 대신 const를 사용하십시오!


Q9 : isset()과 array_key_exists()의 차이점은 무엇입니까? 


  • array_key_exists는 배열에 키가 존재하는지 알려주고 $a가 없으면 불평합니다.
  • isset은 키/변수가 존재하고 null이 아닌 경우에만 true를 반환합니다. $a가 없으면 isset이 불평하지 않습니다.
$a = array('key1' => 'Foo Bar', 'key2' => null);

isset($a['key1']);             // true
array_key_exists('key1', $a);  // true

isset($a['key2']);             // false
array_key_exists('key2', $a);  // true


Q10 : var_dump()와 print_r()의 차이점은 무엇입니까? 


  • var_dump 함수는 유형 및 값을 포함하여 변수/표현에 대한 구조화 된 정보를 표시합니다. 배열은 구조를 보여주기 위해 들여 쓰기 된 값으로 반복적으로 탐색 됩니다. 또한 어떤 배열 값과 객체 속성이 참조인지 보여줍니다.
  • print_r()은 사람이 읽을 수 있는 방식으로 변수에 대한 정보를 표시합니다. 배열 값은 키와 요소를 표시하는 형식으로 표시됩니다. 객체에도 비슷한 표기법이 사용됩니다.
$obj = (object) array('qualitypoint', 'technologies', 'India');

var_dump($ obj)가 화면의 출력 아래에 표시됩니다.


object(stdClass)#1 (3) {
 [0]=> string(12) "qualitypoint"
 [1]=> string(12) "technologies"
 [2]=> string(5) "India"
}


그리고 print_r($ obj)은 화면에 아래 출력을 표시합니다.


stdClass Object ( 
 [0] => qualitypoint
 [1] => technologies
 [2] => India
)


Q11 : (notice, warning, fatal error) 다른 PHP 오류가 무엇인지 설명하십시오 


  • notice는 정의되지 않은 변수와 같이 사소한 것으로서 실행 중 문제가 발생했음을 나타내는 중요하지 않은 오류입니다.
  • warning은 include() 명령이 존재하지 않는 파일을 검색하는 경우와 같이 더 심각한 오류가 발생하면 경고가 표시됩니다. 이 오류와 위의 오류 모두에서 스크립트가 계속됩니다.
  • fatal error는 코드를 종료합니다. 예를 들어 require()를 충족시키지 못하면 이러한 유형의 오류가 발생합니다.

Q12 : PHP에서 오류 보고를 어떻게 활성화 할 수 있습니까? 


php.ini에서“display_errors”가“on”인지 확인하거나 스크립트에서“ini_set ( 'display_errors', 1)”을 선언하십시오.


그런 다음 코드에“error_reporting (E_ALL)”을 포함 시켜 스크립트 실행 중에 모든 유형의 오류 메시지를 표시하십시오.


Q13 : 기본 파라미터로 일부 함수 선언 


function showMessage($hello = false){
  echo ($hello) ? 'hello' : 'bye';
}


Q14 : PHP에서 다중 상속이 지원됩니까? 


PHP는 단일 상속만 지원합니다. 이는 'extended'키워드를 사용하여 하나의 단일 클래스에서만 클래스를 확장 할 수 있음을 의미합니다.


Q15 : PHP에서 객체는 값이나 참조로 전달됩니까? 


PHP에서 객체는 값으로 전달됩니다.


Q16 : $a! = $b와 $a! == $b의 차이점은 무엇입니까? 


!=는 불평등 ($a가 $b와 같지 않으면 TRUE)을 의미하고 !==는 동일하지 않음 ($a가 $b와 동일하지 않으면 TRUE)을 의미합니다.


Q17 : PHP에서 PDO 란 무엇입니까? 


PDO는 PHP Data Object의 약자입니다.


핵심 PDO 클래스 및 데이터베이스, 특정 드라이버를 제공하는 PHP 확장 세트입니다. 벤더 중립적이며 가벼운 데이터 액세스 추상화 계층을 제공합니다. 따라서 어떤 데이터베이스를 사용하든 쿼리를 발행하고 데이터를 가져 오는 기능은 동일합니다. 

데이터베이스 추상화가 아닌 데이터 액세스 추상화에 중점을 둡니다.


Q18 : PHP에서 예외를 처리하는 방법을 설명 하시겠습니까? 


예외가 발생하면 명령문 뒤의 코드가 실행되지 않으며 PHP는 첫 번째 일치하는 catch 블록을 찾으려고 시도합니다. 예외가 발견되지 않으면 "치명되지 않은 예외"와 함께 PHP 치명적 오류가 발생합니다. PHP 내에서 예외가 발생하여 포착 될 수 있습니다.


예외를 처리하기 위해 코드를 try 블록으로 묶을 수 있습니다. 각 시도에는 하나 이상의 해당 catch 블록이 있어야 합니다. 여러 클래스의 예외를 포착하기 위해 여러 catch 블록을 사용할 수 있습니다. catch 블록 내에서 예외가 발생 (또는 다시 발생) 될 수 있습니다.


try {
    print "this is our try block n";
    throw new Exception();
} catch (Exception $e) {
    print "something went wrong, caught yah! n";
} finally {
    print "this part is always executed n";
}


Q19 : echo와 print()의 구별 


echo와 print는 거의 동일합니다. 둘 다 화면에 데이터를 출력하는 데 사용됩니다.


차이점은 다음과 같습니다.

  • echo는 리턴 값이 없는 반면 print는 리턴 값이 1이므로 표현식에 사용될 수 있습니다.
  • echo는 여러 매개 변수를 사용할 수 있지만 (이러한 사용법은 드물지만) print는 하나의 인수를 취할 수 있습니다.
  • echo가 print보다 빠릅니다.

Q20 : require_once와 require는 언제 사용해야 합니까? 


require_once() 문은 require()와 동일합니다. 단, PHP는 파일이 이미 포함되어 있는지 확인하고, 포함되어 있으면 다시 포함시키지 않아야 합니다.


내 제안은 99.9 %의 시간을 require_once 사용하는 것입니다.


require 또는 include를 대신 사용하면 코드를 다른 곳에서 재사용 할 수 없다는 것을 의미합니다. 즉, 가져 오는 스크립트가 클래스 또는 일부 함수 라이브러리를 사용하는 대신 실제로 코드를 실행합니다.


Q21 : PHP 배열이 연관되어 있는지 확인 


function has_string_keys(array $array) {
  return count(array_filter(array_keys($array), 'is_string')) > 0;
}


하나 이상의 문자열 키가 있으면 $array는 연관 배열로 간주됩니다.


Q22 : 변수와 ​​데이터를 PHP에서 JavaScript로 어떻게 전달합니까? 


실제로 몇 가지 방법이 있습니다.

  • AJAX를 사용하여 서버에서 필요한 데이터를 가져옵니다. get-data.php를 고려하십시오.
echo json_encode(42);

index.html을 고려하십시오.


<script>
    function reqListener () {
      console.log(this.responseText);
    }

    var oReq = new XMLHttpRequest(); // New request object
    oReq.onload = function() {
        // This is where you handle what to do with the response.
        // The actual data is found on this.responseText
        alert(this.responseText); // Will alert: 42
    };
    oReq.open("get", "get-data.php", true);
    //                               ^ Don't block the rest of the execution.
    //                                 Don't wait until the request finishes to
    //                                 continue.
    oReq.send();
</script>


  • 데이터를 페이지 어딘가에 echo하고 JavaScript를 사용하여 DOM에서 정보를 가져옵니다.


<div id="dom-target" style="display: none;">
    <?php
        $output = "42"; // Again, do some operation, get the output.
        echo htmlspecialchars($output); /* You have to escape because the result
                                           will not be valid HTML otherwise. */
    ?>
</div>
<script>
    var div = document.getElementById("dom-target");
    var myData = div.textContent;
</script>
  • 데이터를 JavaScript로 직접 echo하십시오.
<script>
    var data = <?php echo json_encode("42", JSON_HEX_TAG); ?>; // Don't forget the extra semicolon!
</script>


Q23 : PHP 배열을 다른 것으로 복사하는 기능이 있습니까? 


PHP에서 배열은 복사로 할당되고 객체는 참조로 할당되므로 PHP는 기본적으로 배열을 복사합니다. PHP의 참조는 명시적이어야 합니다.


$a = array(1,2);
$b = $a; // $b will be a different array
$c = &$a; // $c will be a reference to $a


Q24 :이 코드는 무엇을 반환합니까? 


코드를 고려하십시오 :


$a = new stdClass();
$a->foo = "bar";
$b = clone $a;
var_dump($a === $b);


콘솔에 무엇이 에코됩니까?


동등한 멤버를 가진 동일한 클래스의 두 인스턴스는 === 연산자와 일치하지 않습니다. 답은 다음과 같습니다.


bool(false)


Q25 :이 코드는 무엇을 반환합니까? 결과를 설명하십시오. 


코드를 고려하십시오. 결과적으로 무엇이 반환 됩니까?


$something = 0;
echo ('password123' == $something) ? 'true' : 'false';


대답은 true. 문자열 비교에 ==를 사용해서는 안됩니다. 문자열을 문자열과 비교하더라도 PHP는 암시적으로 부동소수점으로 캐스트하고 숫자로 표시되면 숫자를 비교합니다. === 괜찮습니다.


예를 들어


'1e3' == '1000' // true


또한 true를 반환합니다.


Q26 : array_map, array_walk 및 array_filter의 차이점은 정확히 무엇입니까? 


  • array_walk는 배열과 함수 F를 가져와 모든 요소 x를 F(x)로 바꿔서 수정합니다.
  • array_map은 위치를 수정하는 대신 변환 된 요소가 포함 된 새 배열을 반환한다는 점을 제외하고는 똑같은 작업을 수행합니다.
  • 요소를 변환하는 대신 함수 F가있는 array_filter는 F(x)가 true가 아닌 요소를 제거합니다.

Q27 : exec() vs system() vs passthru()의 차이점을 설명 하시겠습니까? 


  • exec()는 시스템 명령을 호출하고 출력을 직접 처리하기 위한 것입니다.
  • system()은 시스템 명령을 실행하고 즉시 출력 (아마도 텍스트)을 표시하기 위한 것입니다.
  • passthru()는 아마도 원시 바이너리로부터 원천적 인 리턴을 원하는 시스템 명령을 실행하기 위한 것입니다.

Q28 : PHP를 사용하여 싱글턴 클래스를 어떻게 만들 수 있습니까? 


/**
 * Singleton class
 *
 */
final class UserFactory {
    /**
     * Call this method to get singleton
     *
     * @return UserFactory
     */
    public static
    function Instance() {
        static $inst = null;
        if ($inst === null) {
            $inst = new UserFactory();
        }
        return $inst;
    }

    /**
     * Private ctor so nobody else can instantiate it
     *
     */
    private
    function __construct() {

    }
}


사용:


$fact = UserFactory::Instance();
$fact2 = UserFactory::Instance();


그러나:


$fact = new UserFactory()


오류가 발생합니다.


Q29 : PDO의 query()와 execute()의 차이점은 무엇입니까? 


  • query는 표준 SQL 문을 실행하며 SQL 주입 및 기타 문제를 피하기 위해 모든 데이터를 올바르게 이스케이프해야 합니다.
  • execute는 매개 변수를 바인드하거나 인용 할 필요가 없도록 매개 변수를 바인드 할 수 있는 준비된 명령문을 실행합니다. 쿼리를 여러 번 반복하면 execute도 더 잘 수행됩니다.

모범 사례는 준비된 문장을 고수하고 보안을 강화하는 것입니다. 제공되는 클라이언트 측에서 탈출하는 것 외에도 준비된 명령문은 서버 측에서 한 번 컴파일 된 다음 각 실행에서 다른 매개 변수를 전달할 수 있습니다.


Q30 : Null Coalesce Operator의 용도는 무엇입니까? 


Null coalescing operator는 첫 번째 피연산자가 존재하고 NULL이 아닌 경우 첫 번째 피연산자를 리턴합니다. 그렇지 않으면 두 번째 피연산자를 반환합니다.


예:


$name = $firstName ?? $username ?? $placeholder ?? "Guest"; 


Q31 : 예외와 오류의 구별 


  • Error 복구가 불가능합니다. 오류에 대한 유일한 해결책은 실행을 종료하는 것입니다. try-catch 블록을 사용하거나 예외를 호출자에게 다시 던져 예외에서 복구 할 수 있습니다.
  • try-catch 블록을 사용하여 Error를 처리 할 수 ​​없습니다. try-catch 블록을 사용하여 처리하더라도 응용 프로그램이 발생하면 복구되지 않습니다. 반면, try-catch 블록을 사용하여 Exceptions를 처리하고 프로그램 흐름이 발생하는 경우 정상적인 흐름을 만들 수 있습니다.
  • Exceptions는 응용 프로그램이 실행되는 환경과 관련이 있는 응용 프로그램과 관련이 있습니다.

Q32 : 예외 클래스 함수는 무엇입니까? 


Exception 클래스에서 사용할 수 있는 기능은 다음과 같습니다.

  • getMessage()-예외 메시지
  • getCode()-예외 코드
  • getFile()-소스 파일 이름
  • getLine()-소스 라인
  • getTrace()-역 추적 ()의 n 배열
  • getTraceAsString()-형식화 된 추적 문자열
  • Exception :: __ toString은 예외의 문자열 표현을 제공합니다.


Q33 : 파라미터 함수와 비 파라미터 함수의 차별화 


  • 매개 변수가 없는 함수는 호출 할 때 매개 변수를 사용하지 않습니다.
  • 매개 변수화 된 함수는 호출하는 동안 하나 이상의 인수를 사용합니다. 출력이 런타임에 주어진 동적 값에 의존 할 때 프로그램의 런타임에 사용됩니다. 매개 변수화 된 함수에 액세스하는 두 가지 방법이 있습니다.
    1. 값으로 호출 : (여기서는 값을 직접 전달합니다)
    2. 참조로 호출 : (여기서 우리는 값이 저장된 주소 위치를 전달합니다)

Q34 : 참조에 의한 함수 호출 설명 


참조로 호출하는 경우 실제 값이 함수 내에서 수정되면 수정됩니다. 이 경우 공식 인수와 함께 & 기호를 사용해야 합니다. &는 변수의 참조를 나타냅니다.


예:


function adder(&$str2) {  
    $str2 .= 'Call By Reference';  
}
$str = 'This is ';  
adder($str);  
echo $str;  

출력:


This is Call By Reference


Q35 : extract()를 사용하는 이유는 무엇입니까? 


extract() 함수는 변수를 배열에서 로컬 기호 테이블로 가져옵니다.


이 함수는 배열 키를 변수 이름으로 사용하고 값을 변수 값으로 사용합니다. 

각 요소에 대해 현재 심볼 테이블에 변수를 만듭니다. 이 함수는 성공시 추출 된 변수 수를 반환합니다.


예:

$a = "Original";
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
extract($my_array);
echo "\$a = $a; \$b = $b; \$c = $c";

출력 : 


$a = Cat; $b = Dog; $c = Horse

Q36 : PHP에서 클로저가 무엇인지 설명하고 왜 "use" 식별자를 사용합니까? 


이 코드를 고려하십시오.


public function getTotal($tax)
{
    $total = 0.00;

    $callback =
        function ($quantity, $product) use ($tax, &$total)
        {
            $pricePerItem = constant(__CLASS__ . "::PRICE_" .
                strtoupper($product));
            $total += ($pricePerItem * $quantity) * ($tax + 1.0);
        };

    array_walk($this->products, $callback);
    return round($total, 2);
}


왜 사용하는지 설명해 주시겠습니까?


이것이 PHP가 클로저를 표현하는 방법입니다. 기본적으로 이것이 의미하는 것은 익명 함수가 범위 밖에서 로컬 변수 (이 경우 $tax 및 $total에 대한 참조)를 "캡처"하고 값을 유지하도록 허용한다는 것입니다 (또는 $total의 경우 참조 익명 함수 자체의 상태로 $total 자체).


클로저는 별도의 네임 스페이스이므로 일반적으로 이 네임 스페이스 외부에 정의 된 변수에 액세스 할 수 없습니다.

  • use를 사용하면 클로저 내부의 후속 변수에 액세스 (사용) 할 수 있습니다.
  • use은 초기 바인딩입니다. 이는 클로저 정의시 변수 값이 복사됨을 의미합니다. 따라서 클로저 내에서 $tax를 수정하면 객체와 같은 포인터가 아닌 한 외부 효과가 없습니다.
  • &$total의 경우와 같이 변수를 포인터로 전달할 수 있습니다. 이런 식으로 $total의 값을 수정하면 외부 효과가 생겨 원래 변수의 값이 변경됩니다.

Q37 : PHP에서 late static 바인딩은 정확히 무엇입니까? 


기본적으로 self 키워드는 동일한 상속 규칙을 따르지 않는다는 사실로 요약됩니다. self는 항상 그것이 사용되는 클래스로 해석됩니다. 즉, 부모 클래스에서 메서드를 만들어 자식 클래스에서 호출하면 self가 예상대로 자식을 참조하지 않습니다.


Late static 바인딩은 정적 키워드에 새로운 용도를 도입하여 이 특정 단점을 해결합니다. 정적을 사용할 때 처음 사용하는 클래스를 나타냅니다. 런타임 클래스에 '바인딩'됩니다.


class Car {
    public static
    function run() {
        return static::getName();
    }

    private static
    function getName() {
        return 'Car';
    }
}

class Toyota extends Car {
    public static
    function getName() {
        return 'Toyota';
    }
}

echo Car::run(); // Output: Car
echo Toyota::run(); // Output: Toyota


Q38 : PHP 스크립트의 실행 시간을 측정하는 방법은 무엇입니까? 


PHP while-loop가 실행되는 데 몇 밀리 초가 필요한지 알고 싶습니다. 당신이 나를 도울 수?


이를 위해 microtime function을 사용할 수 있습니다.


$start = microtime(true);
while (...) {

}
$time_elapsed_secs = microtime(true) - $start;


Q39 : 두 개의 PHP 객체를 병합하는 가장 좋은 방법은 무엇입니까? 


//We have this:
$objectA->a;
$objectA->b;
$objectB->c;
$objectB->d;

//We want the easiest way to get:
$objectC->a;
$objectC->b;
$objectC->c;
$objectC->d;


이것은 작동합니다 :


$obj_merged = (object) array_merge((array) $obj1, (array) $obj2);


깊은 복사 동작을 위해 array_merge_recursive를 사용할 수도 있습니다.


이를 수행하는 또 다른 방법은 다음과 같습니다.


foreach($objectA as $k => $v) $objectB->$k = $v;

이것은 PHP 버전 < 7의 첫 번째 답변보다 빠릅니다 (예상 50 % 빠름). 그러나 PHP >= 7에서 첫 번째 대답은 400 % 빠릅니다.


Q40 : mysqli 또는 PDO 비교-장단점은 무엇입니까? 


이름을 지어 봅시다 :

  • PDO가 표준이며, 대부분의 개발자가 사용할 것으로 예상됩니다.
  • 한 데이터베이스에서 다른 데이터베이스로 애플리케이션을 이동하는 것은 흔하지는 않지만 조만간 다른 RDBMS를 사용하여 다른 프로젝트에서 작업하는 것을 발견 할 수 있습니다. PDO를 가지고 집에 있다면 그 시점에서 배우는 것이 최소한 한 가지는 없을 것입니다.
  • PDO의 좋은 점은 데이터를 가져 와서 객체에 자동으로 주입 할 수 있다는 것입니다.
  • PDO에는 SQL 주입을 다시 도와주는 몇 가지 기능이 있습니다.
  • 실행 속도 측면에서 MySQLi가 이기는 하지만, MySQLi를 사용하는 좋은 래퍼가 없으면 준비된 명령문을 다루는 기능이 끔찍합니다. 삽입-거의 동일, 선택-mysqli는 준비되지 않은 명령문의 경우 ~ 2.5 % 빠르며, 준비된 명령문의 경우 ~ 6.7 % 빠릅니다.


Q41 : Spaceship 연산자의 용도는 무엇입니까? 


이 <=> 연산자는 다음과 같은 점에서 결합 된 비교를 제공합니다.

  • 양쪽의 값이 같으면 0을 반환
  • 왼쪽의 값이 크면 1을 반환
  • 오른쪽 값이 클 경우 -1을 반환합니다
//Comparing Integers
echo 1 <= > 1; //outputs 0
echo 3 <= > 4; //outputs -1
echo 4 <= > 3; //outputs 1

//String Comparison

echo "x" <= > "x"; // 0
echo "x" <= > "y"; //-1
echo "y" <= > "x"; //1

Q42 : PHP에는 스레딩이 있습니까? 


표준 PHP는 멀티 스레딩을 제공하지 않지만 실제로는 pthreads를 수행하는 (실험적) 확장이 있습니다. 다음으로 가장 좋은 방법은 CLI를 통해 한 스크립트가 다른 스크립트를 실행하도록 하는 것이지만 약간 기초적인 내용입니다. 당신이 하려는 일과 그것이 얼마나 복잡한 지에 따라, 이것은 옵션 일 수도 있고 아닐 수도 있습니다.


Q43 : PHP는 단일 또는 다중 스레드입니까? 


PHP는 본질적으로 단일 스레드가 아닙니다. 그러나 유닉스 시스템에서 가장 일반적인 PHP 설치는 가장 일반적인 Apache 설치와 마찬가지로 단일 스레드 설정이고 nginx에는 스레드 기반 아키텍처가 없습니다. 가장 일반적인 Windows 설정 및 일부 고급 유닉스 설정에서 PHP는 한 프로세스에서 여러 개의 인터프리터 스레드를 작동 할 수 있습니다.


인터프리터로서 PHP는 2000 년 이후 멀티 스레딩을 지원했습니다.


Q44 : PHP에서 여러 생성자를 모방하는 몇 가지 방법을 제공하십시오 


PHP 클래스에 두 개의 __construct 함수를 고유 인수 서명으로 넣을 수는 없지만 다음과 같이하고 싶습니다.


class Student 
{
   protected $id;
   protected $name;
   // etc.

   public function __construct($id){
       $this->id = $id;
      // other members are still uninitialised
   }

   public function __construct($row_from_database){
       $this->id = $row_from_database->id;
       $this->name = $row_from_database->name;
       // etc.
   }
}


PHP에서 이것을 달성하는 가장 좋은 방법은 무엇입니까?


아마 다음과 같이 할 것입니다 :


class Student
{
    public function __construct() {
        // allocate your stuff
    }

    public static function withID( $id ) {
        $instance = new self();
        $instance->loadByID( $id );
        return $instance;
    }

    public static function withRow( array $row ) {
        $instance = new self();
        $instance->fill( $row );
        return $instance;
    }

    protected function loadByID( $id ) {
        // do query
        $row = my_awesome_db_access_stuff( $id );
        $this->fill( $row );
    }

    protected function fill( array $row ) {
        // fill all properties from array
    }
}

그런 다음 ID를 알고 있는 학생을 원한다면 :


$student = Student::withID( $id );


기술적으로 여러 생성자를 작성하지 않고 정적 도우미 메소드만 작성하지만 생성자에서 많은 스파게티 코드를 피하십시오.


또 다른 방법은 공장과 유창한 스타일의 혼합을 사용하는 것입니다.


class Student
{
    protected $firstName;
    protected $lastName;
    // etc.

    /**
     * Constructor
     */
    public function __construct() {
        // allocate your stuff
    }

    /**
     * Static constructor / factory
     */
    public static function create() {
        $instance = new self();
        return $instance;
    }

    /**
     * FirstName setter - fluent style
     */
    public function setFirstName( $firstName) {
        $this->firstName = $firstName;
        return $this;
    }

    /**
     * LastName setter - fluent style
     */
    public function setLastName( $lastName) {
        $this->lastName = $lastName;
        return $this;
    }
}

// create instance
$student= Student::create()->setFirstName("John")->setLastName("Doe");


Q45 : PHP에서 메소드 오버로딩을 어떻게 구현할 수 있습니까? 


PHP 함수를 오버로드할 수 없습니다. 함수 시그니처는 이름만 기반으로 하며 인수 목록을 포함하지 않으므로 동일한 이름의 두 함수를 가질 수 없습니다.


그러나 가변 개수의 인수를 사용하는 가변 함수를 선언 할 수 있습니다. func_num_args() 및 func_get_arg()를 사용하여 인수를 전달하고 정상적으로 사용합니다.


function myFunc() {
    for ($i = 0; $i < func_num_args(); $i++) {
        printf("Argument %d: %s\n", $i, func_get_arg($i));
    }
}

/*
Argument 0: a
Argument 1: 2
Argument 2: 3.5
*/
myFunc('a', 2, 3.5);




  • 트위터로 보내기
  • 페이스북으로 보내기
  • 구글플러스로 보내기
  • 카카오톡으로 보내기

페이지 정보

조회 48회 ]  작성일19-09-25 10:44

웹학교