PHPの変数の渡し方

このQ&Aのポイント
  • PHPの変数の渡し方についての質問です。a.phpからb.phpに変数を渡す方法について試みたがうまくいかず、ヒントを求めています。
  • a.phpで変数をglobalにしてb.phpで$GLOBALSを使用して取得してみたが、値が取得できなかった。また、smartyを使用して変数をテンプレートに設定し、b.phpで取得しようとしたが、取得できなかった。
  • 質問者はphpScheduleItというスケジュール管理のパッケージを使っており、phpの実装についてまだ深く理解できていないため、ヒントを求めている。
回答を見る
  • ベストアンサー

PHPの変数の渡し方

現在以下のような位置関係のファイルでa.phpからb.phpに変数を渡したいのですが、うまく行きません。 ├dir1 │ └a.php └dir2   └b.php a.php <?php public function a(){ $value = "test"; } ?> b.php <?php public funcition b(){ print($value); } ?> phpについてwebで調べ、a.phpで$valueをglobalにしてb.phpでは 関数内でinclude('../dir1/a.php')を記述して$GLOBALS['$value']を 使ってみたのですが、うまく値がとれませんでした。 a.phpで変数をテンプレートに設定して $smarty->Set('Value', $value); それをb.phpで取得しようとしたのですが $smarty->getTemplateVars(Value); 取得する事ができませんでした。 同じようにgeTTemplateVarsを使って別のphpでは取得出来たりするのですが、 このsmartyのスコープ?というのもわかりません。 phpScheduleItというスケジュール管理のパッケージを触っていて、 php自体初めてで深い実装が全て追えていません。 勉強不足で申し訳ないのですが、何かヒントとなる事がありましたらご教示頂けますでしょうか。 宜しくお願い致します。

  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

ちょっと意味がわからないのですが、a.phpからb.phpへリンクなどで ページの遷移があったときにデータを引き継ぎたいということでしょうか? であればセッションを利用するとよいでしょう。

robarobagoo
質問者

お礼

セッションでできました。ありがとうございました!

その他の回答 (1)

  • tracer
  • ベストアンサー率41% (255/621)
回答No.2

a.phpからb.phpに変数を渡したいだけなら、方法はいろいろあると思いますが、意図的に$GLOBALやsmartyを使いたいということでしょうか? 一般的には、クラスの中に変数を隠蔽して、getter関数から値を得ると思います。smartyがやってることはそういうことですよね。ほかにも、変数にconstを宣言して、直接HOGE::hugeみたいにアクセスするとか、極端にいえば、クラスなどつくらなくても、変数を宣言しているファイルをincludeするだけでも、受け渡しは成立すると思いますが。。どのような受け渡しを期待してるのでしょうか?

robarobagoo
質問者

お礼

質問の意図がわかりにくく申し訳ありません。 既存のsmartyでできたモジュールをカスタマイズしています。 今のところなんとなくでしかsmartyを理解していないというのがあるとは思いますが、 今回質問させて頂いた該当箇所が結構深いところにありまして、余計にわかりにくく。 やりたいことはa.phpでBOOLを設定してb.phpでtrueであれば処理Xをするというような ことでした。 includeしてもなぜかうまくいかない状況だったので、$GLOBALSを使ってみたりしました。 結局、$_SESSIONで解決しました。 ご回答ありがとうございました!

関連するQ&A

  • smarty3で変数表示について

    smarty3 でエラーが発生しています。 現在自宅のサーバーでsmarty3を勉強しているのですが以下のエラーで困っています。 詳しい方ご教授お願いします。 環境 : CentOS 6.3 PHP 5.3.3 Smarty 3.1.13 読み込んでいるファイル test.php 1 <?php 2 ini_set('display_errors', 1); 3 ini_set('date.timezone','Asia/Tokyo'); 4 define('SMARTY_DIR', 'Smarty/libs/'); 5 require_once( SMARTY_DIR. 'Smarty.class.php'); 6 7 $smarty = new Smarty(); 8 9 $smarty->template_dir = '../templates/'; 10 $smarty->compile_dir = '../templates_c/'; 11 $smarty->config_dir = '../config/'; 12 $smarty->cache_dir = '../cache/'; 13 14 $msg = "テストを表示します"; 15 $smarty->assign('msg', $msg); 16 17 $smarty->display('test.tpl'); 18 19 20 ?> テンプレートファイル 1 <html> 2 {$msg} 3 </html> 表示されるエラー文 Fatal error: Uncaught exception 'SmartyCompilerException' with message 'Syntax Error in template "../templates/test.tpl" on line 2 "{$msg}" unknown tag "private_print_expression"' in /usr/local/lib/php/includes/Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php:665 Stack trace: #0 /usr/local/lib/php/includes/Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php(451): Smarty_Internal_TemplateCompilerBase->trigger_template_error('unknown tag "pr...', 2) #1 /usr/local/lib/php/includes/Smarty/libs/sysplugins/smarty_internal_templateparser.php(2353): Smarty_Internal_TemplateCompilerBase->compileTag('private_print_e...', Array, Array) #2 /usr/local/lib/php/includes/Smarty/libs/sysplugins/smarty_internal_templateparser.php(3101): Smarty_Internal_Templateparser->yy_r27() #3 /usr/local/lib/php/includes/Smarty/libs/sysplugins/smarty_internal_templateparser.php(3201): Smarty_Internal_Templateparser->yy_reduce(27) #4 /usr/local/lib/php/includes/Smarty/libs/sysplugins/smarty_intern in /usr/local/lib/php/includes/Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php on line 665 テンプレートファイルの{$msg}を削除して動作させるとコンパイルされてはいるようです。 よろしくお願いします。

    • 締切済み
    • PHP
  • globalと$GLOBALSの違いは?

    globalと$GLOBALSの違いは、連想配列かそうでないかしかないのでしょうか。 大量に使う場合、どちらを使っても動作には差はでないでしょうか。 <?php $s = "グローバルスコープ"; //グローバルスコープ function scope_test0(){ echo $s; // 何も表示されない(ローカルスコープ) } scope_test0(); /* globalを使う */ $a = "スコープの違い"; function scope_test1(){ global $a; //ここでglobalを宣言、スコープが違う変数を参照可能に echo $a; //スコープの違い }; scope_test1(); /* $GLOBALSを使う */ $b = 3; $c = 4; function scope_test2(){ $GLOBALS["c"] = $GLOBALS["b"] + $GLOBALS["c"]; } scope_test2(); echo $c; //7 ?>

    • ベストアンサー
    • PHP
  • PHPのフレームワーク選定

    PHPで何かしらのフレームワークを使おうと思っていますが、経験がないので各フレームワークの特徴が分からず、何を選んでいいか分かりません。 とりあえずテンプレートエンジンの機能だけでもよかったので、シンプルで使いやすそうなSmartyを使ってみました。Smartyは簡単な設定のみで利用できたものの、すべてのソース(テンプレート以外のプログラムファイル)に # $smarty->template_dir = '…'; # $smarty->config_dir = '…'; などと、テンプレートファイルや設定ファイルのディレクトリを書かねばならず、環境依存の記述をプログラムファイルに書きまくる事を前提としていて、これはありえないなと思いもう少しきちんとしたつくりのフレームワークを使おうと思いました。 ※最悪の場合、<?php include './common.php'; ?>などと書こうかと思ったのですが、それでもプログラムファイルに環境依存の値を書くことには変わらないので、そうしなくともよいものを利用したいと思っています。 条件としては ・テンプレートが利用できる【必須】  (サイトの共通デザイン部分と変化する部分の分離をしたい) ・Windows環境で開発しレンタルサーバにアップする関係もあり  環境依存の記述は最小限にしたい。少なくともプログラムファイルに  書かずに済むようにしたい。【必須とは言わないが強い希望】 ・設定が簡単なほどいい ・多くのレンタルサーバで使えるものがいい ・「http://…/home.php」などとPHPのファイル名丸出しのURLではなく、  「http://…/home」とできるなど、ファイル名とURLを分離できるとうれしい ・DBは「今のところ」使わないが将来的には使うかも という感じです。 上記条件に合致するお勧めのPHPフレームワークを教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPのinclude('ファイル名')で指定できてしまうのはなぜ?

    お世話になります。 Smartyでテンプレートを用いながらPHPで開発を行っております。 たとえば、あるファイルからSmarty.class.phpをincludeする時 にinclude('Smarty.class.php')でどうやらincludeできている ようなのですが、、なぜ!?なのでしょうか? イメージ的には、include('パス')もしくはphp.iniに設定されている ディレクトリ直下のファイルというイメージなのですが。。 php.iniをのぞいてみるとinclude_pathはコメントアウトされている のですが・・ 疑問です。 ご教授お願いいたします。

    • ベストアンサー
    • PHP
  • PHP(smarty)についての質問(文字化け)

    あるサイトでsmartyを勉強中ですが、そのサンプルファイルを実行したところ、 文字化けが発生して困っています。 ・form.php←お問い合わせ用テンプレートファイルの指定 ・form.tpl←お問い合わせ情報を入力させるテンプレートファイル ・template.tpl←テンプレートファイルを表示させるテンプレートファイル form.phpから、お客様情報を入力させるためのテンプレートファイル(form.tpl)を指定し、 template.tplにそれを表示させるのが処理概要です。 実行すると、タイトルの"問い合わせフォーム"は表示されますが、 それ以下のform.tplの日本語部分が文字化けします。 template.tplで{include file=$content_tpl params=$params}の処理で form.tplを取り込んでいますが、その時文字コードがおかしくなっている気がします。 form.tplに対して文字コード(UTF-8)が有効になっていないと思われます。 実験的に、{include file=$content_tpl params=$params}を削除して、 そこにform.tplの記載をすべて記述すると文字化けは起こりませんでした。 文字コードの指定をform.tplに対しても有効にするにはどのように修正すればよろしいでしょうか。 以下にソースファイルを記載します。 ★form.php <?php // 共通の設定を読み込む require_once( 'common.php' ); // Smartyオブジェクト取得 $smarty =& getSmartyObj(); // ひな形のSmartyテンプレートでincludeするテンプレートを指定 $smarty->assign( 'content_tpl', 'form.tpl' ); // パラメータを渡す $smarty->assign( 'params', array( 'types' => array( 'request' => '意見、要望', 'question' => '質問、問い合わせ', 'other' => 'その他' ) ) ); // ページを表示する $smarty->display( 'template.tpl' ); ?> ★form.tpl <p>お問い合わせやご意見・ご要望を以下のフォームにご記入の上ご送信ください。</p> <form method="post" action="post.php"> <dl> <dt>お名前</dt> <dd> <input type="text" name="name" value="{$params.name|escape:'html':'UTF-8'}" /> {if $params.errors.name} <p class="error-message">名前を入力してください。</p> {/if} </dd> <dt>メールアドレス</dt> <dd> <input type="text" name="address" value="{$params.address|escape:'html':'UTF-8'}" /> {if $params.errors.address} <p class="error-message">アドレスが不正です。</p> {/if} </dd> <dt>お問い合わせ種類</dt> <dd> {html_options name="type" options=$params.types selected=$params.type} {if $params.errors.type} <p class="error-message">お問い合わせ種類が不正です。</p> {/if} </dd> <dt>お問い合わせ件名</dt> <dd> <input type="text" name="title" value="{$params.title|escape:'html':'UTF-8'}" /> {if $params.errors.title} <p class="error-message">件名を入力してください。</p> {/if} </dd> <dt>お問い合わせ内容</dt> <dd> <textarea name="content" cols="60" rows="5"> {$params.content|escape:'html':'UTF-8'} </textarea> {if $params.errors.content} <p class="error-message">お問い合わせ内容を入力してください。</p> {/if} </dd> </dl> <input type="submit" value="送信する" /> </form> ★template.tpl <?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>問い合わせフォーム</title> <style type="text/css"> {literal} .error-message{ margin:5px; font-size:80%; color:red; } {/literal} </style> </head> <body> <h1>問い合わせフォーム</h1> {include file=$content_tpl params=$params} </body> </html> ★common.php <?php define( 'SMARTY_DIR', 'C:/xampp\php/smarty/libs/' ); require_once( SMARTY_DIR .'Smarty.class.php' ); // Smartyオブジェクト取得 function & getSmartyObj() { static $smarty = null; if( is_null( $smarty ) ){ $smarty = new Smarty(); $smarty->template_dir = 'C:/xampp/php/smarty/templates/'; $smarty->compile_dir = 'C:/xampp/php/smarty/templates_c/'; $smarty->config_dir = 'C:/xampp/php/smarty/configs/'; $smarty->cache_dir = 'C:/xampp/php/smarty/cache/'; } return $smarty; } ?>

    • ベストアンサー
    • PHP
  • Smartyのtemplatesとtemplates_cのパスの基準について

    Windows環境でSmartyを動かしています。 動かしているサンプルソースがWindows用ではないため、パスなどを動くように直していたのですが、パスの設定でつまってしまいました。 サンプルのphpファイルはC:\xampp\htdocs\sample\に置いており、 Apacheのinclude_pathにC:\xampp\php\smarty\libs\を設定しました。 「templates_c」「templates」「configs」「cache」のフォルダを同じ場所に作成し、 それぞれディレクトリを指定しようとしたのですが、サンプルの「/home/~」というのをどのように直せばいいのか色々と試していて、 $smarty->template_dir = '../templates/'; $smarty->compile_dir = 'C:/xampp/php/smarty/templates_c/'; $smarty->config_dir = 'C:/xampp/php/smarty/configs/'; $smarty->cache_dir = 'C:/xampp/php/smarty/cache/'; で正常に動くのですが、 $smarty->template_dir = '../templates/'; $smarty->compile_dir = '../templates_c/'; とすると、templates_cが存在しないというエラーが出てきます。 compile_dirを"../"にするとhtdocsの直下にファイルができていたので、compile_dirはphpファイルからの相対パスで、template_dirはlibsからの相対パスになっているように思いますが、相対パスで指定する場合の基準パスが違うのでしょうか?

    • 締切済み
    • PHP
  • 何を言いたいのでしょうか!?

     以下の意味ですが、わたし的(素人)には何を言いたいのか、物に例えると、輪郭程度でしたらわかります。  具体的に何を言いたいのでしょうか!?(PHP教本にありました。)   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ $GLOBALS グローバルスコープに定義された変数名をキーとして連想配列を持ちます。 <?php $globals_test = 1; echo $globals_test,PHP_EOL; (1) echo $GLOBALS[‘globals_test’],PHP_EOL; (2)  (1)と(2)は同じ変数を参照にしており、このスクリプトでは1が出力されます。 PHPでは関数の中などのローカルスコープでも、$GLOBALS変数を用いてあらゆるグローバル 変数への読み書きができます。globalキーワードと同様、スコープを区切らずにあらゆる変数にア クセスできてしまうと、思わぬ個所で値が変更され、それが他の個所で思わぬ影響を及ぼす場合があ ります。$GLOBALSを利用するのはやむを得ない場合や、利用用途がそのプログラムの開発に携 わるすべての人に明確である場合に限るべきです。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  以上よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • phpでの局所変数

    phpで、perlでいうlocalやmyのような宣言はできないのでしょうか? function a() {  if(1){   $a=2;   print "$a<br>";  }  print "$a<br>"; } としても2が2つ表示されてしまいます。 ある関数内で場所を問わず宣言したグローバル変数でない変数のスコープは、宣言場所がどこであれ、「関数内」となるのでしょうか?

    • ベストアンサー
    • PHP
  • Smartyのテンプレートにincludeしたファイルを表示したいので

    Smartyのテンプレートにincludeしたファイルを表示したいのですが、うまくいきません。 具体的には、意図しない数値が入ってしまいます。 どうすればよいのでしょうか? ■呼び出す側 require("../../libs/Smarty.class.php"); require_once('../../lib/set_include_path.php'); $header = include("header.php"); $smarty = new Smarty(); $smarty->assign("header",$header); $smarty->display("date.html"); ■テンプレート <body> {$header}<br>日付<br> ■表示例 include("header.php"); の内容が正常表示 1 日付 include("header.php"); の内容が正常表示された後、勝手に「1」と表示されるので、困ってます。表示されないようにするにはどうすればよいでしょうか。 var_dump($header);ってしたところ、int(1) ってなるので、この1が表示されているのかと思うのですが、なんで表示されるのか、表示されないようにするにはどうすればよいか、教えてください。

    • ベストアンサー
    • PHP
  • ロリポップでSmartyのtpl読み込みエラー

    下記のコードを実行すると、  Smarty error: unable to read resource: "template1.tpl"  というエラーが出てしまいます。 $smarty->template_dirで指定したディレクトリ名の中に  "template1.tpl"というファイルは配置してあります。  原因などわかればおしえていただけないでしょうか。 index.php <?php require_once("Smarty.class.php"); $smarty = new Smarty; $smarty->template_dir = './templates/'; $smarty->compile_dir = './templates_c/'; $smarty->config_dir = './configs/'; $smarty->cache_dir = './cache/'; $smarty->display("template1.tpl"); ?> 【サーバ】  ロリポップです。 【その他】 index.phpをホームディレクトリ配下におくとエラーは消えます。 【ディレクトリ構成】 modules/index.php と templates/template1.tpl をがあり、 index.php から template1.tpl を読み込もうとしています。  ・modules →index.php ・templates →template1.tpl

    • ベストアンサー
    • PHP

専門家に質問してみよう