객체->맴버변수 

 

->  는 객체에서 맴버변수에 접근하는 연산자인데요

라이믹스 이슈올린거 답변듣고 php 공식문서를 다시보니까

-> 랑 :: 가 연산자 우선순위에 없네요?

 

https://www.php.net/manual/en/language.operators.precedence.php

php문서 밑에 댓글도 5년지났는데 없다고 표시되어있고..ㄷ

 

위키백과를 보면 연산자(Operator) 라는게

함수인데 문법으로 있는걸 뜻하는데요

 

자바, C#, JS, C++ 등등 모두 연산자 우선순위표에  .(객체참조)  연산자가 있는데..

'->' 가 나온지 20년 다되어 가는게 아직도 표시 안되어있는게 신기하네요

 

stdClass 항목 문서도 20년만에 (일주일전)에 추가된거 생각하면 ...ㄷ

 

우선순위표.png

 

 

 

PHP 5.6 에서 7.0 으로 넘어갈때 마이그레이션 문서가 있는데요

여기 보면 평가 우선 순위가 바뀌었어요

 

-> 객체 쪽에다 설명하던지 어디 구석에 변경사항이 짱박혀있어서

php 문서 국내,외국 욕먹는건 뭐 어제오늘 일도 아니지만요

 

 

 

 

https://www.php.net/manual/en/migration70.incompatible.php

 

 

 

우선 순위 변경.png

7.0 부터는 오른쪽 먼저 평가에서

왼쪽꺼 먼저 평가되게 바뀌었다고 하네요

 

 

학생 클래스에

nunmber 라는 학번 변수가 있을때

$student = new Student('이름', '123');

 

(int)$student->$number;

라고 하면..

 

-> 먼저 되고 (int) 가 평가되긴한데요

 

라이믹스 코드처럼 복잡한거 있을때

명확하게 뭐가 우선인지도 모르겠고

 

저렇게 버전별로 바뀌는것도 해서 복잡하네요

 

 

https://3v4l.org/a4Onl

 

<?php

class Student{
    public $name;
    public $number;
    
    function set_name($n)
    {
        $this->name = $n;    
    }
    
    function set_number($num)
    {
        $this->number = $num;
    }
    
    function show_info()
    {
        var_dump($this->name, $this->number);    
    }
    
    function get_number()
    {
        return $this->number;
    }
}

$k = new Student();

$k->set_name('kknew');
$k->set_number(5);
$k->show_info();

$j = 2 ** $k->get_number();
var_dump($j);

 

우선순위 테이블 제일 위에 있는 ** 보다 -> 가 먼저 평가되긴하네요

 

7.0 이후로는 다른언어들 처럼 -> 최우선 순위인가 봅니다

php 는 항상 이상한점이 꼭 한두개씩 있어서 단정짓기도 뭐하네요

  • profile

    ->와 ::뿐 아니라, 연관배열 및 클로져 선언에 사용하는 =>도 목록에 없고, 함수의 가변 인자나 배열 헤쳐모여에 사용하는 spread(...)도 없지요. PHP 개발자들이 저런 것들은 "연산자"가 아니라고 생각하는 모양입니다.

     

    하긴 ->는 단지 변수를 정의하거나 참조하는 문법의 일부이고, 그렇게 참조한 변수를 조작하거나 다른 변수와 비교할 때 쓰는 것이 진짜 연산자라고 주장한다면 일리가 없지는 않아요. $foo['bar']에 들어가는 $, 대괄호, 따옴표 등의 문자들을 연산자로 취급하지 않는 것과 마찬가지로요.

     

    JS 연산자 우선순위를 설명하는 MDN 문서에서도 =>와 ...는 연산자가 아니라고 하는 것으로 보아 (연산자가 아니지만 편의를 위해 나열한다고 합니다) 이런 생각이 아주 드문 것은 아닌 듯 해요. 그래도 MDN처럼 매뉴얼에 좀 친절하게 적어주면 좋겠네요. ㅡ.ㅡ

  • profile ?
    -> 가 php엔진에서
    T_OBJECT_OPERATOR 라는 이름이고
    -> classes and objects

    T_NULLSAFE_OBJECT_OPERATOR ?->

    이라서 연산자 인줄요

    연산자가 아니라면 이름 부터ㅠ
  • profile ?
    ... 은 전개구문이라서 php랑 js둘다 연산자아니긴한데

    ::도 php문서에서 이름은 연산자네요
    위키백과보면 다른언어들도 연산자 취급하고있고

    여튼 말씀대로 mdn처럼 적어주면좋겠어요

    php연산자표에 print는 적혀있거든요
    이건 왜..
  • ? profile
    얘네들 작명센스 구린 걸로 유명하죠. ㅎㅎ
    T_PAAMAYIM_NEKUDOTAYIM