귀하는 CMS 줌라갑자기 당신의 취향과 기분에 맞게 리메이크해야 할 필요가 있습니다. com_content 구성 요소의 표준 템플릿을 편집하여 재료 디자인? 구성 요소는 콘텐츠 생성을 담당합니다. 구성 요소 자체의 구조를 살펴보겠습니다.

표준 재료 템플릿의 위치

원본 구성 요소 파일 com_content components\com_content\views\View\tmpl에 있습니다. 구성 요소 파일을 사용하는 \templates\template\html\com_content\ 디렉토리에 복사하면 이 폴더의 파일에서 재료 템플릿을 가져옵니다.

템플릿 디렉토리 및 파일

템플릿 위치 디렉토리에는 보기 생성을 위한 5개의 폴더가 있습니다.

폴더 보관소

  • 아카이브 출력 템플릿 폴더. 이 기사는 고려되지 않으며 거의 ​​사용되지 않습니다. 구조는 아래에 설명된 폴더와 유사합니다.

폴더 기사 - 재료

폴더 첫 장 - 메인 페이지

  • 기본.php category\blog.php와 같은 원리입니다.
  • default_item.php category\blog_item.php와 같은 원리입니다.
  • default_links.php category\blog_links.php와 같은 원리입니다.

폴더 부분 -

  • 블로그.php섹션 블로그 템플릿입니다. category\blog.php와 같은 원리입니다.
  • blog_item.php블로그 섹션의 별도 기사에 대한 템플릿입니다. category\blog_item.php와 같은 원리입니다.
  • 블로그_링크스.php섹션 블로그 아래에 링크를 표시하기 위한 템플릿입니다. category\blog_links.php와 같은 원리입니다.
  • 기본.php표준 단면 템플릿입니다. 범주의 제목, 설명, 요소 수를 표시합니다. 카테고리 제목을 클릭하면 페이지가 category\default.php에 의해 처리됩니다.

템플릿 편집의 예입니다. 재료의 뷰 수를 표시합니다.

우리가 원한다고 하자 히트 수를 출력분리된 재료카테고리 블로그에서. 이렇게 하려면 category\blog_item.php 템플릿을 편집하십시오. 조회수에 대한 정보를 삽입하는 코드는 다음과 같습니다.

아이템 -> 히트 ?>

이제 category\blog_item.php 템플릿 파일에서 이 코드를 삽입할 위치를 찾아야 합니다. 예를 들어, 자료의 마지막 편집 날짜를 표시하기 전에. 라인을 찾고 있습니다:

item->modified) !=0 && $this->item->params->get("show_modify_date")) : ?>

그리고 그 앞에 코드가 있는 줄을 삽입합니다.

예시 여러 열에 범주 나열 .

무의식적으로 참조하십시오 ... 의미가 유사한 러시아어 동의어 및 표현 사전. 아래에. 에드. N. Abramova, M .: 러시아어 사전, 1999. 본능에 의해 무의식적으로, 깨닫지 못하고, 자발적으로, 공황 상태로, 본능적으로, 깨닫지 못하고, 깨닫지 못한 채, ... ... 동의어 사전

무책임하게, 본능적으로, 자동으로, 자발적으로, 맹목적으로. 센티미터 … 동의어 사전

무의식적으로, 무의식적으로, 본능적으로, 기계적으로, 기계적으로, 맹목적으로, 자발적으로; 우연히, 의도하지 않게; 윌리닐리 좋든 싫든 (volens nolens) 어쩔 수 없이 그는 자신이 통제할 수 없는 일 때문에 이 일을 해야 했습니다. ... 동의어 사전

맹목적으로, 무의식적으로, 내적으로, 깨닫지 못한 채, 자각하지 않고, 자발적으로, 무의식적으로, 깨닫지 못한 채, 무의식적으로, 기계적으로, 무의식적으로, 무의식적으로, 직관적으로, 무의식적으로, 육감, 본능적으로 러시아인 사전 ... ... 동의어 사전

무의식적으로 참조하십시오 ... 의미가 유사한 러시아어 동의어 및 표현 사전. 아래에. 에드. N. Abramova, M .: 러시아어 사전, 1999. 맹목적으로 무의식적으로, 무의식적으로; 불명확하게, 무모하게, 무의식적으로, 자발적으로, 본능적으로, 노예처럼, 무의식적으로, 불분명하게, ... ... 동의어 사전

조언 책임지지 않는 사람에게. [어머니]는 뒤돌아보고 싶었지만 무의식적으로 다시 앞으로 나아갔다. M. 고리키, 어머니. [Judushka]는 그의 친한 친구 어머니에게 자신의 재산을 암묵적으로 관리해 달라고 간청했습니다. Saltykov Shchedrin, 신사 Golovlevs ... 작은 학술 사전

보고할 수 없는, 설명할 수 없는, 설명할 수 없는; (짧은 남성은 사용되지 않음) 설명할 수 없는, 설명할 수 없는. 1. 어떠한 통제도 받지 않고 보고할 의무도 없습니다. 그는 암시적으로 (adv.) 가게에서 처분했습니다. 2. 합리적인 고려에 의존하지 않고, ... ... 사전우샤코프

- (그리스 어). 다른 사람을 희생시켜 무책임한 거래를 위탁받은 자. 러시아어에 포함된 외국어 사전. Chudinov A.N., 1910. ANAGALIST 책임 없이 다른 사람을 희생하여 거래를 위임받은 사람. 설명… … 러시아어 외국어 사전

무의식적으로, 기계적으로, 무의식적으로, 자동으로, 기계적으로, 자동으로, 기계적으로, 자동 조종 러시아어 동의어 사전. 자동으로 러시아어 동의어 사전을 자동으로 참조하십시오. 실용적인 가이드. 남: 러시아어 ... 동의어 사전

무의식적으로 참조하십시오 ... 의미가 유사한 러시아어 동의어 및 표현 사전. 아래에. 에드. N. Abramova, M.: 러시아어 사전, 1999. 본능적으로, 무의식적으로, 무의식적으로; 무의식적으로, 무의식적으로, 내적으로, 자발적으로, 자발적으로, 무의식적으로, 맹목적으로, ... ... 동의어 사전

서적

  • 체코슬로바키아 여행, J. Marko, M. Peterka, 프라하, 1959년. 아르티아. 많은 사진 삽화와 함께. 게시자의 바인딩. 안전성이 좋습니다. 이 아름다운 책을 탐구하는 세계 어느 나라의 마법에 걸린 방랑자는 ... 범주: 여행자의 메모, 회고록, 연구 출판사: Artia,
  • Sennaya의 이사회 또는 회의, Gennady Grigoriev, Sergey Nosov, 상트페테르부르크에는 단순히 환상을 일으키는 장소가 있습니다. 센나야 광장도 그 중 하나입니다. "센나야 - 환상의 요람". 저자들은 Sennaya에서 그들에게 일어난 일에 놀란 것 같습니다. 네 그리고... 범주: 고전과 현대 산문 시리즈: 우리 시대의 상트페테르부르크 얼굴발행자:

많은 사람들이 이러한 구성을 한 형태 또는 다른 형태로 작성하는 것을 좋아합니다.
foreach($items를 &$item으로) ( $item += 2; )
그러나 여기에 도사리고 있는 위험을 아는 사람은 많지 않습니다.
예를 들어 보십시오.

Vasya Pupkin은 배열을 가져와서 모든 요소를 ​​2로 늘렸습니다.
$items = array("a" => 10, "b" => 20, "c" => 30,); foreach ($items를 &$item으로) ( $item += 2; ) print_r($items);
나는 덤프를 보고 작업이 해결된 것을 보았고 만족스럽게 남았습니다.
배열([a] => 12[b] => 22[c] => 32)
얼마 후 Petrovich는 이 코드 섹션을 다른 열거로 보완하기로 결정하고 아래를 추가했습니다.
$newitems = array("a" => 10, "b" => 20, "c" => 30,); foreach($newitems as $key=>$item) ( $newitems[$key] += 5; ) print_r($newitems);
그는 자신의 과제도 해결된 것처럼 보였고 성취감에 따라 파일을 닫았습니다.
배열 ([a] => 15 [b] => 25 [c] => 35)
잠시 후, 설명할 수 없는 버그가 나오기 시작했습니다. 왜요?
코드 끝에 var_dump($items)를 만들어 보겠습니다.
배열(3) ( ["a"]=> int(12) ["b"]=> int(22) ["c"]=> &int(30) )
서른! Vasya Pupkin은 그가 확인했다고 맹세합니다. 왜 32이고 Petrovich의 코드 30 이후였습니까?

그 이유는 앰퍼샌드에 있습니다. 표시된 데이터를 다른 사람이 참조하고 있다고 보고합니다. 떠날 때 Vasya는 그 뒤에 있는 임시 변수를 지우지 않았으며, 이를 열거($item)에 사용했습니다. 변수는 "참조에 의한 할당"이라고도 하는 소스("&")를 변경할 수 있는 권한과 함께 사용되었습니다. 그는 변수가 루프 내에서만 사용될 것이라고 확신했습니다. Petrovich는 같은 이름의 변수를 사용하여 열거하는 과정에서 그 값을 변경했으며 매번 이 변수가 저장되는 장소가 변경되었습니다. 그리고 Pupkin 배열의 마지막 요소와 같은 위치에 저장되었습니다.

물론 과장된 기사의 경우. 실제로, 이러한 연결은 특히 프로젝트가 저렴하고 경험이 없고 이질적인 웹 개발자를 포함하는 경우 매우 복잡할 수 있습니다.

이 문제를 어떻게 해결할 수 있습니까?

  • 특히 사용 중인 데이터와 연결되어 있는 경우 임시 변수를 사용한 후 삭제합니다.
    foreach($items를 &$item으로) $item += 2; 설정되지 않음($항목);
  • 누군가가 이미 사용한 변수에 주의하십시오.
  • 개별 함수, 메서드 또는 네임스페이스에서 작업을 캡슐화합니다.
  • print_r 대신 var_dump를 사용하고 앰퍼샌드에 주의하십시오. 브라우저 대신 파일로 덤프하려면 print_r($var,true)의 대안은 다음과 같습니다.
    함수 dump() ( ob_start(); foreach(func_get_args() as $var) var_dump($var); return ob_get_clean(); )
결론적으로 링크와 관련된 버그는 foreach에만 있는 것이 아니라고 말씀드리고 싶습니다. 그리고 그들 모두는 한 번 논의되었습니다. 그러나 내 경험으로 볼 때 이 경우는 실제로 매우 일반적이어서 특별한 주의를 기울일 필요가 있습니다.

많은 치명적이고 복구 가능한 치명적인 오류가 PHP 7에서 예외로 변환되었습니다. 이러한 오류 예외는 자체적으로 Throwable 인터페이스(모든 예외가 상속하는 새 기본 인터페이스)를 구현하는 Error 클래스에서 상속됩니다.

즉, 예외가 대신 throw될 수 있기 때문에 사용자 지정 오류 처리기가 더 이상 트리거되지 않을 수 있습니다(캐치되지 않은 오류 예외에 대해 새로운 치명적인 오류가 발생함).

PHP 7에서 오류가 작동하는 방식에 대한 자세한 설명은 PHP 7 오류 페이지에서 찾을 수 있습니다. 이 마이그레이션 가이드는 이전 버전과의 호환성에 영향을 미치는 변경 사항을 열거할 뿐입니다.

// 깨지는 PHP 5 시대 코드.
함수 핸들러(예외 $e) ( ... )
set_exception_handler("핸들러");

// PHP 5 및 7 호환.
함수 핸들러 ($e ) ( ... )

// PHP 7 전용.
함수 핸들러(Throwable $e ) ( ... )
?>

내부 생성자는 항상 실패 시 예외를 throw합니다.

이전에는 일부 내부 클래스가 없는또는 생성자가 실패했을 때 사용할 수 없는 개체. 이제 모든 내부 클래스는 이 경우 사용자 클래스가 이미 했던 것과 같은 방식으로 예외를 발생시킵니다.

E_STRICT는 심각도 변경을 통지합니다.

모든 E_STRICT통지는 다른 수준으로 재분류되었습니다. E_STRICT상수가 유지되므로 다음과 같이 호출합니다. error_reporting(E_ALL|E_STRICT)오류가 발생하지 않습니다.

E_STRICT심각도 변경 알림
상황 새로운 수준/행동
리소스별 인덱싱 E_NOTICE
추상 정적 메서드
생성자 "재정의" 알림이 제거되었으며 오류가 발생하지 않습니다.
상속 중 서명 불일치 E_경고
사용된 두 특성에서 동일한(호환 가능한) 속성 알림이 제거되었으며 오류가 발생하지 않습니다.
비정적으로 정적 속성에 액세스 E_NOTICE
참조로 변수만 할당해야 합니다. E_NOTICE
변수만 참조로 전달해야 합니다. E_NOTICE
비정적 메서드를 정적으로 호출 E_DEPRECATED

변수 처리에 대한 변경 사항

PHP 7은 이제 소스 파일을 구문 분석할 때 추상 구문 트리를 사용합니다. 이를 통해 이전 버전의 PHP에서 사용된 구문 분석기의 제한으로 인해 이전에 불가능했던 언어에 대한 많은 개선이 허용되었지만 일관성을 위해 몇 가지 특별한 경우가 제거되어 이전 버전과의 호환성이 중단되었습니다. 이러한 경우는 이 섹션에서 자세히 설명합니다.

간접 변수, 속성 및 메서드 처리에 대한 변경 사항

변수, 속성 및 메서드에 대한 간접 액세스는 이제 이전의 특수한 경우와 달리 왼쪽에서 오른쪽 순서로 엄격하게 평가됩니다. 아래 표는 평가 순서가 어떻게 변경되었는지 보여줍니다.

간접 표현의 기존 및 새로운 평가
표현 PHP 5 해석 PHP 7 해석
$$foo["바"]["바즈"] $($foo["바"]["바즈"]) ($$foo)["바"]["바즈"]
$foo->$bar["바즈"] $foo->($bar["바즈"]) ($foo->$bar)["바즈"]
$foo->$bar["바즈"]() $foo->($bar["바즈"])() ($foo->$bar)["바즈"]()
푸::$bar["바즈"]() 푸::($bar["바즈"])() (Foo::$bar)["바즈"]()

이전 오른쪽에서 왼쪽 평가 순서를 사용한 코드는 중괄호와 함께 해당 평가 순서를 명시적으로 사용하도록 다시 작성해야 합니다(위의 중간 열 참조). 이렇게 하면 코드가 PHP 7.x와 앞으로 호환되고 PHP 5.x와 역호환이 됩니다.

var_dump (1 >> - 1);
?>

치명적인 오류: 잡히지 않은 ArithmeticError: /tmp/test.php:2의 음수로 비트 이동

범위를 벗어난 비트 시프트

비트 너비 이상으로 (어느 방향으로든) 비트 시프트 정수항상 0이 됩니다. 이전에는 이러한 이동의 동작이 종속 아키텍처였습니다.

0으로 나누기에 대한 변경 사항

이전에는 나누기(/) 또는 모듈러스(%) 연산자의 제수로 0을 사용하면 E_WARNING이 발생하고 거짓반환됩니다. 이제 나누기 연산자는 IEEE 754에 지정된 대로 부동 소수점을 +INF, -INF 또는 NAN으로 반환합니다. 모듈러스 연산자 E_WARNING이 제거되었으며 DivisionByZeroError 예외가 발생합니다.

var_dump(3/0);
var_dump(0/0);
var_dump(0 % 0 );
?>

PHP 5에서 위 예제의 출력:

경고: %s에서 0으로 나누기 %d 줄 bool(false) 경고: %s에서 0으로 나누기 %d 줄에서 bool(false) 경고: %s에서 0으로 나누기 %d 줄에서 bool(false)

PHP 7에서 위 예제의 출력:

경고: 줄 %s의 0으로 나누기 %d float(INF) 경고: 줄 %s의 0으로 나누기 %d float(NAN) PHP 치명적인 오류: 잡히지 않은 DivisionByZeroError: %s 줄 %d에서 0으로 나누기

$str = "0xffff" ;
$int = filter_var ($str, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX);
if (거짓 === $int ) (
throw new Exception("잘못된 정수입니다!" );
}
var_dump($int); // 정수(65535)
?>

\유(오류가 발생할 수 있습니다

새로운 유니코드 코드포인트 이스케이프 구문의 추가로 인해 리터럴을 포함하는 문자열 \유(잘못된 시퀀스가 ​​뒤따르면 치명적인 오류가 발생합니다. 이를 방지하려면 선행 백슬래시를 이스케이프해야 합니다.

제거된 기능

제거된 INI 지시문

xsl.security_prefs

xsl.security_prefs 지시문이 제거되었습니다. 대신, XsltProcessor::setSecurityPrefs()프로세서별로 보안 기본 설정을 제어하려면 메서드를 호출해야 합니다.

기타 이전 버전과 호환되지 않는 변경 사항

참조로 새 개체를 할당할 수 없습니다.

결과 새로운문을 더 이상 참조로 변수에 할당할 수 없습니다.

클래스C()
$c =& 새로운 C ;
?>

PHP 5에서 위 예제의 출력:

더 이상 사용되지 않음: 참조로 new의 반환 값을 할당하는 것은 3행의 /tmp/test.php에서 더 이상 사용되지 않습니다.

PHP 7에서 위 예제의 출력:

구문 분석 오류: 구문 오류, 3행의 /tmp/test.php에 예기치 않은 "new"(T_NEW)가 있습니다.

유효하지 않은 클래스, 인터페이스 및 특성 이름

다음 이름은 클래스, 인터페이스 또는 특성의 이름을 지정하는 데 사용할 수 없습니다.

  • 부울
  • 정수
  • 뜨다
  • 없는
  • 진실
  • 거짓

또한 다음 이름을 사용해서는 안 됩니다. PHP 7.0에서는 오류가 발생하지 않지만 향후 사용을 위해 예약되어 있으며 더 이상 사용되지 않는 것으로 간주해야 합니다.

  • 물체
  • 혼합
  • 수치

ASP 및 스크립트 PHP 태그 제거됨

ASP 및 스크립트 태그를 사용하여 PHP 코드를 구분하는 지원이 제거되었습니다. 영향을 받는 태그는 다음과 같습니다.

제거된 ASP 및 스크립트 태그
여는 태그 닫는 태그
<% %>
<%= %>

호환되지 않는 컨텍스트에서 호출이 제거됨

이전에 PHP 5.6에서 더 이상 사용되지 않는 컨텍스트가 있는 비정적 메서드에 대한 정적 호출은 이제 호출된 메서드에 정의되지 않은 $이변수 및 사용 중단 경고가 발행됩니다.

클래스 A(
공개 함수 테스트() ( var_dump($this); )
}

// 참고: A를 확장하지 않습니다.
클래스 B(
공개 함수 callNonStaticMethodOfA() ( A::test(); )
}

(신규 B)-> callNonStaticMethodOfA();
?>

PHP 5.6에서 위 예제의 출력:

더 이상 사용되지 않음: 비정적 메서드 A::test()를 정적으로 호출해서는 안 됩니다. $this는 8행 object(B)#1 (0) ( )의 /tmp/test.php에 있는 호환되지 않는 컨텍스트에서 가정합니다.

PHP 7에서 위 예제의 출력:

더 이상 사용되지 않음: 비정적 메서드 A::test()는 8행의 /tmp/test.php에서 정적으로 호출되어서는 안 됩니다. 주의: 정의되지 않은 변수: 3행의 /tmp/test.php에 있습니다. NULL

yield는 이제 오른쪽 연관 연산자입니다.

yield 구문은 더 이상 괄호를 필요로 하지 않으며 인쇄그리고 => . 이로 인해 동작이 변경될 수 있습니다.

에코 수율 - 1 ;
에코(수율) - 1 ;
// 그리고 이제 다음과 같이 해석됩니다.
에코 수율 (- 1 );

$foo를 내지 않으면 죽습니다.
// 이전에 다음과 같이 해석되었습니다.
yield($foo 또는 die);
// 그리고 이제 다음과 같이 해석됩니다.
(yield $foo ) 또는 죽습니다.
?>

괄호를 사용하여 이러한 경우를 명확하게 할 수 있습니다.

함수는 동일한 이름을 가진 여러 매개변수를 가질 수 없습니다.

더 이상 같은 이름으로 두 개 이상의 함수 매개변수를 정의할 수 없습니다. 예를 들어 다음 함수는 E_COMPILE_ERROR:

함수 foo ($a , $b , $unused , $unused ) (
}
?>

인수를 검사하는 함수는 다음을 보고합니다. 현재의매개변수 값

func_get_arg(), func_get_args(), debug_backtrace()예외 역추적은 더 이상 매개변수에 전달된 원래 값을 보고하지 않고 대신 현재 값(수정되었을 수 있음)을 제공합니다.

함수 foo($x)(
$x++;
var_dump(func_get_arg(0));
}
foo(1); ?>

PHP 5에서 위 예제의 출력:

PHP 7에서 위 예제의 출력:

Switch 문에는 기본 블록이 여러 개 있을 수 없습니다.

더 이상 switch 문에서 둘 이상의 기본 블록을 정의할 수 없습니다. 예를 들어 다음 switch 문은 E_COMPILE_ERROR:

스위치(1 ) {
기본:
부서지다;
기본:
부서지다;
}
?>

JSON 확장자가 JSOND로 대체됨

JSON 확장이 JSOND로 대체되어 세 가지 사소한 BC 중단이 발생했습니다. 첫째, 숫자는 소수점으로 끝나지 않아야 합니다(즉, 34. 둘 중 하나로 변경해야 합니다. 34.0 또는 34 ). 둘째, 과학적 표기법을 사용할 때, 이자형지수는 소수점 바로 뒤에 오면 안 됩니다(즉, 3.e3둘 중 하나로 변경해야 합니다. 3.0e3또는 3e3). 마지막으로 빈 문자열은 더 이상 유효한 JSON으로 간주되지 않습니다.

오버플로 시 내부 기능 실패

이전에는 float가 정수로 표현하기에 너무 큰 경우 내부 함수가 float-to-integer 강제 변환에서 생성된 숫자를 자동으로 자릅니다. 이제 E_WARNING이 발생하고 없는반환됩니다.

사용자 지정 세션 처리기 반환 값 수정

다음 중 하나를 반환하는 사용자 정의 세션 핸들러에 의해 구현된 모든 술어 함수 거짓또는 -1 치명적인 오류가 됩니다. 부울 이외의 이러한 함수의 값이 있으면 -1 , 또는 0 반환되면 실패하고 E_WARNING이 발생합니다.

동일한 요소의 정렬 순서

내부 정렬 알고리즘이 개선되어 이전보다 동일한 것으로 비교되는 요소의 정렬 순서가 달라질 수 있습니다.

동일한 것으로 비교되는 요소의 순서에 의존하지 마십시오. 언제든지 변경될 수 있습니다.

잘못된 break 및 switch 문

부서지다그리고 계속하다루프 외부의 명령문 또는 스위치제어 구조는 이제 이전과 같이 런타임 대신 컴파일 시간에 감지되고 트리거됩니다. E_COMPILE_ERROR.

PHP를 아무리 많이 사용하더라도 들어보지도 못한 일부 기능이 여전히 나타납니다. 그들 중 일부는 우리에게 매우 유용할 것입니다. 나는 모든 PHP 프로그래머가 가지고 있어야 할 유용한 기능의 짧은 목록을 만들었습니다.

1. 다양한 인수로 함수 만들기

PHP를 사용하면 선택적 인수를 사용하여 함수를 만들 수 있다는 것을 이미 알고 있을 것입니다. 이제 인수의 수가 경우에 따라 변할 수 있는 함수를 보여 드리겠습니다.

그러나 먼저 일반적인 방법으로 함수를 만드는 방법을 기억합시다.

// 두 개의 선택적 매개변수가 있는 함수 function foo($arg1 = "", $arg2 = "") ( echo "arg1: $arg1\n"; echo "arg2: $arg2\n"; ) foo("hello", "세계"); /* 출력: arg1: 안녕하세요 arg2: 세계 */ foo(); /* 출력: arg1: arg2: */

이제 무제한의 인수를 사용하여 함수를 작성하는 방법을 살펴보겠습니다. 이를 위해 func_get_args() 메서드가 사용됩니다.

// 인수를 지정하지 않음 function foo() ( // 전달된 인수의 배열을 반환합니다. $args = func_get_args(); foreach ($args as $k => $v) ( echo "arg".($k+1) ." : $v\n"; ) ) foo(); /* 아무것도 출력하지 않음 */ foo("hello"); /* 출력 arg1: hello */ foo("hello", "world", "again"); /* 출력 arg1: hello arg2: world arg3: 다시 출력 */

2. Glob()를 사용하여 파일 찾기

종종 함수 이름은 스스로를 나타냅니다. glob() 함수에 대해서도 마찬가지입니다.

자세히 설명하지 않아도 기능은 scandir() 메서드와 유사합니다. 패턴별로 필요한 파일을 찾을 수 있습니다.

// 모든 PHP 파일 찾기 $files = glob("*.php"); print_r($파일); /* 출력: 배열 ( => phptest.php => pi.php => post_output.php => test.php) */

여러 유형의 파일을 찾으려면 다음과 같이 작성해야 합니다.

// 모든 php 및 txt 파일 찾기 $files = glob("*.(php,txt)", GLOB_BRACE); print_r($파일); /* 출력: 배열 ( => phptest.php => pi.php => post_output.php => test.php => log.txt => test.txt) */

템플릿에서 경로를 지정할 수도 있습니다.

$files = glob("../images/a*.jpg"); print_r($파일); /* 출력: 배열( => ../images/apple.jpg => ../images/art.jpg) */

문서의 전체 경로를 얻으려면 realpath() 메서드를 사용하십시오.

$files = glob("../images/a*.jpg"); // 배열의 각 요소에 "realpath" 함수를 적용합니다. $files = array_map("realpath",$files); print_r($파일); /* 출력: 배열( => C:\wamp\www\images\apple.jpg => C:\wamp\www\images\art.jpg) */

3. 사용된 메모리에 대한 정보

스크립트가 차지하는 메모리 양을 추적하면 스크립트를 더 자주 최적화할 수 있습니다.

PHP에는 강력한 메모리 추적 도구가 있습니다. 스크립트의 다른 부분에서 로드가 다를 수 있습니다. 에 사용된 메모리 값을 얻으려면 이 순간, memory_get_usage() 메서드를 사용해야 합니다. 사용된 최대 메모리 양을 수정하려면 memory_get_peak_usage()를 사용하십시오.

echo "초기: ".memory_get_usage()." 바이트 \n"; /* 초기: 361400 바이트 */ // ($i = 0; $i에 대해 약간의 로드를 제공합니다.< 100000; $i++) { $array = md5($i); } // и ещё for ($i = 0; $i < 100000; $i++) { unset($array[$i]); } echo "Final: ".memory_get_usage()." bytes \n"; /* Final: 885912 bytes */ echo "Peak: ".memory_get_peak_usage()." bytes \n"; /* Peak: 13687072 bytes */

4. 프로세서 정보

이렇게 하려면 getrusage() 메서드를 사용해야 합니다. 그러나 이 기능은 Windows에서 작동하지 않습니다.

Print_r(getrusage()); /* 배열 출력 ( => 0 => 0 => 2 => 3 => 12692 => 764 => 3864 => 94 => 0 => 1 => 67 => 4 => 0 => 0 => 0 => 6269 => 0) */

위에 설명 된 그림은 경험이있는 사람들에게 명확 할 것입니다. 시스템 관리. 다른 모든 사람들을 위해 다음과 같은 암호 해독을 제공합니다.

  • ru_oublock: 블록 쓰기 수
  • ru_inblock: 블록 읽기 수
  • ru_msgsnd: 보낸 메시지 수
  • ru_msgrcv: 수신된 메시지 수
  • ru_maxrss: 비페이징 집합의 최대 크기
  • ru_ixrss: 총 공유 메모리
  • ru_idrss: 비공유 데이터의 총량
  • ru_minflt: 사용된 메모리 페이지 수
  • ru_majflt: 페이지 폴트 수
  • ru_nssignals: 수신된 신호의 수
  • ru_nvcsw: 프로세스별 컨텍스트 전환 수
  • ru_nivcsw: 강제 컨텍스트 전환 수
  • ru_nswap: 페이징 중 디스크 액세스 수
  • ru_utime.tv_usec: 사용자 모드에서 보낸 시간(마이크로초)
  • ru_utime.tv_sec: 사용자 모드에서 보낸 시간(초)
  • ru_stime.tv_usec: 특권 모드 시간(마이크로초)
  • ru_stime.tv_sec: 특권 모드 시간(초)

스크립트가 프로세서의 어떤 리소스를 사용하는지 알아내려면 'user time'(사용자 모드의 시간) 및 'system time'(특권 모드의 시간) 값이 필요합니다. 초와 마이크로초 모두에서 결과를 얻을 수 있습니다. 총 초 수를 다음으로 변환하려면 십진수, 마이크로초 값을 100만으로 나누고 값에 초를 추가해야 합니다.

어쩐지 혼란스럽다. 다음은 예입니다.

// 3초 휴식 sleep(3); $ 데이터 = getrusage(); echo "사용자 시간: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "시스템 시간: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* 사용자 시간 인쇄: 0.011552 시스템 시간: 0 */

스크립트를 완료하는 데 약 3초가 걸렸지만 프로세서에 과부하가 걸리지 않았습니다. 문제는 호출(절전) 시 스크립트가 실제로 프로세서의 리소스를 소비하지 않는다는 것입니다. 일반적으로 상당한 시간이 소요되지만 프로세서를 사용하지 않는 작업이 많습니다. 예를 들어 디스크 관련 작업을 기다리는 중입니다. 따라서 스크립트에서 항상 CPU 시간을 사용하는 것은 아닙니다.

다음은 또 다른 예입니다.

// 천만 번 걷기 for($i=0;$i<10000000;$i++) { } $data = getrusage(); echo "User time: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "System time: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* выводит User time: 1.424592 System time: 0.004204 */

스크립트는 1.4초의 CPU 시간이 걸렸습니다. 이 경우 시스템 호출 시간은 일반적으로 낮습니다.

특권 모드 시간(시스템 시간)은 프로세서가 프로그램을 대신하여 커널에 대한 시스템 요청을 실행하는 데 소비하는 시간입니다. 예시:

$start = 마이크로타임(true); // 3초마다 마이크로타임 호출 while(microtime(true) - $start< 3) { } $data = getrusage(); echo "User time: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "System time: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* выводит User time: 1.088171 System time: 1.675315 */

이제 시스템 시간이 이전 예보다 훨씬 더 많이 소요되었습니다. 모두 시스템 리소스를 사용하는 microtime() 메서드 덕분입니다.

그러나 표시된 시간이 정확하지 않을 수 있으므로 주의해야 합니다. 주어진 시간에 다른 프로그램에서도 프로세서 리소스를 사용하고 있으므로 작은 오류가 발생할 수 있습니다.

5. 마법 상수

PHP에는 현재 줄 번호(__LINE__), 파일 경로(__FILE__), 디렉토리 경로(__DIR__), 함수 이름(__FUNCTION__), 클래스 이름(__CLASS__), 메서드 이름(__METHOD__) 및 네임스페이스(__NAMESPACE__)와 같은 많은 마법 상수가 있습니다. .

우리는 그것들을 모두 고려하지 않을 것입니다. 몇 가지만 살펴보겠습니다.

// 이 스크립트는 파일의 현재 위치에 따라 다르며 // 다른 디렉토리에서 사용할 경우 문제를 일으킬 수 있습니다. require_once("config/database.php"); // 이 스크립트는 문제를 일으키지 않습니다. require_once(dirname(__FILE__) . "/config/database.php");

스크립트를 디버깅할 때 __LINE__ 사용:

// 코드 // ... my_debug("일부 디버그 메시지", __LINE__); /* output Line 4: some debug message */ // more code // ... my_debug("another debug message", __LINE__); /* 출력 라인 11: 또 다른 디버그 메시지 */ function my_debug($msg, $line) ( echo "Line $line: $msg\n"; )

6. 고유 ID 생성

고유한 문자열을 생성해야 하는 경우가 있습니다. 여러 번 md5() 함수가 이 문제를 해결하는 데 사용되는 것을 보았습니다.

// 임의의 문자열 생성 echo md5(time() . mt_rand(1,1000000));

그러나 사실, PHP에는 이 목적을 위한 특별한 uniqid() 함수가 있습니다.

// 임의의 문자열을 생성합니다. echo uniqid(); /* 출력 4bd67c947233e */ // 한 번 더 echo uniqid(); /* 4bd67c9472340 출력 */

맨눈으로 보면 첫 글자가 거의 비슷하다는 것을 알 수 있습니다... 이것은 이 방식이 캐릭터 생성에 서버 시간을 사용하기 때문입니다. 심지어 유용하기 때문입니다. 생성된 모든 값은 알파벳 순서로 얻어지므로 빠르게 정렬할 수 있습니다.

중복될 가능성을 줄이기 위해 접두사를 추가하거나 두 번째 매개변수를 사용할 수 있습니다(문자 수 증가).

// echo 접두어가 붙음 uniqid("foo_"); /* output foo_4bd67d6cd8b8f */ // 두 번째 매개변수로 echo uniqid("",true); /* 출력 4bd67d6cd8b926.12135106 */ // 둘 다 echo uniqid("bar_",true); /* bar_4bd67da367b650.43684647 출력 */

이 방법은 md5보다 작은 행을 생성하므로 공간을 절약할 수 있습니다.

7. 직렬화

복잡한 데이터를 데이터베이스나 파일에 저장해야 했던 적이 있습니까? 객체를 문자열로 변환하기 위해 PHP는 특별한 기능을 제공합니다.

일반적으로 이러한 메서드는 2가지입니다. serialize() 및 unserialize()

// 복잡한 배열 $myvar = array("hello", 42, array(1,"two"), "apple"); // 문자열로 변환 $string = serialize($myvar); 에코 $문자열; /* 출력 a:4:(i:0;s:5:"hello";i:1;i:42;i:2;a:2:(i:0;i:1;i:1;s :3:"two";)i:3;s:5:"apple";) */ // 원래 값 가져오기 $newvar = unserialize($string); print_r($newvar); /* Array 출력 ( => hello => 42 => Array ( => 1 => two) => apple) */

이것이 이러한 기능이 작동하는 방식입니다. 그러나 JSON의 대중화로 인해 PHP 5.2에는 json_encode() 및 json_decode() 메소드 2가지가 추가되었습니다. 그들의 작업은 serialize()와 유사합니다.

// 복잡한 배열 $myvar = array("hello", 42, array(1,"two"), "apple"); // 문자열로 변환 $string = json_encode($myvar); 에코 $문자열; /* 출력 ["hello",42,,"apple"] */ // 원래 값 복원 $newvar = json_decode($string); print_r($newvar); /* Array 출력 ( => hello => 42 => Array ( => 1 => two) => apple) */

이 옵션은 더 간결하고 JavaScript와 같은 다른 언어와 호환됩니다. 그러나 매우 정교한 개체로 작업할 때 데이터 손실이 발생할 수 있습니다.

8. 문자열 압축

압축에 대해 이야기할 때 ZIP 형식의 아카이브 파일이 즉시 떠오릅니다. PHP는 압축 기능을 제공합니다 긴 줄파일 없이.

다음 예에서는 gzcompress() 및 gzuncompress() 함수의 작동을 보여줍니다.

$string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut elit id mi ultricies adipiscing. Nulla facilisi. Praesent pulvinar, sapien vel feugiat vestibulum, nulla dui pretium orci, non ultricies elit. , consectetur adipiscing elit. Aliquam pretium ullamcorper urna quis iaculis. Etiam ac massa sed turpis tempor luctus. Curabitur sed nibh eu elit mollis congue. Praesent ipsum diam, consectetur magali ornare a, metus, at lacinia augue. Sed magna nisi, ornare in mollis in, mollis sed nunc. Etiam at justo in leo congue mollis. Nullam in neque eget metus hendrerit scelerisque eu non enim. Ut malesuada lacus eu nulla bibendumodum ideu ; $압축 = gzcompress($문자열); echo "원본 크기: ". strlen($string)."\n"; /* 출력 원본 크기: 800 */ echo "압축된 크기: ". strlen($압축)."\n"; /* 출력 압축 크기: 418 */ // 반환 $original = gzuncompress($compressed);

텍스트 양을 50% 줄일 수 있습니다. 같은 목적으로 다른 압축 알고리즘을 사용하는 gzencode() 및 gzdecode() 메서드를 사용할 수 있습니다.

9. 완료 전 실행

PHP에는 스크립트가 종료되기 전에 일부 코드를 실행할 수 있는 register_shutdown_function() 함수가 있습니다.

몇 가지 정보를 알고 싶다고 가정해 봅시다... 스크립트 실행 시간:

// 시작 시간 가져오기 $start_time = microtime(true); // 일부 작업 // ... // 실행 시간을 출력합니다. echo "execution take: ". (마이크로타임(true) - $start_time). "초.";

언뜻보기에 이것은 사소한 작업처럼 보일 수 있습니다. 이러한 목적을 위해 파일 끝에 코드를 넣을 수 있습니다. 그러나 exit() 함수가 이전 어딘가에서 실행되면 이 코드는 작동하지 않습니다. 또한 페이지에 오류가 있거나 사용자가 브라우저에서 해당 버튼을 클릭하여 페이지 로드를 중단하면 작동하지 않습니다.

register_shutdown_function() 메서드를 사용할 때 코드는 어쨌든 실행됩니다.

$start_time = 마이크로타임(참); register_shutdown_function("my_shutdown"); function my_shutdown() ( global $start_time; echo "실행 시간: ". (microtime(true) - $start_time). " 초."; )

결론

PHP는 콘텐츠로 우리를 끊임없이 놀라게 하는 완전한 행성입니다. 이러한 기능에 대해 어떻게 생각하십니까?