忍者ブログ
[PR]
×

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



2017/05/27 03:57 |
PHP1-63:オブジェクトに配列でアクセスする

ArrayAccessインターフェイスを実装すると、クラス内の要素に配列形式でアクセスできます。
http://jp.php.net/manual/ja/class.arrayaccess.php

これを使って何が便利かというと、通常出来ない値セット時の値チェックが行えることです。
PHPの利点の一つがアバウトな型付けではありますが、しかしどうしても厳密な型を使用したい場合もあります。
そんなときにJava並の強い型付けを行える配列を作成することができます。

数値のみを格納したい配列があった場合、

$int[0]=10;
$int[1]='10';


と$int[1]に代入した時点で型エラーを出すことができます。
これまで入力値は毎回チェックしてから変数に代入なんてことをやっていたわけですが、ArrayAccessを使えば、とりあえず値を突っ込んでエラーが返ってきたら駄目だったといった判断ができるようになります。
まあ、結局例外キャッチしないといけないので手間はあんまり変わらないような気もしますが。

とりあえずint型しか使用できない配列っぽいクラスを作成してみます。

intArray.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
<?php
    
class intArray implements ArrayAccess{
    
    //配列置き
    private $arr=array();
    
    //コンストラクタ
    function __Construct(){}
    
    //値セット
    function offsetSet($a,$b){
        //引数が数値かチェック
        if(is_int($b)){
            //[]でセットした時用
            if($a===null){
                $this->arr[]=$b;
            }else{
                $this->arr[$a]=$b;
            }
        }else{
            //数値でなければエラー
            $debug=debug_backtrace();
            throw new InvalidArgumentException(
                'Value is not integer in line &lt;'.$debug[0]['line'].'&gt;'
                .' type &lt;'.gettype($b).'&gt;'
            );
        }
    }
    
    //値が存在するか
    function offsetExists($a){
        return isset($this->arr[$a]);
    }
    
    //値を取得
    function offsetGet($a){
        if($this->offsetExists($a)){
            return $this->arr[$a];
        }else{
            return null;
        }
    }
    
    //値削除
    function offsetUnset($a){
        if($this->offsetExists($a)){
            unset($this->arr[$a]);
        }
    }
    
#↓クラスのおわり
}

ArrayAccessインターフェイスに存在する4つのメソッドの実装を行いました。
ArrayAccess::offsetSetのときに、引数が数値かどうかチェックを行い数値でなければInvalidArgumentExceptionを出しています。
UnexpectedValueExceptionとどっちを使えばいいのかよくわからない。

このクラスは一旦newした後、普通に配列として使用できます。

intArray.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
    
    //インスタンス
        require_once('intArray.class.php');
        $int=new intArray();
    
    //代入
    try{
        $int[]=123;
        $int['abc']=456;
        $int[]='789';    //ここでInvalidArgumentExceptionが発生
    }catch(InvalidArgumentException $e){
        print($e->getMessage());
    }


11行目で$int[]='789'と文字列を代入しているので、ここで例外が発生します。
それ以外は普通に配列表記でアクセスできます。

逆に$int->abcと指定しても値を取得することができません。
$int->arr['abc']としないといけないので、ここは改善の余地がありそうです。
またIteratorは実装していないので普通の配列のようにforeachでアクセスすることはできません。

以上で数値しか入れられない配列ができました。
数値以外にも列挙型なんかも簡単に作れるでしょう。
このような配列を用意しておくと、入力値チェックとかを毎回手動で行わなくて済むので簡単かもしれません。

 

PR


2009/03/31 15:32 | Comments(0) | TrackBack(0) | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






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



<<PHP1-64:Pear::CheckIPでIPアドレスチェック | HOME | PHP1-62:PHPでキューとスタック>>
忍者ブログ[PR]