忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/04/23 17:02 |
PHP1-68:オブジェクトに配列でアクセスするしつこく続き

いいかげん終わろうと思いますが、最後にenum型を作成。

しようと思ったんですが、enum型の意味がいまいちわからない。
予め決められた値しか取れない型とかそんな解釈でいいんですかね。
なんかいくら解説を読んでも意味がわからんし人や言語によって違うこと言ってね?という感じもするし。
こんな理解していない人物がSJC-WCとか持っていていいんだろうか。

enumArray.class.php 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<?php
    
class enumArray implements ArrayAccess,IteratorAggregate,Countable{
    
    //適用可能な型
    private $type_valid=array(
         'string'
        ,'integer'
        ,'float'
        ,'boolean'
        ,'enum'
    );
    //適用可能な値    //現在enumのみ使用
    private $arr_valid=array();
    
    //
    private $type='';
    
    //値入れ
    private $arr=array();
    
    //コンストラクタ
    function __construct($type_valid='integer',$arr_valid=false){
        //引数が適用可能な型でなければException
        if(!in_array($type_valid,$this->type_valid)){
            $debug=debug_backtrace();
            throw new InvalidArgumentException(
                'Value is not valid type in line &lt;'.$debug[0]['line'].'&gt;'
            );
            return false;
        }
        $this->type=$type_valid;
        
        //enumの場合第二引数をチェック
        if($type_valid=='enum'){
            if(!is_array($arr_valid)){
                throw new InvalidArgumentException(
                    'Type enum needs Argument Array'
                );
            }
            $this->arr_valid=$arr_valid;
        }
        
        return true;
    }
    
    //マジックメソッド__set
    public function __set($a,$b){
        return $this->offsetSet($a,$b);
    }
    //マジックメソッド__get
    public function __get($a){
        return $this->offsetGet($a);
    }
    
    //引数の型チェック
    private function _chechOffsetType($b){
        switch($this->type){
        case 'string':
            return is_string($b);break;
        case 'integer':
            return is_int($b);break;
        case 'float':
            return is_float($b);break;
        case 'boolean':
            return is_bool($b);break;
        case 'enum':
            return $this->_is_enum($b);break;
        }
        return false;
    }
    
    //enumの型チェック
    private function _is_enum($b){
        return in_array($b,$this->arr_valid,true);
    }
    
    //値セット        ArrayAccess::offsetSet
    public function offsetSet($a,$b){
        //引数が正しい型かチェック
        if(!$this->_chechOffsetType($b)){
            //正しい型でなければException
            $debug=debug_backtrace();
            throw new InvalidArgumentException(
                'Value is not '.$this->type.' in line &lt;'.$debug[0]['line'].'&gt;'
                .' type &lt;'.gettype($b).'&gt;'
            );
            return false;
        }
        
        //挿入
        if($a===NULL){
            $this->arr[]=$b;
        }else{
            $this->arr[$a]=$b;
        }
        return true;
    }
    
    //値が存在するか        ArrayAccess::offsetExists
    public function offsetExists($a){
        if($a===NULL){return false;}
        return isset($this->arr[$a]);
    }
    
    //値を取得        ArrayAccess::offsetGet
    public function offsetGet($a){
        if($this->offsetExists($a)){
            return $this->arr[$a];
        }else{
            return null;
        }
    }
    
    //値削除        ArrayAccess::offsetUnset
    public function offsetUnset($a){
        if($this->offsetExists($a)){
            unset($this->arr[$a]);
        }
    }
    
    //個数カウント        Countable::count
    public function count(){
        return count($this->arr);
    }
    
    //イテレータ        IteratorAggregate::getIterator
    public function getIterator(){
        return new ArrayIterator($this->arr);
    }
 
#↓クラスのおわり
}

とりあえず第一引数が'enum'の場合のみ第二引数を配列で受け取り、その後代入する場合、配列にある値しか受け取らないという作成方針です。
なんかenumとは違うような気が激しくしないでもないのだが、まあいいか。

enumArray.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
    
    //投入可能な値
        $enum_array=array(
             1
            ,'a'
            ,true
        );
    
    //インスタンス
        require_once('enumArray.class.php');
        $str=new enumArray('enum',$enum_array);
        
    //代入
        try{
            $str[]=1;
            $str[]='1';        //ここでInvalidArgumentException
        }catch(InvalidArgumentException $e){
            print($e->getMessage());
        }
        
        print("<pre>");var_dump($str);

インスタンス作るときに一緒に投入可能な値を投げると、それ以外の値は代入することが出来なくなります。
…やっぱりenumとはなんか違うよなあ。

 

PR


2009/04/17 18:13 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<PHP1-69:タイプヒンティング | HOME | PHP1-67:オブジェクトに配列でアクセスするまたまた続き>>
忍者ブログ[PR]