2012-01-26 2 views
2

다음 테스트를 거쳤으며 작동하지 않습니다. 이것을 달성하는 비슷한 방법이 있습니까? 템플릿을을 공식화PHP : 함수 내의 함수가 내부 함수를 포함합니다.

컴파일 클래스 :

private function include_header() { 
    function _metadata() { 
     // Metadata compiler 
     return $metadata; 
    } 
    include (path . "header.php"); 
} 

header.php

<html> 
<head> 
    <?php 
     _metadata(); 
    ?> 
    <title>Hello Stackoverflow!</title> 
</head> 
<body> 
    ... 

_metadata(); 기능은 include_header(); 함수 내에서만 사용할 수 없습니다 - 아무데도 다른 클래스이다. 템플릿 파일에만 $this->_metadata();을 쓰고 싶지는 않습니다. _metadata();. 그것은 성취 할 수 있습니까?

다른 방법으로 외부 파일을 만들 수 있습니다 (예 : functions.php).이 템플릿에는 템플릿 용 밑줄 기능이 있습니다. 원래 쿼리를 사용할 수 있는지는 훨씬 더 자세히 알 수 있습니다.

미리 감사드립니다. the manual에서

답변

4

은 : PHP에서

모든 함수와 클래스는 전역이 -는 그들이 내부와 그 반대의 경우도 마찬가지 정의 된 경우에도 함수 외부에서 호출 할 수 있습니다.

따라서 본질적으로 수행하려는 작업을 수행 할 수 없습니다. _metadatafunction _metadata() { 구문으로 정의 된 경우 항상 전역 함수가됩니다. 일반 함수 구문은 전역 함수 만 지원합니다.

그러나 PHP 5.3에는 "anonymous functions"이라는 것이 있습니다. 변수에 할당 할 수 있습니다. 변수 범위가 될 수 있기 때문에 (명시 적으로 그렇게 말하는 경우에만 전역 변수입니다)이 방법으로 범위를 제한 할 수 있습니다. 예를 들어

:

이 다음과 header.php 호출 할 수
$_metadata = function() { 
    // Metadata compiler 
    return $metadata; 
}; 

덜 안정적인지

<?php $_metadata(); ?> 

참고 :이 변수를 재정의, 예를 들어, 수 다른 익명의 기능 - 실제로는 전혀 기능이 아닙니다. 가장 안전한 솔루션은 궁극적으로 이러한 문제를 해결하는 템플릿 언어를 사용하는 것입니다. 그렇지 않은 경우 전역 함수 또는 익명 함수를 사용해야 함을 인정할 수 있습니다.

+0

나는 이것을 좋아한다. 고맙습니다. – escproxy

1

PHP에서 중첩 함수를 정의 할 수 없습니다. 내 말은, 할 수는 있지만, 전역 적 범위를 가지므로 스크립트 목적에 상관없이 호출 할 수 있기 때문에 목적이 없습니다.

그러나 실제로 간단한 <?php echo $metadata; ?>으로 포함 인쇄 될 변수 $metadata에, 당신은 단지 include_header() 내부의 모든 기능 로직을 실행할 수있는 _metadata() 함수를 정의하고 모든 것을 저장할 필요가 없습니다.

실제로 함수를 정의해야하는 경우 또는 (PHP> 5.3 인 경우) anonymous function 함수를 사용할 수 있습니다. 함수 범위가있는 변수 안에 캡슐화되므로 외부에서는 사용할 수 없습니다.

+0

''echo','print' 등을 피하려고합니다. 함수를 사용하고 싶습니다. – escproxy

+1

@Alex 어쨌든'echo','print' 등을 사용해야합니다. 현재 갖고있는 것은 아무것도하지 않을 것입니다. – Esailija

+0

나는 그 기능 밖이었다. 물론'echo','print'는 함수 안에 있습니다. 그럼에도 불구하고 고마워요 :) – escproxy

관련 문제