질문을 삭제하지 말아주세요.!
 
1
0
-1

php를 학습중에 문의사항이 생겼습니다.

php에서 클래스 인스턴스 생성시 생성자 파라미터로 초기화할 값들 넘겨주는데

파라미터가 추가될 때 마다 클래스를 수정하고싶지 않습니다.

php는 잘 몰라서 아래 자바스크립트의 예시 코드를 추가하였습니다.

아마 연관배열 형태로 넘기고 꺼내쓰도록 하면될 것 같은데 맞는방법인지 보통 어떻게 처리하는지 문의드립니다.

javascript 케이스 

// 아래경우 파라미터가 추가될때 마다 클래스 수정이 필요합니다.
// arguments 객체로 받을 순 있지만..
var TestClass = function(param1, param2, param3){
    // 초기화 수행
	this.construct(param1, param2, param3);
};
TestClass.prototye.construct = function(param1, param2, param3){
	// 초기화 수행
}

// 아래경우 파라미터가 아무리 많아져도 생성자메소드를 수정하지 않아도 됩니다.
// initParam은 {Object} 입니다.
var TestClass = function(initParam){
    // 필요한 값 직접 꺼내거나 for in문으로 객체루프 돌면서 초기화 수행
    this.construct(initParam);
};

위에서 후자의 경우 초기화에서 객체그대로 클래스 멤버의 참조로 등록하며 기능추가나 값참조가 필요하 로직에만 신경쓰면 되는데 전자의경우 생성자에서도 일일이 추가해줘야 합니다.

아마 php에서 연관배열이 있으니 js로 유사하게 처리한다면 아래처럼 될 것 같은데 맞나요?

var TestClass = function(){
	// arguments객체로 배열형태로 생성자 메소드에 전달
	this.construct(arguments);
};

TestClass.prototye.construct = function(initParam){
	// loop돌면서 적절한 초기화 수행
}

어떤 방법이 맞는건지 좋은건지 조언 부탁드립니다.

    CommentAdd your comment...

    2 answers

    1.  
      2
      1
      0

      그냥 배열로 하시면 될 것 같습니다.

      class Foo {
      	protected $bar;
      	protected $baz;
      
      
      	public function __construct($params) {
      		$this->bar = $params['bar'];
      		$this->baz = $params['baz'];
      	}
      }
      
      
      $foo = new Foo(['bar' => 'barText', 'baz' => 'bazText']);


      다른 방법으로는 func_get_args()나 PHP 5.6에서 추가된 가변 길이 인수 목록이라는 걸 쓸 수도 있을 것 같습니다.

      http://php.net/manual/kr/functions.arguments.php#functions.variable-arg-list


      하지만 저라면 다소 귀찮더라도 파라미터가 추가될 때마다 클래스를 고칠 것 같아요. (smile) 혹은 계속 파라미터가 추가된다는 건 클래스가 너무 많은 일을 하는 것이라는 신호가 될 수도 있으니 리팩토링이 필요한지 검토해 볼 것 같기도 합니다. 어찌되었든 코드를 수정하는 방향으로 갈 것 같네요. ㅎㅎ 상황에 따라 다른거지 정답은 없는거니까 이 의견은 그냥 참고만 해주세요.

      1. 장재원

        저같이 초보자에게는 저런 코드와 방법이 많지만 다른사람들은 이런 이유로 이런식으로 쓴다는 책에서는 찾기 힘든 조언들이 학습하는데 큰 도움이 됩니다!

        연관배열형태로(js의 객체, java의 map형태)로 전달하면 되는군요.

        친절한 답변 감사합니다^^


        추가로 그냥 배열로하면 된다고 하셨는데 js나 java에서는

        1. 배열 or 리스트 : 값만 들어있고 index값으로 참조가능
        2. 객체 or 맵 : key : value 형태로 key값으로 참조가능

        이렇게 구분을 하는데 php에서는

        배열이라고 하면 위에 언급된 1.배열, 리스트를 말하는거고

        연관배열이라고 하면 위에 언급된 2.객체, 맵 형태를 말하는 건가요?

        커뮤니케이션하거나 질문할때 용어가 애매해서 잘 못 이해하게 되는 케이스들이 있어 명확히 하고싶은데 알려주시면 감사하겠습니다!




      2. 김주원

        PHP에서는 리스트와 맵을 구분하지 않고, 그냥 퉁 쳐서 배열이라고 합니다. 일반적으로 '연관'이라고 확실히 구분해서 말하지 않습니다. 해서 문맥에 따라 이해하셔야 합니다.

      CommentAdd your comment...
    2.  
      1
      0
      -1

      페북 그룹에 getInstance() 메서드를 만들고, getInstance() 메서드가 다시 private 선언된 생성자 예를 올린 적이 있는데, 페북 검색이 똥이라 찾을 수가 없네요. PHP는 메서드 오버로딩을 지원하지 않기 때문에, 이미 알고 계신대로 배열, splat 연산자 등을 이용해야 합니다.


      PHP에서 메서드 오버로딩을 하는 편법은 아래 링크를 참고해 보시고, 'php methods parameter normalization'이란 키워드도 추가로 찾아보시면 좋겠네요.

      https://murze.be/2016/10/method-overloading-possible-php-sort/

        CommentAdd your comment...