php 클래스 멤버 함수에서 배열 반환은 어떻게 하나요?!

조회수 800회
class test{
    private $one;
    public function __construct($arr){
        $this->one=$arr;
    }
    public function arr_return(){
        $rm=$this->one;
        return function() use($rm){
            for($i=0; $i< count($rm); $i++)
            {
                return $rm;
            }
        };
    }
}

$abc=['hello','bye'];
$ptr=new test($abc);
$str= $ptr->arr_return();
var_dump($str);
echo $str[0];

var_dump 를 사용해서 보니까

object(Closure)[2]
  public 'static' => 
    array (size=1)
      'rm' => 
        array (size=2)
          0 => string 'hello' (length=5)
          1 => string 'bye' (length=3)
  public 'this' => 
    object(test)[1]
      private 'one' => 
        array (size=2)
          0 => string 'hello' (length=5)
          1 => string 'bye' (length=3)

이렇게 잡히는데

echo 로 배열 하나 호출 해보니 오류가 납니다

왜 안나오는지 ㅠㅠ 클래스 멤버함수에세 echo 호출 말고 리턴값으로 받고싶은 경우에는 어떻게 해야 되나요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • private로 선언된 멤버변수도 클래스 내부에서는 자유롭게 가져다 쓸 수 있습니다.
    따라서 아래와같이 간단하게 처리하시면 됩니다.
    arr_return 함수만 변경하였습니다.

    class test{
        private $one;
        public function __construct($arr){
            $this->one=$arr;
        }
        public function arr_return(){
            return $this->one;
        }
    }
    
    $abc=['hello','bye'];
    $ptr=new test($abc);
    $str= $ptr->arr_return();
    echo $str[0];
    

    $oneprivate로 선언된 멤버변수이니 아래와같은 코드는 작동하지 않겠죠?

    class test{
        private $one;
        public function __construct($arr){
            $this->one=$arr;
        }
        public function arr_return(){
            return $this->one;
        }
    }
    
    $abc=['hello','bye'];
    $ptr=new test($abc);
    $str= $ptr->one;
    echo $str[0];
    

    $onepublic으로 선언하면 바로 접근해서 가져다 쓸 수도 있습니다.
    다만 PHP같은 객체지향 언어에서는 캡슐화라는 약속이 있기 때문에 구조가 간단하거나 실수를 할 여지가 없는 경우를 제외하고는 대부분 해당 멤버 변수를 가져오거나 설정하는 함수를 따로 만들어서 사용합니다.

    class test{
        public $one;
        public function __construct($arr){
            $this->one=$arr;
        }
    }
    
    $abc=['hello','bye'];
    $ptr=new test($abc);
    $str= $ptr->one;
    echo $str[0];
    

    추가로, 대부분의 PHP프로그래머들은 클래스 이름의 첫글자를 대문자로 적습니다.
    (이를 PascalCase라고 합니다.)
    또한 변수명과 함수명을 짓는 방법에 대한 약속도 있으니 이를 가능하면 준수해주시는게 다른 사람이 코드를 알아보기 편하게 할 수 있습니다.

    이해가 안되는 부분이 있다면 덧글로 남겨주세요.

    • 헐 이럴수가 ... 그냥 함수에서도 저렇게 했었는데 부끄럽네요 ㅠㅠ 자동으로 포인터 된다는걸 까먹었네요 왜 그랬지; 암튼 답변 너무 감사합니다 아 그리고 대문자 잊지 않겠습니다 알려주셔서 감사합니다!!!!!!! 알 수 없는 사용자 2020.3.8 12:36

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)