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

回答編集履歴

3

追記

2016/07/20 16:37

投稿

退会済みユーザー
answer CHANGED
@@ -1,4 +1,52 @@
1
1
  コンストラクタでフィルタリングすればいいのでは?
2
2
 
3
3
  [get_called_class()](http://php.net/manual/ja/function.get-called-class.php)
4
- [debug_backtrace()](http://php.net/manual/ja/function.debug-backtrace.php)
4
+ [debug_backtrace()](http://php.net/manual/ja/function.debug-backtrace.php)
5
+
6
+ ---
7
+
8
+ ```php<?php
9
+
10
+ class Sample
11
+ {
12
+
13
+ private static $forbidenClass = [
14
+ 'Sample2'
15
+ ];
16
+
17
+ private static function init()
18
+ {
19
+ $trace = debug_backtrace();
20
+ foreach ($trace as $dbg) {
21
+ if ($dbg['class'] != __CLASS__ &&
22
+ in_array($dbg['class'], self::$forbidenClass)) {
23
+ $msg = sprintf('%s クラスから呼ぶことは禁止されています。', $dbg['class']);
24
+ throw new \Exception($msg);
25
+ }
26
+ }
27
+ }
28
+
29
+ public static function method()
30
+ {
31
+ self::init();
32
+ return true;
33
+ }
34
+
35
+ }
36
+
37
+ class Sample2
38
+ {
39
+
40
+ public static function method()
41
+ {
42
+ Sample::method();
43
+ }
44
+
45
+ }
46
+
47
+ try {
48
+ Sample2::method();
49
+ } catch (Exception $e) {
50
+ var_dump($e);
51
+ }
52
+ ```

2

追記

2016/07/20 16:37

投稿

退会済みユーザー
answer CHANGED
@@ -1,3 +1,4 @@
1
1
  コンストラクタでフィルタリングすればいいのでは?
2
2
 
3
- [get_called_class()](http://php.net/manual/ja/function.get-called-class.php)
3
+ [get_called_class()](http://php.net/manual/ja/function.get-called-class.php)
4
+ [debug_backtrace()](http://php.net/manual/ja/function.debug-backtrace.php)

1

修正

2016/07/20 04:56

投稿

退会済みユーザー
answer CHANGED
@@ -1,1 +1,3 @@
1
- コンストラクタでフィルタリングすればいいのでは?
1
+ コンストラクタでフィルタリングすればいいのでは?
2
+
3
+ [get_called_class()](http://php.net/manual/ja/function.get-called-class.php)