teratail header banner
teratail header banner
質問するログイン新規登録

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

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

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

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

Q&A

解決済

1回答

2954閲覧

PHP 定数は型指定できない?

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2021/10/22 02:06

0

0

前提・実現したいこと

定数に対して型を明示的に指定できないのでしょうか?
現状は定数を使用して比較しようとするとプログラムが止まってしまいます。
定数ではなく、メンバ変数として宣言してコンストラクタで代入するのが定石なのでしょうか?

以下のように指定したいです。

PHP

1public const string directorActivityHash_GLASS = '1888320892';

発生している問題・エラーメッセージ

Fatal error: Uncaught Error: Undefined constant "directorActivityHash_GLASS" in C:\xampp\htdocs\Destiny2\raid\lib\RaidReport.php:41 Stack trace: #0 C:\xampp\htdocs\Destiny2\raid\raid.php(32): RaidReport->getRaidReport('1888320892', 'NihonNo_Roma4mi...') #1 C:\xampp\htdocs\Destiny2\raid\raid.php(257): CreateRaidTable('4726149', '1888320892') #2 {main} thrown in C:\xampp\htdocs\Destiny2\raid\lib\RaidReport.php on line 41

該当のソースコード

PHP

1<?php 2class RaidReport 3{ 4 // 定数 5 public const directorActivityHash_GLASS = '1888320892'; 6 public const directorActivityHash_DEEP = '541780856'; 7 public const directorActivityHash_GARDEN = '2712317338'; 8 public const directorActivityHash_WISH = '3181387331'; 9 10 // メンバ変数 11 public $profile; 12 public $raidCompleted1; 13 public $raidCompleted2; 14 public $raidCompleted3; 15 public $raidPhaseCompleted1; 16 public $raidPhaseCompleted2; 17 public $raidPhaseCompleted3; 18 public $raidPhaseCnt; 19 private $BungieAPI; 20 21 // コンストラクタ 22 public function __construct($instanceBungieAPI) 23 { 24 require_once 'BungieProfileAPI.php'; 25 $this->raidCompleted1 = false; 26 $this->raidCompleted2 = false; 27 $this->raidCompleted3 = false; 28 $this->raidPhaseCompleted1 = array(); 29 $this->raidPhaseCompleted2 = array(); 30 $this->raidPhaseCompleted3 = array(); 31 $this->raidPhaseCnt = 0; 32 $this->profile = new BungieProfileAPI($instanceBungieAPI); 33 $this->BungieAPI = $instanceBungieAPI; 34 } 35 36 // アカウントのレイドデータ取得 37 public function getRaidReport($raidKind, $BungieName) 38 { 39     // ★☆★☆★☆★☆★☆★☆★☆ 40 // ここで処理が止まる 41     // ★☆★☆★☆★☆★☆★☆★☆ 42 switch ($raidKind) 43 { 44 case this::directorActivityHash_GLASS: 45 case this::directorActivityHash_DEEP: 46 case this::directorActivityHash_WISH: 47 $this->raidPhaseCnt = 5; 48 break; 49 case this::directorActivityHash_GARDEN: 50 $this->raidPhaseCnt = 1; 51 break; 52 } 53 54 // プロフィール取得 55 if (!$this->profile->getProfile($BungieName)) 56 { 57 return false; 58 } 59 60 // レイド進捗取得 61 $json = $this->profile->getProfileWithComponents('202'); 62 if ($json == null) 63 { 64 return false; 65 } 66} 67 ?> 68

試したこと

補足情報(FW/ツールのバージョンなど)

PHP Version 8.0.10

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの原因は定数の読み取りにthisを使っているからではないでしょうか?
ここはstaticselfであるべきと思います。

php

1 2 case this::directorActivityHash_GLASS: 3 case static::directorActivityHash_DEEP: 4 case static::directorActivityHash_WISH: 5 $this->raidPhaseCnt = 5; 6 break; 7 case static::directorActivityHash_GARDEN: 8 $this->raidPhaseCnt = 1; 9 break;

メンバ変数に型指定できるようになった事自体がPHP7.4からと比較的最近ですが、
const定数については同様の仕様が追加されたというアナウンスはありませんので、型は指定できないが答えとなると思います。

もしかするとそのあたりの必要性に関して議論はあったかもしれませんが、
constで使用できる値がスカラー値(あるいはスカラー値だけを含む配列)のみということで、コンパイル時に型が自動的に確定するので現時点では必要が無いとされたと推測します。
PHP: 構文 - Manual
(自分が探した感じでは議論があったかどうかは確認できませんでした)


定数ではなく、メンバ変数として宣言してコンストラクタで代入するのが定石なのでしょうか?

定数は定数であるからには静的に定義されるべきものですし、
コンストラクタで代入する形にしたら定数では無くなってしまうので、その考えは本末転倒だと思います。

投稿2021/10/22 03:07

surface_0

総合スコア497

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

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

退会済みユーザー

退会済みユーザー

2021/10/22 11:25

そもそも書き方が合っていなかったんですね…。 定数とコードについてあやふやな状態にもかかわらずご回答いただき大変助かりました。 定数にも型指定できるよう気長に待っておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問