web-dev-qa-db-ja.com

PHP含める変数を渡す

変数をincludeファイルに渡そうとしています。私のホストは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();

オプション

$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です。

私は何が欠けていますか?

ありがとう!

69
user1590646

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

オプション2はあまり意味がありません-関数内の変数を非表示にし、PHPの変数スコープの対象となります。また、 'inside'変数を 'outside'にするには$var = passvariable()をどこかに持つ必要があり、元の状態に戻ります。

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

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

そして

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

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>
32
thi3rry

PHPの最も基本的なレベルのinclude文がファイルからコードを取得し、呼び出した場所に貼り付けること、およびincludeのマニュアルに次のように記述されていることを考慮してください。

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

これらのことは、私にはすべて異なる問題があると思わせます。また、second.phpにリダイレクトしていないため、オプション番号3は機能しません。オプション番号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ステートメントでエラーを犯したと思わせます(ルートまたは同様の相対パス問題)。

10

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

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

これも実行する必要があります。

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

....

echo $GLOBALS["myvar"];

ごきげんよう。

5
Daniel

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

これにより、どのファイルにファイルが含まれているかがわかります。これをインクルードファイルに配置します。

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

GETパラメーターに基づいて変数を設定するファイルがあったこの問題に遭遇しました。また、大規模なコンテンツ管理システムの別の部分で正常に機能したため、そのファイルを更新できませんでした。それでも、実際にURL文字列に含まれるパラメーターなしで、インクルードファイルを介してそのコードを実行したかったのです。簡単な解決策は、他の変数と同様に、最初のファイルでGET変数を設定できることです。

の代わりに:

include "myfile.php?var=Apple";

それはそのようになります:

$_GET['var'] = 'Apple';
include "myfile.php";
1
Brian Kosnoff

オプション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を再インストールするだけではない場合。

0
DrOne

Phpドキュメントによると( $ _ SERVER を参照)$ _SERVER ['PHP_SELF']は「現在実行中のスクリプトのファイル名」です。

INCLUDEステートメントは、「指定されたファイルをインクルードして評価する」ファイルと、「含まれるコードは、インクルードが発生する行の変数スコープを継承します」( INCLUDE を参照)。

'second.php'のコードで使用された場合でも、$ _ SERVER ['PHP_SELF']は最初のファイルのファイル名を返すと信じています。

次のコードでこれをテストしましたが、期待通りに動作します($ 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
Jim