참조 함수로 패스/콜을 생성할지 여부는 언제나 혼란 스러울 것입니다. 누군가가 정확하게 그것을 사용해야 할 때와 실제적인 예를 설명 할 수 있다면 좋을 것입니다.레퍼런스 함수에 의한 패스/콜을 언제 생성해야합니까?
답변
다른 언어로 참조 (또는 포인터)를 호출하는 일반적인 이유는 공간을 절약하는 것입니다.하지만 PHP는 값에 의해 전달 된 것으로 선언 된 인수에 대해 copy-on-write를 구현할만큼 똑똑합니다. . PHP5에서는 항상 객체를 참조로 전달하는 연습을 도입했지만 배열 값은 항상 참조로 저장되며 call_user_func()은 항상 값으로 호출합니다. 참조로는 절대 호출하지 않습니다 (자체는 함수이므로 구조체가 아니기 때문에).).
그러나 이것은 원래 질문에 추가됩니다.
일반적으로 호출 된 기능이 반환 된 후에 명시 적으로 값을 다르게 지정하지 않는 한 항상 값 (복사)으로 전달하는 것으로 코드를 선언하는 것이 좋습니다. 그 이유는 호출 된 기능이 현재 작성중인 코드의 상태를 어떻게 변경 하는지를 알아야하기 때문입니다. 이러한 개념은 일반적으로 우려의 격리 및 분리라고합니다.
PHP 5부터는 참조로 값을 전달할 실제 이유가 없습니다.
한 가지 예외는 적절한 위치로 배열을 수정하려는 경우입니다. 예를 들어 sort
기능을 예로 들어 보겠습니다. 배열이 참조로 전달된다는 것을 알 수 있습니다. 즉, 배열이 제 위치에서 정렬됩니다 (새로운 배열이 반환되지 않음).
또는 각 호출이 동일한 데이터 (종종 배열이기도 함)에 액세스해야하는 재귀 함수를 고려하십시오.
php4에서는 큰 변수에 사용되었습니다. 함수에 배열을 전달하면 배열은 함수에서 사용하기 위해 복사되고 많은 메모리와 CPU를 사용합니다. 그 해결책은 다음과 같습니다 :
function foo(&$arr)
{
echo $arr['value'];
}
$arr = new array();
foo($arr);
이 방법은 참조, 배열 및 메모리와 cpu에 대한 링크 만 전달했습니다. php5 모든 객체와 배열 (int와 같은 스칼라가 확실하지 않음)은 내부적으로 참조로 전달되므로 직접 처리 할 필요가 없습니다.
함수는 항상 참조를 사용하는 것은 좋은 것입니다, 당신은 항상 전달 된 변수에 반환됩니다 같은 변수
$var = modify($var); function modify($var) { return $var.'ret'; }
에 전달 된 변수의 수정 된 버전을 반환 할 때이 최고입니다.
큰 변수와 특히 배열을 처리 할 때 가능한 경우 참조로 전달하는 것이 좋습니다. 이렇게하면 메모리를 절약 할 수 있습니다.
대개 배열을 처리 할 때 일반적으로 수정 된 배열을 원래 배열로 반환하므로 참조로 전달됩니다.
- 1. 함수에 의한 잘못된 그룹 :: MySQL
- 2. 백 체인 알고리즘을위한 레퍼런스
- 3. PHP/Joomla 레퍼런스 사용시기
- 4. C++의 함수에 의한 값 반환 return
- 5. 링커는 언제 다중 정의 된 X 경고를 생성해야합니까?
- 6. 언제 응용 프로그램 내 메시징을위한 요청 또는 응답을위한 인터페이스를 생성해야합니까?
- 7. 함수를 함수에 전달하는 것이 언제 의미가 있습니까?
- 8. 리터럴 및 레퍼런스 참조
- 9. Clojure 레퍼런스 벡터
- 10. C++ 벡터에서 레퍼런스 추출하기
- 11. 자바 데이터 구조 레퍼런스
- 12. 런타임시 NHibernate Configuration 레퍼런스
- 13. PDF 크로스 레퍼런스 스트림
- 14. C++는 값에 의한 전달 내부의 할당과 참조 함수에 의한 전달 사이에 차이점이 있습니까?
- 15. 연결된 컬럼 또는 함수에 의한 MySQL 그룹? 이러한 보면
- 16. 약한 레퍼런스 대 Autofac 레졸루션?
- 17. 배열 레퍼런스 및 예를 들어
- 18. 어떻게 축소 이미지를 생성해야합니까?
- 19. 서브 클래스 NSManagedObject를 생성해야합니까?
- 20. 왜 다중 SSP를 생성해야합니까?
- 21. html 양식을 생성해야합니까?
- 22. 어떤 RubyMine 파일을 생성해야합니까?
- 23. 양식 개체를 생성하거나 모델에서 생성해야합니까?
- 24. NHibernate : 손으로 클래스와 객체를 생성해야합니까?
- 25. 왜 aes 키를 무작위로 생성해야합니까?
- 26. 왜 maven이 pom-transformed.xml을 생성해야합니까?
- 27. MySQL - 각 행에 레퍼런스 배열 저장
- 28. 레퍼런스 4.0 어셈블리에서 4.0 winforms phail
- 29. VS2010 변경 방법 레퍼런스 박스 필터 추가?
- 30. 언제 예상하고 언제 스텁을합니까?
+1을 알고 싶습니다. 이것은 데이터를 전달하고 메모리에서 어떤 일이 일어나는지에 대한 중요한 포인트입니다. – RobertPitt