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 이후 에는 모든 일반 형식 을 지원 하지만 일반 형식의 고정 쓰기 만 지원 합 니 다.
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 만 정 의 했 지만 네 개의 인자 가 들 어 왔 습 니 다.이때 우 리 는 세 가지 방법 으로 모든 인 자 를 얻 을 수 있 습 니 다.
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
참고 문서:
PHP 방법의 매개 변수 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 PHP 방법의 매개 변수 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.