<?php
class Introduce //클래스 introduce 생성.
{
private $name; // 외부로 공개하기가 싫은 private.
public function __construct($name)
{
$this->name=$name;
} //속성을 초기화시키기 위한 생성자. 전체공개 public
public function show()
{
echo("My name is ". $this->name . ", sir!");
} // show라는 함수선언.
}
$instance1 = new Introduce("John"); //new라는 키워드로 객체 생성!
$instance1->show();
?>
결과 : My name is John, sir!
이건데
궁금한건
$instance1 = new Introduce("John"); //new라는 키워드로 객체 생성!
$instance1->show();
여기서 John이라는 글자가 어떻게 show 함수속의 name으로 들어갔지?
애초에 함수 show 는 선언될때 fuction show() 라고 되어있었고, 파라미터, 즉 인자값이 따로 지정 되어있지않은 빈칸의 상태였는데
인자가 하나이기때문에 그냥 저절로 인식한거야? c언어처럼 char name 이런식으로 선언안해도 되는거야?
new Introduce("John")이 실제로 하는건 __construct("John")이고, 이 안에서 $this->name = $name은 이 객체(this)의 name에 패러미터 name을 집어넣은거. 이 $this->name은 show()를 포함한 객체 내의 어디서든 사용가능.
감사감사.!!!
더 간단히 얘기하면 "John"은 생성자를 통해 Instance1에 들어간거고, Instance1의 메서드인 show는 "John"을 쓸 수 있는거
그런데 $instance1 = new Introduce("John"); //new라는 키워드로 객체 생성! . 여기서 "john"을 안쓰고, 그냥 $instance1 = new introduce(); 이렇게만 끝내고, "John"을 다음줄에 다른식으로 대입할수도 있을까요
일단 위의 코드는 그렇게 디자인이 안 되어 있고 $this->name이 private이라서 직접 설정하는것보 불가능하니 안 됨. 하지만 그렇게 하는 방식도 있음. 영어로 setter라고 하는데, setName(이름)이라는 public 메소드를 만들고 그 안에서 $this->name = name을 하는거.
https://gist.github.com/anonymous/518d6a07b4a2d6d89030
우왕굳. 그럼 님이 링크걸어준 코드에는, 초기화 생성자인 construct가 따로 필요없겠네요? 그런데 construct를 안쓰면 초기화가 안되니까, name같은 새로운값을 넣을때마다 일일이 입력하는 절차지향과 별반 다를게 없는게 되는건가요?
construct가 없는건 그냥 코드에서 생략된거지 초기화를 안 하는게 아님. new를 한다는것에서 이미 초기화를 한거. 그런데 절차지향을 버린지 오래인지라 비교에 대해서는 잘 대답을 못하겠다 ㅋㅋ;;
$this->name 을 보면되지. $this->name 을 처음 선언했을때 private 속성으로 선언을 했는데 해당 클래스 외에서는 상속이 안되지만 해당 클래스 안에서는 작동됨 그래서 show 라는 function 안에서 작동해도 되게끔 되는거임.
일단 $instance1->name = "john"와 $instance1->setName("john")의 차이점은 encapsulation(캡슐화). 둘의 목적은 같지만 setName은 깔끔하게 더 많은 일을 할 수 있음. 예를들면 글자수 체크를 한다거나 유니코드 체크를 한다거나. setName을 쓰지 않으면서 이런 체크를 하려면 코드가 지저분해지고 안정성이 떨어짐.
혹시나 setter에 대해서 좀 더 설명하면 왜 저렇게 하는걸까 이해할까 싶어 적음 ㅇㅇ