PHP 방법 인자 에 관 한 일 들

머리말
모든 프로 그래 밍 언어 에서 방법 이나 함 수 는 일부 파 라미 터 를 전달 하여 업무 논리의 처리 나 계산 을 할 수 있다.이것 은 할 말 이 없 지만 PHP 에서 방법의 매개 변 수 는 매우 재 미 있 는 능력 이 많 습 니 다.다음은 이 방면 의 내용 을 말씀 드 리 겠 습 니 다.
참조 매개 변수
값 전달 과 인용 전달 에 관 한 문제.정상 적 인 상황 에서 우리 가 값 을 전달 할 때 변 수 는 복사 되 었 고 방법 내외 의 변 수 는 메모 리 를 공유 하지 않 습 니 다.방법 체 에서 변수의 값 을 수정 하면 방법 외부의 변 수 는 변 하지 않 는 다 는 것 이다.인용 전달 은 전달 변수의 메모리 값 이다.방법 내외 의 변 수 는 같은 변수 로 볼 수 있다.예 를 들 어:

$a = 1;
function test(&$arg){
 $arg++;
}
test($a);
echo $a; // 2
매개 변수 에&표 지 를 더 하면 이 매개 변 수 는 전달 하 는 매개 변 수 를 참조 하 는 것 임 을 나타 낸다.이 표 지 를 추가 하지 않 으 면 모든 기본 유형의 매개 변 수 는 값 으로 전 달 됩 니 다.왜 기본 타 입 을 강조 하 세 요?다음은 클래스 매개 변수 로 테스트 해 보 겠 습 니 다.

class A
{
 public $a = 1;
}
function testA($obj)
{
 $obj->a++;
}

$o = new A();
testA($o);
echo $o->a; // 2

이 예 에서 저 희 는&표 지 를 사용 하여 매개 변수$obj 가 인용 유형 임 을 나타 내지 않 았 습 니 다.그러나 전달 하 는 매개 변수 가 대상 이 라면 기본적으로 인용 전달 입 니 다.대상 도 값 전달 이 되 고 싶다 면?죄 송 하지만 방법 매개 변수 에 서 는 실현 할 수 없습니다.방법 체 에 서 는 clone 방식 으로 대상 매개 변 수 를 복제 할 수 밖 에 없습니다.

class A
{
 public $a = 1;
}
function testA($obj)
{
 $o = clone $obj;
 $o->a++;
}
$o = new A();
testA($o);
echo $o->a; // 1
값 과 인용 에 관 한 문 제 는 디자인 모델 중의 원형 모델 에 대한 설명 을 참고 할 수 있다PHP 디자인 모드 의 원형 모드
기본 매개 변수
매개 변 수 는 기본 값 이 있 을 수 있 습 니 다.이것 은 모두 가 잘 알 것 이 라 고 생각 합 니 다.그러나 사용 할 때 도 주의해 야 한다.그것 은 기본 매개 변 수 를 앞 에 두 지 말 라 는 것 이다.그렇지 않 으 면 오류 가 발생 하기 쉽다.예 를 들 어:

function testArgsA($a = 1, $b){
 echo $a+$b;
}

testArgs(); // error

function testArgsB($a = 1, $b = 2){
 echo $a+$b;
}

testArgsB(); // 3

function testArgsC($a, $b = 2){
 echo $a+$b;
}

testArgsC(1); // 3

복잡 한 함수 나 긴급 한 업무 개발 에 서 는 실수 로 인 자 를 빠 뜨 릴 수 있 으 며,이 럴 때 testArgsA 는 오 류 를 되 돌려 줍 니 다.물론 이런 부주의 한 잘못 은 우리 가 가능 한 한 피해 야 한다.
기본 값 을 지정 할 때 문자열 을''로 지정 하고 숫자 는 숫자 형식 으로 지정 해 야 합 니 다.매개 변수 가 어떤 유형 인지 알 수 없 을 때 NULL 을 기본 매개 변수 로 사용 하 는 것 을 권장 합 니 다.

function testArgsD($a = NULL)
{
 if ($a) {
 echo $a;
 }
}

testArgsD(1);
testArgsD('a');

형식 설명
형식 설명 은 PHP 5 이후 에 추 가 된 기능 입 니 다.자바 처럼 매개 변수 앞 에 매개 변 수 를 추가 하 는 유형 입 니 다.예 를 들 어:

function testAssignA(int $a = 0)
{
 echo $a;
}

testAssignA(1);
testAssignA("a"); // error

만약 매개 변수의 유형 이 틀 리 면 바로 잘못 보고 할 것 이다.PHP 7 이전 에는 클래스,그룹,익명 방법의 형식 만 지원 합 니 다.PHP 7 이후 에는 모든 일반 형식 을 지원 하지만 일반 형식의 고정 쓰기 만 지원 합 니 다.
  • Class/interface name
  • self
  • array
  • callable
  • bool
  • float
  • int
  • string
  • 고정 표기 법 은 무슨 뜻 입 니까?
    
    function testAssignB(integer $a = 0) // error
    {
     echo $a;
    }
    
    즉,int 는 int 만 쓸 수 있 고 integer 를 사용 할 수 없 으 며 bool 도 boolean 을 사용 할 수 없다.위 에 열 거 된 형식 키워드 만 있 을 수 있 습 니 다.
    유형 성명 의 장점 은 무엇 입 니까?사실은 자바 라 는 정적 언어 와 PHP 라 는 동적 언어 간 의 차이 이다.동적 유형 언어의 장점 은 변수 가 유연 하고 유형 을 지정 하지 않 아 도 빠 른 개발 과 교체 가 편리 하 다 는 것 이다.문 제 는 유연성 이다.유연성 을 위해 동적 언어 는 비교 하거나 계산 할 때 변 수 를 자동 으로 유형 전환 하 는 경우 가 많다.변수 유형 전환 에 대한 이해 가 분명 하지 않 으 면 다양한 종류의 버그 가 나타 나 기 쉽다.이 동시에 정적 유형의 언어 는 일반적으로 컴 파일 패키지 가 있 고 동적 유형 은 실행 할 때 변수 유형 을 확정 하기 때문에 컴 파일 패키지 가 적 고 상대 적 으로 운영 효율 도 자바 와 같은 컴 파일 후 언어 보다 못 하 다.
    PHP 의 유형 변환 문제 에 대해 서 는 이전 글 을 참고 할 수 있 습 니 다PHP 의 강제 형식 변환
    Tips 는 작은 기술 입 니 다.매개 변수 유형 을 설명 하면 NULL 값 을 전달 할 수 없습니다.예 를 들 어:
    
    function testAssignC(string $a = '')
    {
     if ($a) {
     echo __FUNCTION__ . ':' . $a;
     }
    }
    
    testAssignC(NULL); // TypeError
    
    
    이 때 해결 할 수 있 는 두 가지 방법 이 있 습 니 다.하 나 는 기본 값=NULL 을 지정 하 는 것 이 고,다른 하 나 는 사용 하 는 것 입 니까?연산 자:
    
    function testAssignD(string $a = NULL)
    {
     if ($a == NULL) {
     echo 'null';
     }
    }
    
    testAssignD(NULL); // null
    
    
    function testAssignE(?string $a)
    {
     if ($a == NULL) {
     echo 'null';
     }
    }
    testAssignE(NULL); // null
    
    
    가 변 수량 파라미터
    php 의 방법 은 가 변 수량의 인 자 를 받 을 수 있 습 니 다.예 를 들 어:
    
    function testMultiArgsA($a)
    {
     var_dump(func_get_arg(2));
     var_dump(func_get_args());
     var_dump(func_num_args());
     echo $a;
    }
    
    testMultiArgsA(1, 2, 3, 4);
    
    
    우 리 는 하나의 인자$a 만 정 의 했 지만 네 개의 인자 가 들 어 왔 습 니 다.이때 우 리 는 세 가지 방법 으로 모든 인 자 를 얻 을 수 있 습 니 다.
  • func_get_arg(int $arg_num),매개 변수 목록 의 특정한 위치 에 있 는 매개 변 수 를 가 져 옵 니 다
  • func_get_args(),매개 변수 목록 가 져 오기
  • func_num_args(),매개 변수 수량 가 져 오기
  • 그 밖 에 php 는...조작 자 를 제공 하여 가 변 길이 의 매개 변 수 를 매개 변수 변수 로 정의 합 니 다.예 를 들 어:
    
    function testMultiArgsB($a, ...$b)
    {
     var_dump(func_get_arg(2));
     var_dump(func_get_args());
     var_dump(func_num_args());
     echo $a;
     var_dump($b); //  $a   
    }
    
    testMultiArgsB(1, 2, 3, 4);
    
    
    매개 변수 기본 값 과 마찬가지 로 여러 개의 매개 변수 가 있 는 경우...b 도 앞 에 두 지 마 세 요.그러면 뒤의 매개 변 수 는 값 이 없 을 것 입 니 다.모든 매개 변 수 는 b 도 앞 에 두 지 마 세 요.그러면 뒤의 매개 변 수 는 값 이 없 을 것 입 니 다.모든 매개 변 수 는 b 에 있 을 것 입 니 다.그러나 PHP 는 기본적으로 이 문 제 를 해결 해 주 었 습 니 다.만약...매개 변수 뒤에 매개 변수 가 있다 면 바로 오 류 를 보고 할 것 입 니 다.
    이 조작 부 호 를 이용 하면 우 리 는 배열 이나 교체 가능 한 대상 에 게 방법 적 인 파 라 메 터 를 편리 하 게 풀 수 있다.예 를 들 어:
    
    function testMultiArgsC($a, $b){
     echo $a, $b;
    }
    
    testMultiArgsC(...[1, 2]);
    
    
    재 미 있 지 않 습 니까?그러면 우 리 는 이 특성 을 이용 하여 하나의 배열 을 합병 하면 어떤 효과 가 있 습 니까?
    
    $array1 = [[1],[2],[3]];
    $array2 = [4];
    $array3 = [[5],[6],[7]];
    
    $result = array_merge(...$array1); // Legal, of course: $result == [1,2,3];
    print_r($result);
    $result = array_merge($array2, ...$array1); // $result == [4,1,2,3]
    print_r($result);
    $result = array_merge(...$array1, $array2); // Fatal error: Cannot use positional argument after argument unpacking.
    $result = array_merge(...$array1, ...$array3); // Legal! $result == [1,2,3,5,6,7]
    print_r($result);
    
    
    방법 설명 매개 변수 와 마찬가지 로 외부 에서...조작 자 를 사용 하여 방법 에 매개 변 수 를 전달 할 때 도...뒤에 다른 매개 변수 가 있 을 수 없 기 때문에 arraymerge(...array 1,array 1,array 2)의 동작 이 잘못 되 었 습 니 다.
    테스트 코드:
    https://github.com/zhangyue0503/dev-blog/blob/master/php/201911/source/PHP%E6%96%B9%E6%B3%95%E5%8F%82%E6%95%B0%E7%9A%84%E9%82%A3%E7%82%B9%E4%BA%8B%E5%84%BF.php
    참고 문서:
  • https://www.php.net/manual/zh/functions.arguments.php
  • https://www.php.net/manual/zh/functions.arguments.php#121579
  • 총결산
    PHP 방법의 매개 변수 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 PHP 방법의 매개 변수 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기