
定型の文字列で後から定義される変数を展開させたいのですが、そういったことはできないのでしょうか?
以下aaa.phpの中身
PHP
1<?php 2$LONG_TEXT = "${company}株式会社 ${name}様\n あいうえお${x}かきくけこ${y}"; 3?>
以下bbb.phpの中身
PHP
1<?php 2require_once 'aaa.php'; 3 4$company = 'アップル'; 5$name = 'スティーブ'; 6$x = '◯◯◯'; 7$y = '×××'; 8 9echo $LONG_TEXT; 10?>
期待していたもの
"アップル株式会社 スティーブ様\n あいうえお◯◯◯かきくけこ×××"
実際に得られたもの
"株式会社 様\n あいうえおかきくけこ"
$company等の変数よりも後に $LONG_TEXT を書けば良いというのは分かります。
例では $LONG_TEXT 1つだけですが、こういった定型の文字列が複数あり、また頻繁に書き換えるため
メンテナンスしやすいように独立したファイルに書きたいのです。
文字列の書式を定義しておいて、後から変数を代入することはできないのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
関数にしてしまうと言うのはどうですか?
aaa.php
PHP
1<?php 2function long_text($company, $name, $x, $y) { 3 return "${company}株式会社 ${name}様\n あいうえお${x}かきくけこ${y}"; 4}
bbb.php
PHP
1<?php 2require_once 'aaa.php'; 3 4$company = 'アップル'; 5$name = 'スティーブ'; 6$x = '◯◯◯'; 7$y = '×××'; 8 9echo long_text($company, $name, $x, $y);
引数の順番では無く名前が重要である、そういった呼び出しが複数ある、と言うのであれば、配列で受け渡すようにすればいいかと思います。
aaa.php
PHP
1<?php 2function long_text($arr) { 3 return "$arr[company]株式会社 $arr[name]様\n あいうえお$arr[x]かきくけこ$arr[y]\n"; 4} 5 6function short_text($arr) { 7 return "$arr[name]様におかれましては以下略\n つまり$arr[z]です。\n"; 8}
bbb.php
PHP
1<?php 2require_once 'aaa2.php'; 3 4$arr = [ 5 'company' => 'アップル', 6 'name' => 'スティーブ', 7 'x' => '◯◯◯', 8 'y' => '×××', 9 'z' => '△△△', 10]; 11 12echo long_text($arr); 13echo short_text($arr);
より複雑に、無いとき時は自動生成されたり、まとめて行いたいとなると、ockeghemさんの回答のようにクラスでまとめた方が良いかもしれません。
投稿2017/09/29 13:12
総合スコア21741
0
sprintfで順番の指定もできますよ。
PHP
1$res = sprintf( '%3$s株式会社 %2$s様\n あいうえお%1$sかきくけこ%2$s' 2 , '[1]' 3 , '[2]' 4 , '[3]' 5); 6// [3]株式会社 [2]様\n あいうえお[1]かきくけこ[2]
【PHP関数講座:sprintf | そふぃのphp入門】
http://php-beginner.com/function/strings/sprintf.html
投稿2017/09/29 12:21
編集2017/09/29 12:22総合スコア69625
0
クラスにしたらどうでしょうか? セッター作ると長くなるのでpublicプロパティにしましたが、そのへんはお好みで。
PHP
1<?php 2 3class LongText { 4 public $company; 5 public $name; 6 public $x; 7 public $y; 8 public function getText() { 9 return "{$this->company}株式会社 {$this->name}様\n あいうえお{$this->x}かきくけこ{$this->y}"; 10 } 11} 12 13$t = new LongText(); 14$t->company = 'アップル'; 15$t->name = 'スティーブ'; 16$t->x = '◯◯◯'; 17$t->y = '×××'; 18 19echo $t->getText();
asahina1979さんが既に示唆されていますが、おそらくもっとも要望にかなうのはevalでしょうね。
PHP
1<?php 2$LONG_TEXT = 'return "${company}株式会社 ${name}様\n あいうえお${x}かきくけこ${y}";'; 3 4$company = 'アップル'; 5$name = 'スティーブ'; 6$x = '◯◯◯'; 7$y = '×××'; 8 9echo eval($LONG_TEXT);
ただ、evalは非常に危険な機能ですので、濫用は絶対に駄目です。非常手段として紹介しましたが、もっと安全な方法を使うべきかと思います。
警告
eval() は非常に危険な言語構造です。 というのも、任意の PHP コードを実行できてしまうからです。 これを使うことはおすすめしません。 いろいろ検討した結果どうしても使わざるを得なくなった場合は、細心の注意を払って使いましょう。 ユーザーから受け取ったデータをそのまま渡してはいけません。 渡す前に、適切な検証が必要です。
http://php.net/manual/ja/function.eval.php から引用
投稿2017/09/29 12:18
編集2017/09/29 12:37総合スコア11705
0
ベストアンサー
ごくかんたんなもの(名前でなく、「何番目」で管理するしかない)で良ければ、sprintf
を使うという手もあります(PHPリファレンス)。
php
1$LONG_TEXT = "%s株式会社 %s様\n あいうえお%sかきくけこ%s"; 2 3$replaced = sprintf($LONG_TEXT, $company, $name, $x, $y);
投稿2017/09/29 11:46
総合スコア146530
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2017/09/29 22:12

0
独自に実装しても良いですが、ご質問のような状況ではテンプレートエンジンを利用するとよいかと思います。
PHPではSmartyというライブラリが有名かと思います。
また、それをさらにシンプルにした下記のDivなども見てみてはいかがでしょうか。
投稿2017/09/29 11:21

退会済みユーザー
総合スコア0
0
順番の問題では?
PHP
1$company = 'アップル'; 2$name = 'スティーブ'; 3$x = '◯◯◯'; 4$y = '×××'; 5require_once 'aaa.php'; 6 7echo $LONG_TEXT;
投稿2017/09/29 10:25
総合スコア117615
0
自分で定義したプレースホルダーを使うといいっすね。
投稿2017/09/29 10:24

退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2017/09/29 10:32

退会済みユーザー
2017/09/29 10:33

退会済みユーザー
2017/09/29 11:25
2017/09/29 12:04

退会済みユーザー
2017/09/29 21:54

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。