質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

519閲覧

PHPの定数値の文字連結について

daiki002

総合スコア68

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

1クリップ

投稿2020/04/24 22:12

編集2020/08/11 17:09

質問

test001.phpは期待する結果を得られています。
test002.phpが定数値が消えています。
test003.phpは期待する結果を得られています。

test002.phpのような文字連結方法で定数値を出力するにはどのように書けばよいでしょうか?
そもそも無理なのでしょうか?

test001.php

php

1<?php 2const hoge = '123'; 3echo "hello" . hoge; 4// hello123

test002.php

php

1<?php 2const hoge = '123'; 3echo "hello${hoge}"; 4// hello

test003.php

<?php $hoge = '123'; echo "hello${hoge}"; // hello123
kai0310👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/04/25 00:13

大目的は何でしょう。 これはミニマムコードだけでは判断できないように思います。
guest

回答3

0

こんなのは見つけました。

php

1<?php 2const hoge = "123"; 3$cst = 'cst'; 4function cst($constant){ 5 return $constant; 6} 7 8echo <<<EOF 9hoge{$cst(hoge)} 10EOF;

ダブルクォーテーションでも動きます。

php

1 2echo "hoge{$cst(hoge)}";

投稿2020/04/25 00:34

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

あまり意識したことがなかったのですけど、二重引用符の中の変数のパースはドル記号 ($)がトリガーとなっています。

そのため、定数をそのまま展開することはできなさそうです。
(なんかありそうな気はしますが、今の所、回避方法が思い浮かびませんでした)

代替案を2つほど紹介しておきます。

php

1<?php 2const HOGE = '123'; 3echo "hello" . HOGE; 4echo sprintf("hello%s", HOGE); 5echo str_replace("{HOGE}", HOGE, "hello{HOGE}");

追記
ごく簡単な置換用の関数を作ってみました。

php

1<?php 2const HOGE = '123'; 3echo const_replace("hello{HOGE}"); 4const FUGA = '456'; 5echo const_replace("hello2{HOGE}{FUGA}"); 6 7function const_replace($str){ 8 foreach(get_defined_constants(true)['user'] as $key => $val){ 9 $str = str_replace('{' . $key . '}', $val, $str); 10 } 11 return $str; 12}

str_replace がベースなので、当然ですが置換文字列によっては誤作動します。
参考程度のものとお考えください。

投稿2020/04/24 23:32

編集2020/04/24 23:53
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daiki002

2020/04/24 23:43

現時点のPHPの仕様としては無理なのですね… 情報ありがとうございます。 展開用に何か作る必要があることを考えると汎用的に使えるので純粋にsprintfを利用するのが良いという気がしますね…
退会済みユーザー

退会済みユーザー

2020/04/24 23:51

ちょっと趣味のコードを追記してみましたw
guest

0

そもそも論ですが、同じ定数が二度定義されているので動かなくないと思います。

ただ、別で動かしてる可能性も加味し、参考サイトを貼っておきます。
https://qiita.com/deigo/items/bb711f1b91f458681c05

投稿2020/04/24 23:07

kyoya0819

総合スコア10429

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/04/24 23:14 編集

なんかできそうな気がするんだけどなぁ。。。思いつかんw 下手に関数作るぐらいなら、sprintf() で良い気がします。
daiki002

2020/04/24 23:43 編集

> 同じ定数が二度定義されているので動かなくないと思います。 すみません、teratail質問時の書き方が悪かったです。 それぞれ別に実行しているので二重定義は発生しません。 修正しました。 参考リンクありがとうございます。 やはり現在のPHPの仕様としては無理なのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問