포함 할 PHP 전달 변수


81

포함 파일에 변수를 전달하려고 합니다. 내 호스트가 PHP 버전을 변경했는데 이제 시도한 솔루션이 작동하지 않습니다.

내가 찾을 수있는 모든 옵션을 시도했다고 생각합니다. 나는 그것이 가장 간단한 것이라고 확신합니다!

변수는 호출하는 첫 번째 파일에서 설정하고 평가해야합니다 (실제로 $_SERVER['PHP_SELF']는이며 포함 된 파일이 아닌 해당 파일의 경로를 반환해야 함 second.php).

옵션 1

첫 번째 파일에서 :

global $variable;
$variable = "apple";
include('second.php');

두 번째 파일에서 :

echo $variable;

옵션 2

첫 번째 파일에서 :

function passvariable(){
    $variable = "apple";
    return $variable;
}
passvariable();

옵션 3

$variable = "apple";
include "myfile.php?var=$variable"; // and I tried with http: and full site address too.


$variable = $_GET["var"]
echo $variable

이 중 어느 것도 나를 위해 일하지 않습니다. PHP 버전은 5.2.16입니다.

내가 무엇을 놓치고 있습니까?

감사!


2
상수를 부정하려고 했습니까?
Oussama Jilal

6
파일을 포함하기 위해 변수를 전달할 필요가 없습니다. 웹 서버는 포함 파일의 코드를 다른 파일에 작성한 것처럼 파일을 포함 할 때 파일의 코드를로드합니다.
Leon Kramer

'이 작품 중 하나도 없음'을 명확히 할 수 있습니까? 오류 메시지도 도움이 될 것입니다 ... 그리고 AFAIK, 포함 된 코드는 동일한 컨텍스트 내에서 실행되므로 global필요하지 않습니다. 첫 번째 옵션은 잘 실행됩니다.
raina77ow

다른 사람들이 말했듯이 include ()는 코드를 붙여 넣는 것과 같으며 동일한 파일에있는 것처럼 코드 실행을 계속합니다. 포함 파일에 변수를 포함하는 방법을 찾을 필요가 없습니다. 단순히 include () 앞에 변수를 쓸 수 있습니다 (필요한 경우).
adrianTNT

답변:


48

extract () 함수를 사용할 수 있습니다.
Drupal은 theme () 함수에서 사용할 수 있습니다.

여기에 $variables인자 가있는 렌더링 함수가 있습니다.

function includeWithVariables($filePath, $variables = array(), $print = true)
{
    $output = NULL;
    if(file_exists($filePath)){
        // Extract the variables to a local namespace
        extract($variables);

        // Start output buffering
        ob_start();

        // Include the template file
        include $filePath;

        // End buffering and return its contents
        $output = ob_get_clean();
    }
    if ($print) {
        print $output;
    }
    return $output;

}


./index.php :

includeWithVariables('header.php', array('title' => 'Header Title'));

./header.php :

<h1><?php echo $title; ?></h1>

이 방법을 사용하여 EXTR_REFS 플래그를 추출 함수에 추가 할 수도 있습니다 ( php.net/manual/en/function.extract.php 참조). 참조와 함께 변수를 전달할 때 array( 'title' => &$title )포함 된 파일 내에서 $ title을 변경할 수 있습니다. .
Mauro Mascia 19

나는 이것이 PHP의 이후 버전에서 작동하지 않는다고 생각합니다. 예를 들어 7.3
Robert Moskal

45

옵션 3은 불가능합니다. 브라우저에서 해당 URL을 입력했을 때와 똑같이 .php 파일의 렌더링 된 출력을 얻을 수 있습니다. (원하는대로) 원시 PHP 코드를 대신 받으면 사이트의 모든 소스 코드가 노출 될 것입니다. 이는 일반적으로 좋지 않습니다.

옵션 2는별로 의미가 없습니다. 함수에서 변수를 숨기고 PHP의 변수 범위에 따라야합니다. 또한 $var = passvariable()'내부'변수를 '외부'로 가져올 어딘가 가 있어야하며 다시 원점으로 돌아갑니다.

옵션 1이 가장 실용적입니다. include()기본적으로 파일의 코드가 말 그대로 상위 페이지의 일부인 것처럼 지정된 파일에서 바로 실행됩니다. 대부분의 사람들이 눈살을 찌푸리는 전역 변수처럼 보이지만 PHP의 구문 분석 의미론에 따르면이 두 가지는 동일합니다.

$x = 'foo';
include('bar.php');

$x = 'foo';
// contents of bar.php pasted here

11

가장 기본적인 수준에서 PHP의 include 구문이 파일에서 코드를 가져 와서 파일을 호출 한 위치에 붙여넣고 include의 매뉴얼에 다음과 같은 내용이 명시되어 있음을 고려하십시오.

파일이 포함되면 포함 된 코드는 포함이 발생하는 행의 변수 범위를 상속합니다. 호출 파일의 해당 줄에서 사용할 수있는 모든 변수는 해당 지점부터 호출 된 파일 내에서 사용할 수 있습니다.

이러한 것들은 모두 다른 문제가 있다고 생각하게 만듭니다. 또한 옵션 번호 3은 리디렉션하지 않고 second.php옵션 번호 2는 이상한 해결 방법 이므로 절대 작동하지 않습니다 . PHP에 포함 된 구문의 가장 기본적인 예는 다음과 같습니다.

vars.php
<?php

$color = 'green';
$fruit = 'apple';

?>

test.php
<?php

echo "A $color $fruit"; // A

include 'vars.php';

echo "A $color $fruit"; // A green apple

?>

옵션 번호 1이이 예제에 가장 가깝고 (더 복잡해야하지만) 작동하지 않는다는 점을 고려하면 include 문에서 실수를했다고 생각하게됩니다 (루트 또는 이와 유사한 경로에 대한 잘못된 경로). 발행물).


아마도 나는 사물의 순서를 혼란스럽게 했습니까? 구조는 사실 다음과 같습니다. main.php $ variable = $ _SERVER [ 'PHP_SELF']; include = ' side.com/footer.php ; footer.php : echo $ variable; 포함 된 모든 파일에는 변수가 포함되어 있지 않으며 단순히 무언가를 수행합니다. 내가 시도한 모든 옵션에서 출력은 비어 있거나 main.php가 아닌 footer.php의 $ _SERVER [ 'PHP_SELF']를 포함합니다. 이것은 다른가요?
user1590646 2010-08-10

5

OP의 질문과 관련하여 특히 "변수는 호출하는 첫 번째 파일 (실제로는 '$ _SERVER ['PHP_SELF '])에서 설정하고 평가해야하며 포함 된 두 번째 파일이 아닌 해당 파일의 경로를 반환해야합니다. php). "

파일이 포함 된 파일을 알려줍니다. 이것을 포함 된 파일에 넣으십시오.

$includer = debug_backtrace();
echo $includer[0]['file'];

"변수는 호출하는 첫 번째 파일 (실제로는 '$ _SERVER ['PHP_SELF '])에서 설정하고 평가해야하며 포함 된 두 번째 파일이 아닌 해당 파일의 경로를 반환해야합니다. php). " 그는 second.php를 포함시킨 파일의 경로가 무엇인지 알아 내야합니다.
Jeremy1026

유명한. (귀하의 답변에서 명확하지 않습니다. [ "OP가 원래 파일 이름을 가져 오길 원하기 때문에 blah blah blah"]).
Madara 's Ghost

5

여기에도 같은 문제가 있습니다. $ GLOBALS 배열을 사용할 수 있습니다.

$GLOBALS["variable"] = "123";
include ("my.php");

다음과 같이 실행해야합니다.

$myvar = "123";
include ("my.php");

....

echo $GLOBALS["myvar"];

좋은 하루 되세요.


4

OPTION 1 은 PHP 7에서 저에게 효과적 이며 PHP 5에서도 작동합니다. 그리고 변수 액세스를 위해 포함 된 파일에는 전역 범위 선언이 필요하지 않습니다. 포함 된 (또는 "필수") 파일은 스크립트의 일부입니다. 변수 선언 후에 "포함"을 만들어야합니다. PHP.ini에서 전역 범위 변수를 잘못 구성했을 수 있습니까?

첫 번째 파일에서 시도 :

  <?php 
  $myvariable="from first file";
  include ("./mysecondfile.php"); // in same folder as first file LOLL
  ?>

mysecondfile.php

  <?php 
  echo "this is my variable ". $myvariable;
  ?>

PHP를 다시 설치하지 않으면 작동합니다.


3

GET 매개 변수를 기반으로 변수를 설정하는 파일이있는이 문제가 발생했습니다. 그리고이 파일은 대규모 콘텐츠 관리 시스템의 다른 부분에서 올바르게 작동하기 때문에 업데이트 할 수 없습니다. 그러나 매개 변수가 실제로 URL 문자열에없는 포함 파일을 통해 해당 코드를 실행하고 싶었습니다. 간단한 해결책은 다른 변수와 마찬가지로 첫 번째 파일에서 GET 변수를 설정할 수 있다는 것입니다.

대신에:

include "myfile.php?var=apple";

다음과 같습니다.

$_GET['var'] = 'apple';
include "myfile.php";

1

php 문서에 따르면 ( $ _SERVER 참조 ) $ _SERVER [ 'PHP_SELF']는 "현재 실행중인 스크립트의 파일 이름"입니다.

INCLUDE 문은 "지정된 파일을 포함 및 평가"하고 "포함 된 코드는 포함이 발생하는 줄의 변수 범위를 상속합니다"( INCLUDE 참조 ).

$ _SERVER [ 'PHP_SELF']가 'second.php'의 코드에서 사용하더라도 첫 번째 파일의 파일 이름을 반환 할 것이라고 생각합니다.

다음 코드로 테스트했는데 예상대로 작동합니다 ($ phpSelf는 첫 번째 파일의 이름입니다).

// In the first.php file
// get the value of $_SERVER['PHP_SELF'] for the 1st file
$phpSelf = $_SERVER['PHP_SELF'];

// include the second file
// This slurps in the contents of second.php
include_once('second.php');

// execute $phpSelf = $_SERVER['PHP_SELF']; in the secod.php file
// echo the value of $_SERVER['PHP_SELF'] of fist file

echo $phpSelf;  // This echos the name of the First.php file.

0

jQuery로 변수를 추가하여 "second.php"에서 모두 실행할 수 있습니다.

<div id="first"></div>

<script>
$("#first").load("second.php?a=<?php echo $var?>")
</scrpt>

0

나는 이것이 오래된 질문이라는 것을 알고 있지만 지금 우연히 발견했고 아무도 이것을 언급하지 않은 것을 보았다. 그래서 그것을 작성합니다.

옵션 1은 이렇게 조정하면 작동합니다.

원래

옵션 1

첫 번째 파일에서 :

global $variable; 
$variable = "apple"; 
include('second.php'); 

두 번째 파일에서 :

echo $variable;

비틀기

첫 번째 파일에서 :

$variable = "apple"; 
include('second.php');

두 번째 파일에서 :

global $variable;
echo $variable;

-1

include 매개 변수가 상대 경로 나 부분 경로가 아니라 전체 파일 경로 여야한다는 것을 발견했습니다 .


1
아뇨, 틀 렸습니다. 상대 경로는에서 잘 작동 include합니다. 당신은 당신이 올바른 "상대적"시작을 가정하고 있는지 확인하기 만하면됩니다.
Peter Bowers

-2

이것은 나를 위해 일했습니다. 두 번째 파일의 내용을 다음과 같이 함수로 래핑하려면 :

firstFile.php

<?php
    include("secondFile.php");

    echoFunction("message");

secondFile.php

<?php
    function echoFunction($variable)
    {
        echo $variable;
    }

-3

이 작업을 수행:

$checksum = "my value"; 
header("Location: recordupdated.php?checksum=$checksum");

이것이 질문에 대한 답이 될 수 있지만, 당신이하고있는 일을 설명하기 위해 당신의 대답에 텍스트를 넣는 것은 항상 좋은 생각입니다. 좋은 답을 쓰는 방법을 읽으십시오 .
Jørgen R

약간의 설명이 좋을 것입니다.
aton1004
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.