質問編集履歴

3

タイトル

2024/07/21 02:14

投稿

munekun
munekun

スコア61

test CHANGED
@@ -1 +1 @@
1
- JavaScript
1
+ php のクラスにおいて、継承される定数を制限したい
test CHANGED
File without changes

2

書式の改善

2024/07/21 01:57

投稿

munekun
munekun

スコア61

test CHANGED
File without changes
test CHANGED
@@ -1,10 +1,10 @@
1
1
  ### 実現したいこと
2
- phpのクラス継承で、子クラスは親クラスの定数を一部しか使えないよう制限したいです。
2
+ php のクラス継承で、子クラスは親クラスの定数を一部しか使えないよう制限したいです。
3
3
 
4
4
  ### 現状と問題
5
- 以下のように PrivateItemKind と SharedItemkind などがあり、一方にしかない値があります。
5
+ 以下のように `PrivateItemKind``SharedItemkind` などがあり、一方にしかない値 (`TAG_KIND_ID`) があります。
6
6
 
7
- しかし以下のようにすると、BOOK_KIND_ID の値が 2 だったり 1 だったり、ズレることになりますよね。TAG_KIND_ID は PrivateItemKind でしか使わないため、IDの連番を詰めると BOOK_KIND_ID の値がズレる。
7
+ しかし以下のようにすると、`BOOK_KIND_ID` の値が 2 だったり 1 だったり、ズレることになりますよね。(`TAG_KIND_ID``PrivateItemKind` でしか使わないため、ID の連番を詰めると `BOOK_KIND_ID` の値がズレる。)
8
8
 
9
9
  このズレれをうまく解消する方法を知りたいです。
10
10
  ```php
@@ -40,11 +40,11 @@
40
40
  }
41
41
  ```
42
42
 
43
- しかしアイテムとしては同じ意味なのに、プライベートなアイテムかシェアされたアイテムかという違いによって異なる定数名にすることに違和感を覚えます。(そうすることが一般的なら、私の違和感は初心者特有のものでしょうから受け入れたいと思いますが、いかがでしょうか?)
43
+ しかし「本というアイテム種別」いう同じ意味なのに、プライベートなかシェアされたかという違いによって異なる定数名にすることに違和感を覚えます。(そうすることが一般的なら、私の違和感は初心者特有のものでしょうから受け入れたいと思いますが、いかがでしょうか?)
44
44
 
45
45
  #### 解決策B
46
46
  続いての解決策の方が筋が良さそうかと思い本質問のタイトルとさせていただきました。
47
- つまり、親クラス ItemKindMasterで定数を宣言し、子クラスは必要な値のみ宣言するという方法です。
47
+ つまり、親クラス `ItemKindMaster` で定数を宣言し、子クラスは必要な値のみ宣言するという方法です。
48
48
  ```php
49
49
  abstract class ItemKindMaster
50
50
  {
@@ -55,6 +55,7 @@
55
55
 
56
56
  class PrivateItemKind extends ItemKindMaster
57
57
  {
58
+ // 必要な値のみ宣言する
58
59
  const TAG_KIND_ID = parent::TAG_KIND_ID;
59
60
  const BOOK_KIND_ID = parent::BOOK_KIND_ID;
60
61
  const USER_KIND_ID = parent::USER_KIND_ID;
@@ -62,6 +63,7 @@
62
63
 
63
64
  class SharedItemkind extends ItemKindMaster
64
65
  {
66
+ // 必要な値のみ宣言する
65
67
  const BOOK_KIND_ID = parent::BOOK_KIND_ID;
66
68
  const USER_KIND_ID = parent::USER_KIND_ID;
67
69
  }
@@ -69,19 +71,19 @@
69
71
 
70
72
  こちらの方法でも「同じ定数名なのに値が違う」という上記のズレは生じなくなるのでよさそうかと思ったのですが、
71
73
 
72
- しかしItemKindMaster を継承しているので当たり前ですが以下のように呼べてしまいました。
74
+ しかし (`ItemKindMaster` を継承しているので当たり前ですが)、以下のように呼べてしまいました。
73
- SharedItemkind には TAG_KIND_ID を持たせたくないのに、これでは困ります。
75
+ `SharedItemkind` には `TAG_KIND_ID` を持たせたくないのに、これでは困ります。
74
76
  ```php
75
77
  echo SharedItemkind::TAG_KIND_ID;
76
78
  ```
77
79
 
78
- そこで改めて質問になります。子クラスは親クラスの定数を一部しか使えないよう制限したいSharedItemkind は TAG_KIND_ID を持たせたくないのですが、どうすべきでしょうか?
80
+ そこで改めて質問になります。子クラスは親クラスの定数を一部しか使えないよう制限したい (`SharedItemkind``TAG_KIND_ID` を持たせたくない) のですが、どうすべきでしょうか?
79
81
 
80
82
  ### バージョン
81
83
  php 8.2 です。
82
84
 
83
85
  ### 補足
84
- もしかして以下のように、nullを再代入し、使えないことを明示する。という解決策がベストでしょうか?
86
+ もしかして以下のように、`null` を再代入し、使えないことを明示する。という解決策がベストでしょうか?
85
87
  ```php
86
88
  abstract class ItemKindMaster
87
89
  {

1

補足

2024/07/21 01:52

投稿

munekun
munekun

スコア61

test CHANGED
File without changes
test CHANGED
@@ -79,3 +79,28 @@
79
79
 
80
80
  ### バージョン
81
81
  php 8.2 です。
82
+
83
+ ### 補足
84
+ もしかして以下のように、nullを再代入し、使えないことを明示する。という解決策がベストでしょうか?
85
+ ```php
86
+ abstract class ItemKindMaster
87
+ {
88
+ const TAG_KIND_ID = 1;
89
+ const BOOK_KIND_ID = 2;
90
+ const USER_KIND_ID = 3;
91
+ }
92
+
93
+ class PrivateItemKind extends ItemKindMaster
94
+ {
95
+ const TAG_KIND_ID = parent::TAG_KIND_ID;
96
+ const BOOK_KIND_ID = parent::BOOK_KIND_ID;
97
+ const USER_KIND_ID = parent::USER_KIND_ID;
98
+ }
99
+
100
+ class SharedItemkind extends ItemKindMaster
101
+ {
102
+ const TAG_KIND_ID = null; // 使えないことを明示する
103
+ const BOOK_KIND_ID = parent::BOOK_KIND_ID;
104
+ const USER_KIND_ID = parent::USER_KIND_ID;
105
+ }
106
+ ```