PHP

PHP 버전별 함수 선언과 클래스 선언방식 PHP5.3~ PHP 8.0

마리오64 2020. 11. 3. 18:46

PHP 는 동적타입언어지만 정적타입언어들의 요소를 추가해왔습니다.

현업에서는 구버전이 꽤 있다고 들어서 정리해봤습니다.

PHP코딩 권장표준안 PSR-12 규칙을 보면 {}중괄호는 다음줄에 표시하라고 나와있네요

PHP 5.3

function add($a, $b)
{
    return $a + $b ;
}

function($a, $b) // 익명함수
{ 
    return $a + $b ;
}

리턴타입 지정 불가능 ㅠ 주석에 적지않으면 긴 함수들은 뭐가 리턴되는지 알수 없네요
파라미터 타입 지정 array, callable만 가능 ㅠ

PHP 7.0 //2015년 12월 출시

function add(int $a, int $b): int 
{
    return $a + $b ;
}

echo (function($a, $b){
    return $a +$b;
})(3,4); // 7

리턴 타입 지정 가능  *object타입리턴은 PHP7.1 부터 지원
파라미터 타입 지정 지원
자바스크립트처럼 클로저를 활용한 즉시실행함수 지원

PHP 7.4 //2019년 11월 출시

$add = fn($a, $b)=>$a+$b;

$add(3,4);

화살표함수 지원
function 단축 표기 fn 추가
-------------------------------------------------

PHP 4.x... 무늬만 클래스네요 ㅠ
PHP 5.3 // 2009년

<?php
class member 
{  
  private $age;
  private $name;
  private $nickname;

  function __constructor($age, $name, $nickname)
  {
      $this->age = $age;
      $this->name = $name;
      $this->nickname = $nickname;
  }

  function setAge($age)
  {
      $this->age = $age;
  }

  function getAge()
  {
      return $this->age;
  }

}

* 클래스 멤버변수에 타입지정 불가능 ㅠ
* 생성자 타입지정 불가능 
* 네임스페이스 추가
* 5.0 부터 prvate, public, protect 지원

PHP 7.0 //2015년 12월 출시

<?php
class member
{

  private $age;
  private $name;
  private $nickname;

  function  __construct (int $age, string $name, string $nickname)
  {
    $this->age = $age;
    $this->name = $name;
    $this->nickname = $nickname;
  }

  function setAge(int $age)
  {
      $this->age = $age;
  }

  function getAge() :int
  {
      return $this->age;
  }


}

이제 생성자에도 타입지정이 가능해졌습니다.

그런데 ..

$member1 = new Person(2,"name","nick");
var_dump($member1);


$member1->setAge("5"); //실수로 문자열을 넣게되면?
var_dump($member);

var_dump로 덤프해서 보면

object(Person)#1 (3) {
["age":"Person":private]=> int(2)
["name":"Person":private]=> string(1) "name"
["nickname":"Person":private]=> string(1) "nick"
}
//첫번 째 var_dump

문자열이 들어가게되면? ->

object(Person)#1 (3) {

["age":"Person":private]=> int(5) // ! int 로 자동 형변환되서 들어갔네요..
["name":"Person":private]=> string(1) "name"
["nickname":"Person":private]=> string(1) "nick"
}

setAge에서 int로 설정했지만 자동형변환이 되었는데

이걸 방지하려면 PHP 7에서 도입된 declare(strict_types=1) 이 있습니다.

타입체크 강화죠 반드시 <?php 다음 줄에 바로 와야됩니다.

declare(strict_types=1) 을 설정하면

Fatal error: Uncaught TypeError: Argument 1 passed to Person::setAge() must be of the type int, string given, called in /in/SUQZq on line 31 and defined in /in/SUQZq:22 Stack trace: #0 /in/SUQZq(31): Person->setAge('5') #1 {main} thrown in /in/SUQZq on line 22
Process exited with code 255.

int인데 string이 들어왔다고 에러가 납니다.

객체를 생성하거나 set하기전 값 체크를 하거나 try catch 문을 사용하면

멈추지 않고 잘못된 값이 더이상 안들어가겠죠.

PHP 8 에서는

class member
{
  function  __construct (
      private int $age;
      private string $name;
      private string $nickname;
  ){}

  function setAge(int $age)
  {
      $this->age = $age;
  }

  function getAge() :int
  {
      return $this->age;
  }


}

생성자안에서 클래스 속성을 선언 하는게 지원되서 더 짧게 가능합니다.

 

-----------------------------------

3v4l.org/#preview

PHP 4.3~8.0버전까지 다양한 PHP 버전을 테스트하는 사이트입니다.