質問編集履歴
3
タイトル
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
php のクラスにおいて、継承される定数を制限したい
|
test
CHANGED
File without changes
|
2
書式の改善
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 だったり、ズレることになりますよね。
|
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
|
-
しかし
|
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
|
-
そこで改めて質問になります。子クラスは親クラスの定数を一部しか使えないよう制限したい
|
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
補足
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
|
+
```
|