본문 바로가기

Server/PHP

[php] objcet & array 무심코 사용하는 연산자

php에서 foreach 문을 돌리면서 변수에 값을 넣으면서 발생했던 사건들을 정리해보고자 한다.

보통 array나 object형 변수에 값을 넣기 위해 사용하는데 어떻게 정리해야할지 모르겠으니까 일단 줄줄줄 읊어놓고 나중에 다시 정리하거나 해야겠다.

 

1. array 형 선언 및 생성

// 일반적인 array형 변수 선언
$values = array();

// array변수 선언과 동시에 값을 넣어 변수 생성 _ 일반적으로 직접 지정하는 value의 나열
$values = ["value_01", "value_02", "value_03", ... ]

// array변수 선언과 동시에 값을 넣어 변수 생성 _ key-value형태
$values = [
	"key_01" => "value_01",
	"key_02" => "value_02",
	"key_03" => "value_03",
    	...
];

// array형 변수 선언 후 값을 지정할 때
$values = [];
$values["key"] = "value";	// case 1. 지정한 key-value값 삽입
$values[$key] = $value;		// case 2. 변수에 선언한 key 값에 대한 value 저장 (ex: $key="key" $value="value")
array_push($values, "value")	// case 3. key값 없이 array변수 내에 문자열(지정) 값 push
array_push($values, $value)	// case 4. array변수 내에 값 push하는 점은 같으나, value변수 값을 push

 

2. object 형 & array 형

objcet형은 활용 시 원하는 값을 얻어올 때, 아래와 같이 일반적으로 화살표 연산자 중 -> 연산자를 활용한다.

// object 선언이 아래와 같을 때
$values = {
    key => "value",
    key1 => "value1",
    ...
}

$value = $values->key	// key = object 내에 등록된 key값

array 형과 objcet형 모두 값을 가져올때는 

// 아래의 세 방식이 모두 같은 값을 의미한다
$a = $values["key"];
$a = $values[$key];	// $key = "key"
$a = $values->key;

형태를 모두 사용할 수 있지만 값을 '넣을 때' 에는 형식을 주의해야 하는 듯 하다.

 

 

일단 objcet형의 경우에는 특별한 제약 없이 새로운 'key값에 대해' value를 삽입할 때

$values["key"] = "value";
$values[$key] = "value";
$values->key = "value";

형식을 모두 사용할 수 있지만, array형의 경우 미리 key값이 지정되어 있던게 아니라면 일반적으로

$변수["key"] = $value;
$변수[$key] = $value;

형식을 사용해야 하는 듯 하다.

 

Array type의 변수에 '새로운 key값에 대응하는' 값을  $변수->key 형식을 사용하여 삽입하려고 하면 

message=Attempt to assign property '변수' of non-object

등 object 형이 아니라는 에러 메세지를 띄우곤 한다.

 

이전에는 왜 잘 들어가던 값이 오류가 발생하지 싶었는데,

문제 없이 ->연산자를 활용해 새로운 key-value값을 삽입하던 경우는 이미 DB에서 불러온 데이터 값에 새로운 key-value를 삽입할 때 였고, php내에서 $변수 = []; 등의 형태로 새로 array 변수를 선언 후 값을 넣으려고 할 때

$변수->key = value;

형태를 시도했을 때 오류가 발생한다. (또는 object형을 삽입하려고 할 때? 이건 확신하지 못 하겠다.)

그래서 늘 왜 안되지 하면서 꾸역꾸역 key-value 형 데이터를 만들어서 array_push() 함수를 사용했는데 순간 화살표 함수의 차이가 눈에 띄어서 생각해보니 그랬던 것.. 뭔가 명확해진 것 같아 별거 아닌 것 같지만 일단 기록해둔다.