含めるPHPパス変数


84

変数をインクルードファイルに渡そうとしています。私のホストはPHPのバージョンを変更しましたが、今試した解決策は機能しません。

私は私が見つけることができるすべてのオプションを試したと思います。それが最も簡単なことだと確信しています!

変数は、呼び出し元の最初のファイルから設定および評価する必要があります(実際には$_SERVER['PHP_SELF']、であり、インクルードではなく、そのファイルのパスを返す必要がありますsecond.php)。

オプション1

最初のファイル:

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

2番目のファイル:

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 2012

7
ファイルを含めるために変数を渡す必要はありません。インクルードファイルから他のファイルにコードを書き込んだ場合と同じように、ファイルをインクルードすると、Webサーバーはファイルのコードをロードするだけです。
Leon Kramer

「これらの作品のどれも」を明確にできますか?エラーメッセージも役立ちます...そして、AFAIK、含まれているコードは同じコンテキスト内で実行されるため、global必要ありません。最初のオプションは問題なく実行されるはずです。
raina77ow 2012

他の人が言ったように、include()はそこにコードを貼り付けるのと同じで、同じファイルにあるのと同じようにコードの実行を継続します。インクルードファイルに変数をインクルードする方法を見つける必要はありません。include()の前に変数を書き込むだけです(必要な場合)。
adrianTNT 2012

回答:


49

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を変更できます。 。
マウロマスシア

これはPHPの新しいバージョン、たとえば7.3では機能しないと思います
RobertMoskal20年

46

オプション3は不可能です。ブラウザでそのURLを押した場合とまったく同じように、.phpファイルのレンダリング出力を取得します。代わりに(必要に応じて)生のPHPコードを入手した場合、サイトのすべてのソースコードが公開されますが、これは一般的には良いことではありません。

オプション2はあまり意味がありません。関数内の変数を非表示にし、PHPの変数スコープの対象になります。また$var = passvariable()、その「内部」変数を「外部」に取得するための場所が必要であり、正方形の変数に戻ります。

オプション1が最も実用的です。include()基本的に、ファイル内のコードが文字通り親ページの一部であるかのように、指定されたファイルを丸呑みしてそこで実行します。これはグローバル変数のように見えますが、ここではほとんどの人が眉をひそめていますが、PHPの解析セマンティクスでは、これら2つは同じです。

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

そして

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

11

最も基本的なレベルでのphpのincludeステートメントがファイルからコードを取得し、それを呼び出した場所に貼り付けることを考えると、includeのマニュアルには次のように記載されています。

ファイルがインクルードされると、ファイルに含まれるコードは、インクルードが発生する行の可変スコープを継承します。呼び出し元ファイルのその行で使用可能な変数は、その時点から、呼び出されたファイル内で使用可能になります。

これらのことから、私はまったく別の問題があると思います。また、オプション番号3は、リダイレクトしsecond.phpていないため、機能しません。オプション番号2は、奇妙な回避策です。PHPのincludeステートメントの最も基本的な例は次のとおりです。

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 2012

5

OPの質問に関しては、具体的には「変数は呼び出し元の最初のファイルから設定および評価する必要があり(実際には '$ _SERVER [' PHP_SELF ']'であり、含まれている2番目のファイルではなくそのファイルのパスを返す必要があります。 php)。」

これにより、どのファイルにファイルが含まれているかがわかります。これを同梱のファイルに入れます。

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

彼の質問におけるOPのコメントに基づいて、「変数は呼び出し元の最初のファイルから設定および評価する必要があり(実際には '$ _SERVER [' PHP_SELF ']'であり、含まれている2番目のファイルではなくそのファイルのパスを返す必要があります。 php)。」彼は、second.phpを含めたファイルのパスが何であるかを知る必要があります。
Jeremy1026 2012

了解しました。(あなたの答えからは明らかではありません、それを明確にしてください["OPは元のファイル名を取得したいので何とか何とか何とか"])。
マダラの幽霊

5

ここでも同じ問題があります。$ GLOBALS配列を使用できます。

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

また、これを実行する必要があります。

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

....

echo $GLOBALS["myvar"];

ごきげんよう。


4

オプション1は、PHP 7で機能しましたが、確かにPHP5でも機能します。また、変数アクセス用のインクルードファイルにはグローバルスコープ宣言は必要ありません。インクルードファイルまたは「必須」ファイルはスクリプトの一部です。変数宣言の後に必ず「インクルード」を作成してください。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 docs($ _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'); 

2番目のファイル:

echo $variable;

微調整

最初のファイル:

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

2番目のファイル:

global $variable;
echo $variable;

-1

これが機能するには、includeパラメーターが相対パスや部分パスではなく、ファイルパス全体である必要があることがわかりました。


1
いいえ、それは正しくありません。相対パスは、で問題なく機能しincludeます。正しい「何に対して」の始まりを想定していることを確認する必要があります。
Peter Bowers

-3

これを行う:

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

2
これは質問に答えるかもしれませんが、あなたがしていることを説明するためにあなたの答えにいくつかのテキストを入れることは常に良い考えです。良い答えを書く方法を読んでください。
–JørgenR 2015

1
いくつかの説明は素晴らしいでしょう。
aton1004 2015年

-3

これは私にとってはうまくいきました:次のように、2番目のファイルの内容を関数にラップします:

firstFile.php

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

    echoFunction("message");

secondFile.php

<?php
    function echoFunction($variable)
    {
        echo $variable;
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.