>백엔드 개발 >PHP 튜토리얼 >PHP의 친숙한 함수 매개변수 전달 모드 디자인

PHP의 친숙한 함수 매개변수 전달 모드 디자인

WBOY
WBOY원래의
2016-07-25 08:46:181008검색

PHP는 친숙한 기능 매개변수 전달 모드 디자인입니다. 도움이 필요한 친구들이 참고할 수 있습니다.


클래스의 생성자 함수에 전달해야 할 매개변수가 많으면 프로그래머가 코딩할 때 매개변수의 순서와 작성을 기억하기 어렵고 컴파일 오류나 값이 발생하기 쉽습니다. 잘못된 매개변수(약한 유형의 언어)로 전달될 수 있습니다.


친근한 기능적 디자인

프로그래머가 클래스를 인스턴스화할 때 전달된 매개변수는 다음 친화성 목표를 충족해야 합니다.
1. 일부 매개변수만 전달 가능
2. 매개변수를 순서대로 전달하는 기능
3. 매개변수의 대소문자를 구별할 수 없습니다
4. 파라미터 전송 시 발생하는 오류를 신속하고 정확하게 안내할 수 있습니다


프로세스 개선 예시 1 - 멤버 변수에 기본값 할당 다음 코드를 봐주세요. 함수의 기본값은 멤버 변수에 할당됩니다. 이런 식으로 일부 매개변수만 전달되면 시스템은 알림, 즉 첫 번째 "친화성 목표"를 생성합니다. 충족되지 않습니다.
  1. class FileUpload
  2. {
  3. private $filepath; //파일을 저장할 경로 지정
  4. private $allowtype = array("gif", "jpg ", "jpeg", "png"); //허용되는 유형
  5. private $maxsize = 1000000; //허용되는 파일 크기 1M
  6. private $israndname = true; 🎜 >
  7. 함수 __construct($filepath, $allowtype, $maxsize, $israndname)
  8. {
  9. $this->filepath = $filepath;
  10. $this->allowtype = $allowtype;
  11. $this->maxsize = $maxsize;
  12. $this->israndname = $israndname;
  13. var_dump($this);
  14. }
코드 복사 예시 2 - 생성자에 기본값 할당
이번에는 위 예의 알림을 제거하기 위해 원하는 수의 매개변수를 전달할 수 있습니다. 매개변수가 전달되지 않으면 기본값이 사용됩니다. 프로그램을 다음과 같이 변경합니다. 생성자입니다.

또 다른 문제가 발생합니다. 프로그래머가 매개변수("/upload",array("jpg","gif"),false)를 전달할 때, 즉 프로그래머가 maxsize 매개변수를 전달하는 것을 잊어버리면 시스템이 will 실수로 israndname 대신 maxsize에 false가 할당되었습니다. 시스템은 오류를 출력하지 않으며 후속 작업에 숨겨진 위험을 남깁니다.

    class FileUpload
  1. {
  2. private $filepath;
  3. private $allowtype;
  4. private $maxsize;
  5. private $israndname;
  6. 함수 __construct(
  7. $filepath = "/upload",
  8. $allowtype = array("gif", "jpg", "jpeg", "png"),
  9. $maxsize = 1000000,
  10. $israndname = true)
  11. {
  12. $this->filepath = $filepath;
  13. $this->allowtype = $allowtype;
  14. $this-> ;maxsize = $maxsize;
  15. $this->israndname = $israndname;
  16. var_dump($this);
  17. }
코드 복사 예시 3 - 배열을 사용하여 매개변수 캡슐화
예제 2의 문제를 해결하기 위해 들어오는 값을 확인하여 잘못 정렬된 할당을 방지할 수 있습니다(일반적으로 어쨌든 들어오는 값을 확인합니다). 그러나 이는 문제에 대한 해결책이 아닙니다. 우리가 구현하려는 기능을 사용하면 프로그래머가 값을 순서 없이 전달할 수도 있기 때문입니다.

약한 유형의 언어에서는 배열의 특수성을 사용하여 전달된 모든 매개변수를 배열로 캡슐화하고 이를 키=>값 쌍의 형식으로 저장함으로써 이 문제를 해결할 수 있습니다. 다음 코드를 참조하세요:

    class FileUpload
  1. {
  2. private $filepath;
  3. private $allowtype;
  4. private $maxsize;
  5. private $israndname;
  6. function __construct($options=array([기본값]))
  7. {
  8. //들어오는 배열을 구문 분석합니다
  9. foreach($options as $key=>$value){
  10. $this->$key = $value;
  11. }
  12. }
코드 복사
이는 전달되는 매개변수의 순서 문제를 해결하고, 일부 매개변수만 전달하는 문제도 해결합니다.

그러나 이때 새로운 문제가 발생하는데, 프로그래머는 다음과 같이 배열을 매개변수로 입력해야 합니다.

    $up = new $FileUpload(array(
  1. "filepath" => "/upload",
  2. "israndname" => false,
  3. " maxsize" => 2000000
  4. ));
코드 복사 예 4 - 매개변수의 경우 해결
배열을 사용하여 매개변수를 캡슐화한 후에는 프로그래머가 변수 이름을 수동으로 입력해야 합니다. 이로 인해 스타일이 다르기 때문에 MaxSize, maxSize 및 maxsize와 같은 문제가 발생하게 됩니다. 멤버 변수를 선언할 때 이를 통합하려면 소문자를 사용한 다음 생성자에 한 줄을 추가하세요.

    foreach($options as $key=>$value){
  1. $key = strtolower($key);
  2. ...
  3. }
코드 복사

이 시점에서 우리의 디자인은 "친화성 목표"의 처음 세 가지 사항을 충족했습니다. 전체 코드는 다음과 같습니다.

  1. class FileUpload {
  2. private $filepath;
  3. private $allowtype;
  4. private $maxsize;
  5. private $israndname;
  6. 함수 __construct($options=array(
  7. "$filepath" => "./",
  8. "$allowtype" => array("txt","jpg"),
  9. " $maxsize " => 1000000,
  10. "$israndname" => true
  11. )){
  12. //들어오는 배열을 구문 분석
  13. foreach($options as $key=>$value ){
  14. $key = strtolower($key);
  15. $this->$key = $value;
  16. }
  17. }
  18. }
코드 복사
예시 5 - 수신 키의 오류 처리

위의 예에서 프로그래머가 클래스에 존재하지 않는 매개변수를 전달하면 시스템은 오류를 보고합니다.
1. 잘못된 매개변수는 무시하고 유효한 매개변수만 실행
2. 전달한 특정 매개변수가 잘못되었음을 알려드립니다.

개인적으로는 프로그램의 견고함을 위해 잘못된 코드가 쉽게 존재할 수 없다고 생각하므로 호출자에게 이 오류에 대해 친절하게 알려드리겠습니다.

  1. foreach($options as $key=>$value){
  2. $key = strtolower($key);
  3. //이 변수가 있는지 확인 클래스
  4. if(in_array($key, get_class_vars(get_class($this)))) {
  5. $this->$key = $value;
  6. }else{ //잘못된 위치에 대한 프롬프트 및 매개변수
  7. echo "키가 있는 ".get_class($this)." 초기화 클래스에서 오류 발생: 배열의 ".$key." !";
  8. 종료;
  9. }
  10. }
코드 복사
예시 6 - 들어오는 값이 유효한지 확인

이제 예상되는 네 가지 목표가 달성되었습니다. __construct() 함수를 재사용할 수 있도록 하려면 값 확인을 함수로 추상화해야 합니다. :

  1. class FileUpload {
  2. //변수 이름은 모두 소문자입니다
  3. private $filepath;
  4. private $allowtype;
  5. private $maxsize;
  6. private $israndname;
  7. //생성자에 기본값 할당
  8. function __construct($options=array(
  9. "$filepath" => "./",
  10. "$ allowtype" => array("txt","jpg"),
  11. "$maxsize" => 1000000,
  12. "$israndname" => true
  13. )){
  14. // 들어오는 배열 구문 분석
  15. foreach($options as $key=>$value){
  16. $key = strtolower($key);
  17. //키가 클래스에 선언되었는지 확인
  18. if(in_array($key, get_class_vars(get_class($this)))) {
  19. //값이 요구 사항을 충족하는지 확인
  20. if(checkValue($key,$value)) {
  21. $this - >$key = $value;
  22. } else {
  23. //오류 위치 및 매개변수에 대한 프롬프트
  24. echo "잘못된 값".$value."found when init class ".get_class($this) ." with key: ".$key." in array !";
  25. exit;
  26. }
  27. }else{
  28. //오류 위치 및 매개변수 프롬프트
  29. echo "클래스 초기화 시 오류 발생 ".get_class($this)." 키: 배열의 ".$key.";
  30. 종료;
  31. }
  32. }
  33. }
  34. 함수 checkValue{
  35. if(){
  36. ...
  37. return true;
  38. }
  39. return false;
  40. }
  41. }
코드 복사
PHP


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.