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;
}
}
생성자안에서 클래스 속성을 선언 하는게 지원되서 더 짧게 가능합니다.
-----------------------------------
PHP 4.3~8.0버전까지 다양한 PHP 버전을 테스트하는 사이트입니다.
'PHP' 카테고리의 다른 글
PHP 변수 스코프 (0) | 2020.12.03 |
---|---|
코드이그나이터 3에서 라이브러리 설치시 autoload 에러 (0) | 2020.11.10 |
PHP 8.0 바뀐점 정리된곳 (0) | 2020.10.25 |
PHP 8.0 애트리뷰트 문법 논란 (0) | 2020.09.03 |
PHP 7 이하에서 == 연산자와 PHP8에서 변경되는 점 (0) | 2020.08.02 |