>  기사  >  백엔드 개발  >  프로세스 제어 - PHP 매뉴얼 노트

프로세스 제어 - PHP 매뉴얼 노트

WBOY
WBOY원래의
2016-08-08 09:29:15984검색

스크립트는 명령문으로 구성되며 명령문은 프로세스 제어를 사용하여 기능을 구현합니다. 이 섹션에서는 주로 여러 키워드의 사용을 소개합니다.

다른 경우

elseifelse if과 정확히 동일하게 동작합니다. 콜론을 사용하여 if/elseif 조건을 정의하는 경우 두 단어로 구성된 else if을 사용할 수 없습니다. 그렇지 않으면 PHP에서 구문 분석 오류가 발생합니다.

<code><?php 
$a = 1;
$b = 2;
if($a > $b) :
	echo "$a is greater than $b";
elseif($a == $b) :
	echo "$a equals $b";
else :
	echo "$a is neither greater than or equal to $b";
endif;</code>

대체 구문

다음 키워드는 흐름 제어의 대체 구문을 사용할 수 있습니다. 기본 형식은 왼쪽 중괄호를 콜론으로 바꾸고 오른쪽 중괄호를 다음 문자로 바꾸는 것입니다.

<code>if - endif
while - endwhile
for - endfor
foreach - endforeach
switch - endswitch</code>

주의! PHP는 동일한 제어 블록 내에서 두 구문을 혼합하는 것을 지원하지 않습니다.

하는 동안

이 루프는 언뜻 보면 익숙해 보이지만 일부 용도는 간과됩니다.

매뉴얼에는 숙련된 C 언어 사용자가 do-while 내에 명령문을 배치하는 do-while(0) 루프의 다양한 사용법에 익숙할 수 있다고 나와 있습니다. 저는 이 기술을 처음 들어봤습니다. 아직 C 언어 초보자인 것 같습니다.

그런데 이 특별한 사용법의 장점을 do-while(0) 검색하고 정리해보자.

  1. 코드 청킹은 중괄호를 사용하는 것보다 더 직관적입니다.
  2. break을 사용하여 코드의 나머지 부분을 건너뜁니다.
  3. 매크로 함수를 정의할 때 문장 끝에 세미콜론을 추가하면 함수 호출에 더 가깝습니다.
  4. 블록 수준 범위는 변수 이름이 상위 수준 범위로 확산되는 것을 방지합니다.
  5. goto문을 변형했습니다.

이 게시물은 do{}while(0) - C++ - SegmentFault의 역할을 매우 잘 설명합니다.

foreach

foreach은 배열 및 객체 순회에만 적용할 수 있습니다. foreach구문 구조는 배열을 탐색하는 간단한 방법을 제공합니다. 아래에는 두 가지 구문이 있습니다.

<code>foreach(array_expression as $value)
	statement
foreach(array_expression as $key => $value)
	statement</code>

배열 요소의 값을 수정하려면 $value 앞에 &을 추가하여 참조 할당을 사용해야 합니다.

<code><?php 
$arr = array(1, 2, 3, 4);
foreach($arr as &$value) {
	$value = $value * 2;
}
unset($value);
foreach($arr as $value) {
	echo "$value ";  // 2 4 6 8
}</code>

주의! 배열의 마지막 요소에 대한 $value 참조는 foreach 루프 후에도 유지되므로 unset()을 사용하여 이를 파기하는 것이 좋습니다.

목록-각

샘플 프로그램에서는 가칭 list-each이라는 특별한 순회 방법도 발견되었습니다.

foreach 실행이 시작되면 배열 내부의 포인터가 자동으로 첫 번째 유닛을 가리키므로 foreach 루프 전에 reset()을 호출할 필요가 없습니다. 그러나 whilelist-each에 대해서는 배열 내부 포인터 $arr가 항상 존재하므로 다음 루프 전에 reset($arr)가 필요합니다.

<code><?php 
$arr = array('one', 'two', 'three');
// reset($arr);
while(list($key, $value) = each($arr)) {
	echo "Key: $key; Value: $value ";
}
reset($arr);
while(list($key, $value) = each($arr)) {
	echo "Key: $key; Value: $value ";
}</code>

위 코드에서 첫 번째 reset는 생략 가능하지만, 두 번째 reset는 생략할 수 없습니다.

목록

PHP 5.5에는 배열 배열을 반복하고 중첩 배열을 루프 변수로 압축 해제하는 기능이 추가되었습니다.

<code><?php 
$array = [
	[1, 2],
	[3, 4],
];
foreach($array as list($a, $b)) {
	echo "A: $a; B: $b";
}</code>

list()은 중첩 배열보다 적은 수의 셀을 가질 수 있으며, 이 경우 추가 배열 셀은 무시됩니다. 그 이상 있으면 오류 메시지가 표시됩니다.

휴식

break은 현재 for/foreach/while/do-while/switch 구조의 실행을 종료하는 데 사용됩니다. break선택적인 숫자 매개변수를 사용하여 몇 개의 루프에서 빠져나올지 결정할 수 있지만 매개변수는 변수가 될 수 없습니다.

break여러 루프에서 튀어나오는 현상을 처음 접했기 때문에 이를 시험해 보기 위해 작은 프로그램을 작성했습니다.

<code><?php 
while(1) {
	while(1) {
		echo 'hello ';
		break 2;
	}
}
echo 'world';</code>

구체적으로 C 언어로 시도했는데 구문 오류가 발생했습니다.

계속

break과 유사하게 continue도 선택적 숫자 매개변수를 허용하여 루프 끝까지 건너뛸 루프 수를 결정할 수 있습니다.

주의! PHP에서 switch 문은 continue을 사용할 수 있는 루프 구조로 간주됩니다.

스위치

매뉴얼에는 PHP가 다른 언어와 다르다고 나와 있습니다. continue에 대한 switch 문의 효과는 break의 효과와 비슷합니다. 이것은 무엇을 의미합니까?

switch/case는 엄격한 비교==가 아닌 느슨한 비교===를 수행합니다. 효율성 측면에서 switch 문의 조건은 한 번만 평가되고 각 case 문과 비교하는 데 사용됩니다. case식은 단순 유형으로 평가되는 모든 식일 수 있으며 배열이나 객체는 사용할 수 없습니다. case 문 뒤에는 콜론 대신 세미콜론을 사용할 수 있습니다.

선언

declare 구조는 코드의 실행 명령을 설정하는 데 사용됩니다. 구문 구조는 다음과 같습니다.

<code>declare(directive)
	statement</code>

섹션에서는 directive 코드 세그먼트의 동작을 설정할 수 있습니다. 현재는 declareticks 두 가지 명령만 인식됩니다. encoding 구조는 전역 범위에서도 사용될 수 있으며 만료 후 모든 코드에 영향을 미칩니다. 그러나 declare 구조의 파일이 다른 파일에 포함된 경우 해당 파일이 포함된 상위 파일에서는 작동하지 않습니다. declare

틱(클럭 주기)은 인터프리터가

코드 세그먼트에서 시간이 가능한 N 개의 하위 수준 문을 실행할 때마다 발생하는 이벤트입니다. 각 틱에서 발생하는 이벤트는 declare으로 지정됩니다. 사용법은 대략 다음과 같습니다. register_tick_function()

<code>declare(ticks = 1);
function tick_handler() {
	echo "tick_hander() called.\n";
}
register_tick_function('tick_hander');</code>

可计时的低级语句有很多,register_tick_function()后会调用一次周期事件,每条语句后会调用一次周期事件,花括号结束时会调用一次周期事件。

注意,PHP中表达式不能用逗号隔开,不然会出现语法错误。这点与C语言不同,刚注意到。

可以用encoding指令来对每段脚本指定其编码方式。用法如下:

<code>declare(encoding = 'ISO-8859-1);</code>

return

如果是在全局范围中调用,则当前脚本文件中止运行。如果当前脚本文件是被include或者require,则控制交回调用文件。如果当前脚本时被include的,则return的值会被当作include调用的返回值,那require呢?

require

requireinclude几乎完全一样,除了处理失败的方式不同之外。

require在出错时产生E_COMPILE_ERROR级别的错误,脚本中止。而include只产生警告E_WARNING,脚本继续执行。

include

include语句包含并运行指定文件,这里要注意一下指定文件的寻找次序。

  • 被包含文件先按参数给出的路径寻找。如果定义了路径,include_path会被完全忽略。
  • 如果没有给出目录(只有文件名)时则按照include_path指定的目录寻找。若没找到才在调用脚本文件所在目录和当前工作目录下寻找。那么问题来了,调用脚本文件所在目录和当前工作目录有什么区别呢?
  • 如果最后仍未找到文件,则include结构会发出一条警告,require结构会发出一个致命错误。

当一个文件被包含时,其中包含的代码继承了include所在行的变量范围。从该处开始,被调用文件中定义的变量才可在调用文件中使用。当一个文件被包含时,语法解析器在目标文件的开头脱离PHP模式并进入HTML模式,当文件结尾回复。

对于返回值,在失败时include返回FALSE并且发出警告。成功的包含则返回1,除非在包含文件中另外给出了返回值。如果在包含文件中定义有函数,这些函数不管是在return之前还是之后定义的,都可以独立在主文件中使用。

如果来自远程服务器的文件应该在远端运行而只输出结果,那用readfile()函数更好。另一种将PHP文件包含到一个变量中的方法是用输出控制函数结合include来捕获其输出。第一次遇到,比较陌生。下面这段代码能将脚本vars.php中返回的内容输出。

<code><?php 
$string = get_include_contents('vars.php');
function get_include_contents($filename) {
	if(is_file($filename)) {
		ob_start();
		include $filename;
		$contents = ob_get_contents();
		ob_end_clean();
		return $contents;
	}
	return false;
}
echo $string;</code>

因为includerequire是一种特殊的语言结构,其参数不需要括号。如果文件被包含两次,PHP会发出致命错误,因为函数已经被定义。推荐使用include_once

require_once

require_once语句和require语句完全相同,唯一区别是,PHP会检查该文件是否已经被包含过,如果是则不会再次包含。

include_once

include_once语句和include语句类似,唯一区别是如果该文件已经被包含过,则不会再次包含。

goto

goto操作符用于跳转到程序的另一位置,目标位置可以用目标名称加上冒号来标记。PHP中的goto有一定限制,目标位置只能位于同一个文件和作用域。也就是说无法跳出一个函数或类方法,也无法跳入到任何循环或者switch结构。

(全文完)

以上就介绍了流程控制 - PHP手册笔记,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

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