함수 기술 구매
이제 가변 개수의 매개변수를 사용하는 방법과 함수가 들어오는 변수를 수정하도록 허용하는 방법을 포함하여 함수의 더 마법적인 속성 중 일부를 살펴보겠습니다. 함수는 데이터를 사용하는 방법이 됩니다.
이 섹션의 내용은 이 장에서 가장 어려운 섹션으로, 모험심이 많고 호기심이 많으며 경험이 많은 프로그래머에게만 적합합니다.
변수 매개변수 수
상황에 따라 들어오는 함수를 호출할 때 실제 매개변수 수를 아는 것이 유용합니다. PHP에서 이를 처리하는 방법은 세 가지가 있는데 그 중 하나입니다. PHP4에서만 사용 가능:
1. 기본 매개변수를 사용하여 함수를 정의합니다. 함수가 호출에서 매개변수를 생략하면 대신 기본값이 사용되며 경고 메시지가 표시되지 않습니다.
2. 배열 매개변수를 사용하여 이러한 값을 저장합니다. 호출 프로그램 코드는 이 배열을 래핑하고 함수 본문은 데이터를 적절하게 구분해야 합니다.
3. PHP4의 가변 함수(func_num_args(), func_get_arg() 및 func_get_args())를 사용하십시오.
기본 매개변수
기본 매개변수로 함수를 정의하려면 형식 매개변수를 지정된 표현식으로 변경하면 됩니다. 실제 호출의 매개변수가 정의의 형식 매개변수보다 작으면 PHP는 형식 매개변수를 모두 사용할 때까지 실제 매개변수와 비교하고 일치시킨 다음 미리 설정된 사양을 사용하여 나머지 매개변수를 채웁니다.
예를 들어 다음 함수의 변수는 모두 기본값으로 정의됩니다.
functiontour_guide($city = “Gotham City”,
$desc = “vast 대도시”,
$how_many = “수십”,
$of_what = “의상을 입은 악당”)
{
print(“$ city $desc는
$of_what의 $how_many.< BR >”);
}
tour_guide();
tour_guide로 채워져 있습니다. ("시카고");
tour_guide("시카고", "멋진 도시");
tour_guide("시카고","멋진 도시",
"수많은 사람들",
"금과 불운의 이야기를 전할 수 있는 거친 사람들”);
브라우저는 다음과 유사한 결과를 출력합니다. 문장은 사용된 브라우저에 따라 결정됩니다.
고담시는 수십 명의 의상을 입은 악당으로 가득한 대도시입니다.
시카고는 수십 명의 의상을 입은 악당으로 가득한 대도시입니다.
시카고는 수십 명의 의상을 입은 악당들로 가득한 멋진 도시입니다. 수백만 명의 의상을 입은 악당들로 가득한 멋진 도시입니다.
시카고는 황금과 불운을 지닌 수백만 명의 거친 사람들로 가득 찬 멋진 도시입니다.
기본 매개변수 의 주요 한계는 실제 매개변수와 형식 매개변수의 일치 여부가 두 매개변수를 선착순으로 순차적으로 비교하여 결정된다는 것입니다. 그러므로, 기본 매개변수 설정을 망쳐 놓고 이를 깨닫지 못한 채 많은 문제를 겪게 될 수는 없습니다.
다중 매개변수를 배열로 대체
다중 매개변수의 유연성이 만족스럽지 않다면 배열을 통신 수단으로 사용할 수 있으며, 이는 전체 매개변수 계산 문제를 우회할 수 있습니다.
다음 예제에서는 이 전략을 사용하고 삼항 연산자(7장에서 소개) 및 연관 배열(6장에서 불규칙하게 언급됨)과 같은 몇 가지 작은 트릭도 사용합니다. 자세한 내용은 11장에서 설명합니다. :
functiontour_brochure($info_array)
{
$city =
IsSet($info_array [?city?])?
$info_array[?city?]:"고담 시티";
$desc =
IsSet ($info_array[?city?] )?
$info_array[ ?desc?]:“훌륭한 메트로프라리스”;
$how_many =
IsSet ($info_array[?how_many?])?
$info_array[?how_many?]: "수십";
$of_what
IsSet ($info_array[?of_what?])?
$info_array[? of_what?]: "의상을 입은 악당"; >
print("$city는
$of_what의 $how_many로 채워진 $desc입니다.< BR >")
}
이 함수 들어오는 배열 매개변수가 삼항 조건 연산자 "?"를 사용하여 특정 문자열로 구분된 4개의 다른 값과 비교되고 로컬 변수가 들어오는 값(이미 배열에 저장된 경우)으로 지정되는지 확인하고, 그렇지 않으면 기본값으로 지정됩니다. 이제 두 가지 다른 배열을 사용하여 이 함수를 호출해 보겠습니다.
tur_brochure(array()); //빈 배열
$tour_info =
aray(? city? =>?Cozumel?,
?desc?=>?목적지 휴가?,
'of_what'= >'모래 해변');
tur_brochure( $tour_info);
이 예에서는 먼저 빈 배열(매개변수 없음)을 사용하여 Tour_brochure를 호출한 다음 가능한 세 가지 유형 중 하나를 저장하는 배열을 사용하여 호출합니다. 브라우저 출력은 다음과 같습니다.
고담시는 수십 명의 의상을 입은 악당으로 가득한 대도시입니다.
Cozumel은 수십 개의 모래 해변으로 가득한 휴양지입니다.
두 경우 모두 "how_many" 관련 섹션에 어떤 배열도 저장되어 있지 않기 때문에 "수십" 수가 기본값으로 설정됩니다.
PHP4에서 여러 매개변수 사용
마지막으로 PHP4는 함수 본문에서 매개변수의 수와 값을 검색하는 몇 가지 함수를 제공합니다.
fnc_num_args()는 다음과 같습니다. 매개변수가 없으며 함수 호출 시 전달된 매개변수 수를 반환합니다.
fnc_get_arg()는 정수 매개변수 n을 취하고 함수 호출의 n번째 매개변수를 반환합니다. 매개변수 계산은 0부터 시작됩니다.
fnc_get_args()는 매개변수를 사용하지 않고 함수 호출의 모든 매개변수가 포함된 배열을 반환하며, 배열 인덱스는 0부터 시작합니다.
함수 본문 외부에서 호출하면 이 세 함수는 경고 메시지를 표시합니다. 호출 시 사용된 인덱스가 전달된 마지막 매개변수의 인덱스보다 높으면 func_get_arg()도 경고 메시지를 표시합니다.
사용자 함수가 이러한 함수 함수를 사용하여 매개변수를 디코딩하는 경우 여기에 언급된 함수 호출을 최대한 활용할 수 있습니다. PHP에서는 실제 매개변수가 정의에 있는 형식 매개변수 수보다 커지지 않습니다. . 불만이 많습니다. 사용자는 매개변수 없이 함수를 정의한 다음 이 함수를 사용하여 실제로 전달된 모든 함수를 비교하고 일치시킬 수 있습니다.
예를 들어, 각각 인수 배열을 반환하는 다음 두 함수 인스턴스를 생각해 보세요.
fnction args_as_array_1()
{
$arg_count = func_num_args();
$counter = 0;
$local_array = array()
wile($counter < $arg_count)
{
$local_array[$counter] =
fnc_get_arg($ary_counter);
$counter = $counter + 1;
}
rturn($local_array);
}
fnction args_as_array_2()
{
rtun( func_get_args());
}
첫 번째 중복 함수는 func_get_arg()를 사용하여 각 개별 인수를 검색하고 func_num_args()의 결과를 사용하여 범위를 벗어나므로 실제로 전달된 것보다 더 많은 매개 변수가 검색되지 않습니다. 각 매개변수는 배열에 저장되고 배열은 다시 전달됩니다. 이러한 인수를 래핑하는 것은 실제로 func_get_arps()에 의해 수행되므로 이 함수의 두 번째 버전은 매우 짧습니다.
여기에는 여러 매개변수 함수를 사용하여 기본 매개변수를 대체하는 이전의tour_guide() 함수를 다시 작성했습니다.
fnctiontour_guide_2()
{
$num_args = func_num_args();
$city = $num_args > 0 ?
fnc_get_arg(0): "고담 시티"; = $num_args > 1 ?
$desc = $num_args > 1 ?
fnc_get_arg(1): "대도시"; ; 2 ?
fnc_get_arg(2): "수십";
$of_what = $num_args > 3 ?
fnc_get_arg(3): "의상을 입은 악당";
pint("$city는
$of_what의 $how_many로 채워진 $desc입니다. < BR >") 🎜>
tur_guide2();
위 프로그램 코드는 미리 설정된 파라미터 형태의 프로그램 코드와 기능 및 효과가 동일하며, 동일한 제한 사항이 적용됩니다. 매개변수는 위치적으로 전달되므로 "의상을 입은 악당"을 다른 콘텐츠로 대체할 수 있는 방법이 없으며 기본값으로 "Gotham City"만 사용됩니다.
값별 호출 vs. 참조별 호출
PHP에서 사용자 정의 함수의 기본 동작은 "값별"입니다. 값별 호출은 변수가 함수 호출에 전달되면 PHP는 변수 값의 복사본을 만들어 함수에 전달합니다. 따라서 함수가 무엇을 하든 함수 호출에 나타나는 실제 변수를 변경할 수 없습니다. 이 동작에는 장점이 있지만 단점도 있습니다. 이는 함수의 반환 값을 활용하려는 경우 확실히 좋은 접근 방식이지만 전달된 변수를 수정하는 것이 실제 목표인 경우에는 방해가 될 수 있습니다.
다음은 값별 호출을 구현하기 위해 다소 비효율적인 빼기 예제의 구현을 보여줍니다.
fnction my_subtract($numl,$num2)
{
i ($numl < $num2)
de(“음수는 허수입니다.”);
$return_result = 0;
wile($numl > $num2)
{
$numl = $numl – 1;
rturn($return_result);
}
$first_op = 493 ;
$second_op = 355;
$result1 = my_subtract($ first_op,$second_op);
pint(“result1은 $result1< BR >”);
$result2 = my_subtract($first_op,$second_op);
Print(“result2는 $result2< BR >”);
좋습니다. 동일한 뺄셈을 두 번 수행한 결과는 동일합니다.
rsult1은 138
rsult2는 138
my_subtract가 형식 매개변수 $numl의 값을 변경하더라도 $numl 변수는 실제 매개변수 $first_op에 값의 복사본만 저장하므로 $first_op는 영향을 받지 않습니다.
기준에 따른 호출
PHP는 함수 정의 또는 참조별 호출이라고도 알려진 함수 호출에서 매개변수를 더 잘 수정할 수 있도록 하는 두 가지 방법을 제공합니다.
들어오는 변수에 직접 작동하는 함수를 정의하려면 아래와 같이 정의의 형식 매개변수 앞에 "&" 기호를 추가할 수 있습니다.
fnction my_subtract_ref( &$numl,&$num2)
{
i($numl-<$num2)
de(“음수는 허수입니다.”);
$return_result = 0;
wile($num1 >$num2)
{
$numl = $num1 – 1;
$return_result = $return_result + 1;
}
rturn($return_result) >$second_op = 355;
$result1 = my _subtract_ref($first_op, $second_op);
pint("result1은 $result1< BR >입니다.");
$result2 = my_subtract_ref($first_op,$second_op);
pint( "result2 is $result2< BR >");
이제 Call 이전과 동일한 뺄셈을 수행하면 다음과 같은 출력을 얻게 됩니다.
rsult1은 138
rsult1은 0
형식 매개변수 $numl과 실제 매개변수 $first_op가 동일한 내용을 참조하기 때문이며, 하나를 수정하는 것은 다른 하나를 수정하는 것과 동일합니다.
실제 매개변수 앞에 "&" 기호를 추가하여 함수가 그에 따라 매개변수를 전달하도록 강제할 수도 있습니다(이 기능은 단계적으로 폐지되고 향후 PHP 버전에서 제거될 수 있습니다). 즉, 다음과 같이 원래의 호출 함수를 값으로 사용하여 참조로 작업을 가져올 수 있습니다.
$first_op = 355; >$result1 = my_subtract(&$first_op,&$second_op);
Print(“result1은 $result1< BR >”);
$result2= my_subtract(&$first_op , &$second_op);
Print(“result2 is $result2< BR >”);
이번에는 다음과 같은 결과를 얻었습니다.
rsult1은 138
rsult1은 0
PHP4의 경우 변수 매개변수를 함수 호출 외부에서도 사용할 수 있습니다. 일반적으로 변수에 변수 참조(&$varname)를 할당하면 두 변수가 동일한 값을 갖는 두 개의 다른 변수가 되는 것이 아니라 서로 별칭,
(즉, 도플갱어)이 됩니다. 예:
$name_1 = "Manfred von Richtofen";
$name_2 = "Percy Blakeney"
$alias_1 = $name_1; value
$alias_2=&$name_2; //변수는 동일합니다
$alias_1 = "The Red Baron"; //실제 이름은 변경되지 않았습니다
$alias_2 = "스칼렛 핌퍼넬" "; //무엇인지는 중요하지 않습니다.
Prnt("$alias_1은 $name_1< BR> ");
Prnt("$ alias_2는 $name_2< BR > ");
위 프로그램 코드는 다음과 같이 브라우저에 출력됩니다.
The Red Baron is Manfred von Richtofen
The Scarlet Pimpernel Scarlet Pimpernel
변수 함수 이름
PHP에서 매우 유연한 기술은 변수를 사용하여 사용자가 함수를 정의하는 위치를 바꾸는 것입니다. 즉, 프로그램 코드에서 리터럴 함수 이름을 입력하는 대신 "&" 기호로 시작하는 변수를 입력할 수 있으며, 실행 중 실제 호출되는 함수는 변수에 할당된 문자열에 따라 달라집니다. 어떤 의미에서는 이를 통해 함수를 데이터로 사용할 수 있습니다. 이 기술은 C 프로그래머에게 친숙할 수 있지만 Scheme 또는 Common Lisp와 같은 모든 종류의 Lisp 언어 초보자에게도 친숙할 수 있습니다.
예를 들어 다음 두 함수 호출은 정확히 동일합니다.
functioncustomized_greeting()
{
print(“당신은 맞춤형 방식 !< BR >");
}
customized_greeting();
$my_greeting = 'customized_greeting'; my_greeting();
위 프로그램 코드는 동일한 출력을 생성합니다.
맞춤형 방식으로 인사말을 받고 있습니다!
맞춤형 방식으로 인사말을 받고 있습니다!
함수 이름이 문자열이므로 함수의 매개변수로 사용하거나 함수 결과로 반환될 수도 있습니다.
확장 예시+
함수 이름을 함수 매개변수로 사용하는 등 함수의 고급 기능 중 하나를 사용할 때 발생할 수 있는 문제를 살펴보겠습니다.
예제 8-1 이 예는 함수의 확장된 예를 보여줍니다. 이 함수는 암호를 바꾸는 기능을 완성합니다. 이것은 알파벳을 사용하여 한 문자를 다른 문자로 바꾸는 것입니다. 표시된 정보.
다음 프로그램 코드는 지금까지 이 책에서 설명한 어떤 프로그램 코드보다 더 길고 고급입니다. 자세한 내용을 알고 싶지 않은 분들은 이 코드를 건너뛰셔도 됩니다.
예 8-1 밀집 치환
/*1부: 암호화 계산 및 유틸리티 함수*/
함수 추가 1($num)
{
return(($num+ 1)%26);
}
function sub_1($num)
{
return (($num+ 25)% 26);
}
함수 교환 2 ($num)
{
if($num % 2 = = 0)
return($num+ 1);
else
return($num - 1);
}
함수 스왑 26($num)
{
return(25 - $num);
}
함수 소문자($char 문자열)
{
return(ord($char string) >=ord('a'))&&
(ord(&char string)< =ord('z')));
}
함수 대문자($char 문자열)
{
return((ord($char string) >=ord('A' ))&&
(ord($char string)< =ord('z')));
}
/*第twopart份:문자 암호函式 */
함수 암호($char string, $code func)
{
if!(대문자($char string)||
소문자($char 문자열)))
return($char 문자열);
if(상위 문자($char 문자열))
$base num = ord('A');
else
$base num = ord($char string) –
$base num);
return (chr($base num +
($code func ($char num )
% 26)));
}
/*第3부份:主要string cipher 函式 */
function string cipher($message,$cipher func)
{
$coded message = ””;
$메시지 길이 = strlen($message);
for($index= 0;
$index < $메시지 길이;
$index++)
$coded 메시지 .=
문자 암호($message[$index],$cipher func);
반환($코딩된 메시지);
}
范例8-1共有三个分。在第一part份中,我们定义了几个对数字0—25进行简单数字运算的函式,这些数字代表密码程序中的字母A—Z. 의 글자체“绕回”到开头从「0」开始。0变成1 、 1变成2 、…于减1),25变成24 、 24变成23 、…等等),swap_26则把较高 数字 와 较低的数字地行对调置换(25到0 、0到25 、 24到1 、1到24…式都算是这个简易密码程序的基础。最后还有两个공용程序函式,用以测试字符是大写还是小写字母。
第二分就是个letter_cipher()函式,并该函式的工是取得第一part中的一个算术函式,然后应用它来对简单字母进行编码。该函式会先测试它处理的字符串(其中只有单元一字符)是否为字母;如果不是,则按原样传回。如果字符是个字母,则可使用。Ord()의功用是将其转化为数字,然后减支适当 字母 (a或A),以把数字限定到0—25之间。一旦位于这成个范围内,就可以应用其name字以字符串方式传入的密码函式中,然后再把数字转换字母,最后传回它。
最后,第삼부분是string_cipher()函式,该函式带有一个字符串讯息,还有一个密码函式,它传回的是一个新字符串值,其值为透过函式进行编码的内容。这里用到一两个以前没见到的功能(其中包括字符串连接运算字 「.=」,지금 第十章中会提到),这个函式从讯息符串 字母逐一进行处理,建构构新字符串,并用新字母是对对光旧字母的数字表示应用了$cipher_func得到的结果,到这里你大概了解这些足够了。
下下,我们编写一些程序码测试string_cipher();
$ Originak = “내 비밀 메시지는 ABCDEFG입니다”;
Print(“원본 메시지는 :$orginal< BR >”);
$coding_array = array('add_1',
'sub_1,
'swap_2',
'swap_26') ;
For($count = 0;
$count < sizeof($coding_array);
$coded_message =
String_cipher($original, $code);
Print(“$code 인코딩은 :$coded_message< BR >”);
}
这些测试程序码使用了预先定义的四에서 원본을 확인하세요.浏览器输 Out如下所示:
원본 메시지 is: 내 비밀 메시지는 ABCDEFG
add_1 인코딩은 :Nz tfdsfu nfttbhf jt BCDEFGH
sub_1 인코딩은 :Lx rdbqfs nfttbhf jt BADCFRH
swap_2 인코딩은 :Nz tfdqfs nfttbhf jt BADCFEH
swap_26 인코딩은 다음과 같습니다: Nb hvxivg nvhhztv rh ZYXWVUT
我们可以把这个函式做为资料적 방법再深入一步,编写一个给序列中的讯息应用多个密码的函比。这个函式也使用了PHP4的可变参数型函式:
함수 chained_code ($message)
{
/* 설명 ,然后替编辑码函式name称找个任意数目。
각 인코딩 함수를 이전 결과에 적용하고 해당 결과를 반환합니다. */
$argc = func_num_args();
$coded = $message;
For ($count = 1; $count<$argc;$count++)
{
$function_name = func_get_arg($count);
$coded =
String_cipher($coded,
$function_name) ;
}
Return($coded);
}
Chained_code()의 첫 번째 매개변수는 메시지 문자열이어야 하며 그 뒤에는 해당 문자열이 와야 합니다. 암호화 기능에 대한 이름은 무제한입니다. 인코딩된 메시지는 첫 번째 인코딩 기능을 메시지에 적용한 다음 두 번째 인코딩 기능을 결과에 적용한 결과입니다. 미리 정의된 알파벳 인코딩 기능의 다양한 조합을 사용하여 이를 테스트할 수 있습니다.
$tricky =
Chained_code($original,
'add_1''swap_26',
'add_1''swap_2');
Print(“까다로운 인코딩 버전은 $tricky< BR >입니다.”);
$easy =
Chained_code($original,
'add_1',' swap_26',
'swap_','sub_1',
'add_1', 'swap_2,'
'swap_26,''sub_1,');
Print(“쉬운 인코딩 버전은 $easy< BR >”)
결과는 다음과 같습니다.
까다로운 인코딩 버전은 Ma guwjhuggysu qg YXWXUVS
쉬운 인코딩 버전은 내 비밀 메시지는 ABCDEFG입니다
보시다시피 "tricky" 메시지는 미리 코딩된 코드의 조합이지만 단일 인코딩 모드와 정확히 일치하지는 않습니다. "쉬운" 인코딩은 이러한 기능을 더욱 복잡하게 결합한 것이며 결과적으로 원본 메시지가 생성됩니다... 아무런 변경도 필요하지 않습니다! (이것은 키 코드가 유효하지 않기 때문이 아니라, 독자들이 왜 이 특정 편집 기능 순서가 원래 메시지로 다시 돌아갈 수 있는지 이해하기를 원할 뿐입니다.)
이 작은 비밀번호 스크립트의 역할 range는 비록 비밀번호 프로그램이 조금 더 복잡하기는 하지만, PHP는 함수 이름을 함수 매개변수로 사용하는 것을 지원하기 때문에 이 문제를 아주 간단하게 만들어준다는 점을 이해시켜 줍니다.
요약
대부분의 PHP 기능은 PHP 오픈소스 개발팀에서 제공하는 수많은 내장 함수에 존재합니다. 각 기능에는 http://www.php.net의 온라인 설명서에 설명(일부는 간략하지만)이 있어야 합니다.
또한 자체 함수를 작성하여 내장 함수와 동일한 방식으로 액세스할 수도 있습니다. 함수는 다음과 같이 간단한 C 스타일 구문으로 작성됩니다.
Function my_function ($argl,$arg2,…)
{
Statement1;
Statement2;
…
Return($value); 다른 매개변수와 함께 어떤 유형의 값도 반환될 수 있습니다. 매개변수 유형과 반환 값을 선언할 필요가 없습니다.
PHP4에서는 호출되는 각 함수가 정의되어 있는 한 함수 정의 횟수와 함수 호출 횟수에 차이가 없습니다. 별도의 함수 선언이나 프로토타입 제작이 필요하지 않습니다. 함수 내에 지정된 변수는 전역 선언을 사용하지 않는 한 함수 영역으로 제한됩니다. 지역 변수는 정적으로 선언될 수 있습니다. 즉, 함수 호출 간에 값을 유지한다는 의미입니다.
사용자 정의 함수의 기본 동작 동작은 "call_by_reference"입니다. 이는 함수가 작동 중인 매개변수의 복사본을 사용하므로 원래 변수에서 수정할 수 없음을 의미합니다. 매개변수 앞에 "&"를 추가하면 정의 측이나 호출 측에서 사용할 수 있는 "참조별 호출"을 강제할 수 있습니다. PHP는 함수 변수가 취하는 매개변수 수를 만드는 다양한 방법을 제공합니다. 마지막으로 호출할 함수는 사용자 정의 함수의 이름을 문자열 변수로 대체하여 실행 시 결정될 수 있으며, 이를 통해 함수를 데이터로 처리하고 다른 함수 간에 앞뒤로 전달할 수 있습니다.
위 내용은 PHP 학습 가이드 - 8장 (2) 내용입니다. 더 자세한 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!