忍者ブログ
[PR]
×

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



2025/01/17 04:11 |
PHP1-77:出力バッファリング

基本的にPHPはprint()とかecho()とか書いた時点で文字が出力されますが、小出しに出力せずにバッファに保存しておいて、後で一気に出力、なんてことができます。

ob_start.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
<?php
    
    //出力バッファリングスタート
        ob_start();
    //printしても表示されずバッファに入れられる
        print('example');
    //バッファリングを終了した時点でバッファが表示される
        ob_end_flush();
    
    
    //引数に関数を入れると、ob_end_flush()時に呼ばれる
        ob_start('htmlspecialchars');
    //printしても表示されずバッファに入れられる
        print('<br />');
    //バッファの内容がhtmlspecialcharsされて表示される
        ob_end_flush();
    
    
    //出力バッファリングスタート
        ob_start();
    //printしても表示されずバッファに入れられる
        print('hogehoge');
    //現在のバッファの内容を取得
        $tmp=ob_get_contents();
    //バッファを削除してバッファリングを終了
        ob_end_clean();
    //$tmpには、ob_start()~ob_get_contents()までに出力した内容が含まれる
        var_dump($tmp);


こんなふうに出力をためておくことができます。
ただこれ、どういう場合に使えばいいのかいまいちよくわからない。

http://www.ideaxidea.com/archives/2008/04/phpob_start.html
こちらでは文字コードをまとめて変更して出力、というのが紹介されていて一見便利そうに見えますが、このような書き方はわかりづらいのでそもそも根本的に行わない方がいいと思います。
変換処理はコントローラあたりに追い出したいところです。
まあ、MVCに分ける程でもない小規模なものならばこれで十分かもしれませんが。

 

PR


2009/05/25 18:51 | Comments(0) | TrackBack() | PHP
PHP1-76:PHPでページャーつづき

前回ページャーを作りましたが、あれには致命的な欠点がひとつあります。
Pear::Pagerのインスタンスに、ページングする配列をそのまま突っ込んでいる部分です。
前回は1000件だったので余裕で検索できましたが、たとえばこれが数百万件あるデータベースだったりした場合、全部読み込んだりしようものならメモリが死にます。
そのような場合のため、件数の数値だけでページャーを作成できます。

pager_int.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
<?php
    
    //件数
        $total_item=500000;
    
    //Pear::Pager
        require_once('Pager.php');
    
    //ページャーのインスタンス
        $params = array(
            //SlidingまたはJumpingを指定
             'mode'       => 'Sliding'
            //1ページあたりの件数
            ,'perPage'    => 100
            //前後に表示する件数
            ,'delta'      => 5
            //件数
            ,'totalItems' => $total_item
            //Aタグのclass名を指定する、CSS等で利用
            ,'linkClass'  => 'linkClass'
        );
        $pager = Pager::factory($params);
    
    //ページャーの状態について調べられる
        //現在のページ
        print($pager->getCurrentPageID().'<br />');
        //全ページ数
        print($pager->numPages().'<br />');
        //現在のページのデータは当然取得できない
        //var_dump($pager->getPageData());
        
    //リンクを作成
        $links = $pager->getLinks();
    
    //表示
        //一個前に
        print($links['back'].'<br />');
        //一個後に
        print($links['next'].'<br />');
        //ページャを表示
        print($links['pages'].'<br />');
        //一番前に
        print($links['first'].'<br />');
        //一番後に
        print($links['last'].'<br />');
        //上記全部
        print($links['all'].'<br />');
    
    //データそのものは、別途取得する
        $limit_from=$_REQUEST['PageID']*100-100;
        $ret=$PDO->query('select * from table limit '.$limit_from.' , 100'));

itemDataに配列そのものを渡すかわりに、totalItemsに件数を渡します。
この場合Pager::getPageData()でデータを取得することができないのでデータそのものは別途自力で取得する必要がありますが、全件を取得しないので動作は軽くなります。
実際に使用する場合は、まずSELECT COUNT(*)で件数を取得、SELECT * で実際の内容を取得、totalItemsに取得した件数を突っ込んでページャーを作る、という順番になるでしょう。

 



2009/05/19 13:50 | Comments(1) | TrackBack() | PHP
PHP1-75:PHPで可変変数

http://jp.php.net/manual/ja/language.variables.variable.php
マニュアルでは
>ドル記号を二つ使用することにより、 変数の名前として使用することができます
とか書かれていますが、この説明はちょっとわかりづらいです。

${1}という気持ち悪い変数名を作成できるという話をしましたが、言ってしまえばあれも一種の可変変数です(正確には違うが)

最も簡単な例はこうなります。

variable.php

1
2
3
4
5
<?php
    $abc='xyz';
    $a='abc';
    
    print($$a);        //xyzが表示

ただ、$$aという書き方は分かり難い上に$aが配列だった場合に困ったことになったりするので、通常は${$a}のように{}で括ります。

variable2.php
1
2
3
4
5
<?php
    $abc='xyz';
    $a='abc';
    
    print(${$a});        //xyzが表示

配列の要素を呼ぶときの、$a[$b]といった書き方と殆ど同じようなものです。
$$a→${$a}→${'abc'}→$abc
$a[$b]→$a['abc']


PHPの場合、配列が非常に充実しているので、可変変数を使う機会は滅多にないと思います。

http://blog.promob.jp/fri/2009/04/php-5.html
等で挙げられている例の場合、
$str[1] = "さいたー さいたー";
とすれば済む話ですから。

http://d.hatena.ne.jp/web_program/20090318/1237352866
こちらではSmarty的に配列を変数に代入していますが、………extract()というものがあってだな(略

ちなみにSmarty自体はどうやっているかというと、コンパイル時に{$name}<?php echo $this->_tpl_vars['name']; ?>に置換しているだけでした。

 



2009/05/14 19:03 | Comments(2) | TrackBack() | PHP
PHP1-74:PHPでページャー

Pager 2.4.7 (stable)
http://pear.php.net/package/Pager

googleの検索結果の「前へ」「次へ」ボタン、まさにあれが作成できます。
自力で実装してもさほど難しいものではありませんが、終端処理とか例外とか面倒な部分もありますし、既にあるものをわざわざ再発明することもないので積極的に使用しましょう。

pager.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
<?php
    
    //適当な配列を作成してるだけ
        $arr=array();
        for($i=1;$i<1000;$i++){
            $tmp=array(
                 'id'=>$i
                ,'md5'=>md5($i)
            );
            $arr[]=$tmp;
        }
    
    //Pear::Pager
        require_once('Pager.php');
    
    //ページャーのインスタンス
        $params = array(
            //SlidingまたはJumpingを指定
             'mode'       => 'Jumping'
            //1ページあたりの件数
            ,'perPage'    => 3
            //前後に表示する件数
            ,'delta'      => 10
            //ページングするデータの配列
            ,'itemData'   => $arr
        );
        $pager = Pager::factory($params);
    
    //ページャーの状態について調べられる
        //現在のページ
        print($pager->getCurrentPageID().'<br />');
        //全ページ数
        print($pager->numPages().'<br />');
        //現在のページのデータ
        var_dump($pager->getPageData());
        
    
    
    //リンクを作成
        $links = $pager->getLinks();
    
    //表示
        //一個前に
        print($links['back'].'<br />');
        //一個後に
        print($links['next'].'<br />');
        //ページャを表示
        print($links['pages'].'<br />');
        //一番前に
        print($links['first'].'<br />');
        //一番後に
        print($links['last'].'<br />');
        //上記全部
        print($links['all'].'<br />');

例ではよく使うオプションを指定していますが、factoryには他にも多数のオプションが用意されています。
http://pear.php.net/manual/ja/package.html.pager.factory.php

Pagerの便利なところとして、GETリクエストがあった場合、そのリクエストがPager::getLinks()で取得するリンクに自動的に追加されます。
たとえば上記のpager.phpにそのままアクセスした場合、ページャーのリンクは
pager.php?pageID=2
というふうに(勝手に)なりますが、
pager.php?hoge=fuga
というURLでアクセスした場合、ページャーのリンクは自動的に
pager.php?hoge=fuga&pageID=2
となります。
これにより、複数条件で検索等の面倒な処理も何も書かなくても行うことができてしまいます。
圧倒的に便利な機能です。

ただ、#でフラグメントに飛ばしたい等、手動でURLを変更したい場合はappend=falseにしてfileNameを自力で書かないといけなくなってしまうので面倒です。
そうするよりはgetLinksでリンクを取得した後に置換したほうが楽かと思います。

 



2009/05/12 15:07 | Comments(0) | TrackBack() | PHP
PHP1-73:したらばBBS/NGワードまとめて削除

したらばの書き込み削除は一件一件チェックしないといけないので、広告が大量に貼り付けられたときなんか非常に面倒です。
というわけでNGワードが含まれる発言を一気に削除するPHPスクリプトを作成してみました。

ダウンロード(zip)


shitaraba_delフォルダを適当な場所(ドキュメントルートの外にするべき)にアップし、index.phpにそのパスを記入、shitaraba_del/templatesフォルダに書き込み権限を付けてshitaraba_del/config.phpにURLやパスワード等を指定すれば動きます。
あとはreadme読んでください。

PHPが動くサーバがないと動作できないので敷居が高いです。
そもそもこれくらいならJavaScriptで作った方が環境を選ばなくて楽だと思うので誰か作ってください。

たった3画面なのに表示はSmartyを使っています。
もう私の身体はSmarty無しでは生きていけません。

作っててわかったこと。
デザインが致命的に苦手。
ロジック組んでる時間よりHTMLいじってる時間の方が長いかもうね。
そんだけ時間かけてこれかよ、とか言わない。

なんかしたらば側の動作が微妙。
削除スクリプトにPOST送ったら対応してねえ、GET送れとか言うのに実際は削除されてるし逆にGET送っても削除されないし勝手に透明削除になってるしなんかよくわからん。

解説なんかは気が向いたら。
ソース見れば大体書いてあるけどな。



2009/05/07 12:12 | Comments(2) | TrackBack() | PHP
PHP1-72:シリアライズ続き

さて前回使い道がないとか書いたserializeですが、ひとつ便利な使い道があって、それがAPIとしての利用です。

WebサービスAPIの返り値はXMLとなっている場合がほとんどです。
ところが、PHPのXML解析はそれほど優秀ではありません。
PHP5でSimpleXMLが出てだいぶましになりましたが、それ以前のXML処理関数は何故かやたら面倒です。
http://jp.php.net/manual/ja/refs.xml.php
もっと簡単にどうにかならないかということで、Yahooの中の人が「XMLじゃなくてserializeで流せばよくね?」とか言っています。

日本ではまだ対応していないようですが、yahoo.comでは対応しているサービスもあるようです。
http://api.search.yahoo.com/ImageSearchService/V1/imageSearch?appid=YahooDemo&query=Enkumi&results=1
これはイメージ検索のAPIですが、最後にoutput=phpとするとserialize形式で出力されます。
http://api.search.yahoo.com/ImageSearchService/V1/imageSearch?appid=YahooDemo&query=Enkumi&results=1&output=php

XMLとserial形式それぞれでパースしてみます。

yahoo_search_api.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
    
    //取得
    $url_xml='http://api.search.yahoo.com/ImageSearchService/V1/'
            .'imageSearch?appid=YahooDemo&query=Enkumi&results=1';
    $url_ser=$url_xml.'&output=php';
    
    //XMLパーサで解析
        $tmp_xml=file_get_contents($url_xml);
        $xml_parser = xml_parser_create() ;
        xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
        xml_parse_into_struct($xml_parser, $tmp_xml,$data_xmlparse);
        xml_parser_free($xml_parser);
    
    //PHP5ならSimpleXMLで非常に簡単
        $data_simplexml=simplexml_load_file($url_xml);
    
    //Serializeだと
        $tmp_ser=file_get_contents($url_ser);
        $data_ser=unserialize($tmp_ser);
    
    var_dump($data_xmlparse,$data_simplexml,$data_ser);



XMLパーサではxml_parse_into_structを使っていますが、これには致命的な欠点があり、パースした結果が一次元配列になってしまいます。
深さ情報自体は残っていますが、XMLツリーを再現するにはパースした結果をさらにパースして云々なんてことをしなくてはなりません。。
もしくは、xml_set_default_handlerでパース関数を自作したりする必要があります。
非常に面倒です。
あと、デフォルトだとタグが勝手に全部大文字になります。なんで?

SimpleXMLではようやくそんな煩わしさから解放されました。
XMLをそのままの形でオブジェクトに格納できます。

serial形式だと、unserializeするだけで送信元が想定した形に簡単に戻すことができます。
オブジェクトだけではなく配列でもstringでも何でもOKです。
stringのシリアル化とか意味はありませんが。

 



2009/05/01 17:12 | Comments(0) | TrackBack() | PHP
PHP1-71:シリアライズ

Javaでよくシリアライズという言葉が出てきてたんですが、まったく理解できませんでした。
Serializableインターフェイスって何だよ。

PHPでのシリアライズはもう少し簡単で、インスタンスを丸ごとそのまま保存という意味です。
a.phpでnewしたオブジェクトをシリアライズして保存し、b.phpでそれを読み込むと元のインスタンスが復活できます。

具体的にどのようなことができるかというと以下のような感じです。

Serial.class.php

1
2
3
4
5
6
7
8
9
10
11
12
<?php
    
    //適当なクラス
    class Serial{
        public $param='';
        public function setParam($param){
            $this->param=$param;
        }
        public function getParam(){
            return $this->param;
        }
    }


a.php

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
    
    require_once('Serial.class.php');
    $serial=new Serial();
    
    //適当に値を入力
    $serial->setParam('あいうえお');
    
    //シリアライズ
    $tmp_serial=serialize($serial);
    
    //保存
    file_put_contents('serial.txt',$tmp_serial);

b.php
1
2
3
4
5
6
7
8
9
10
11
12
<?php
    
    require_once('Serial.class.php');
    
    //読込
    $tmp_serial=file_get_contents('serial.txt');
    
    //アンシリアライズ
    $serial=unserialize($tmp_serial);
    
    //a.phpで代入した'あいうえお'が出てくる
    var_dump($serial->getParam());

a.phpとb.phpにはセッション的関係すら存在しませんが、a.phpにアクセスした後でb.phpにアクセスすると、a.phpでの変更内容がb.phpに反映されています。

仕組み的には、serializeした時点でそのオブジェクトが単なる文字列に変換されます。
その文字列をunserializeするとオブジェクトになります。

保存されたテキストを覗いてみると、
O:6:"Serial":1:{s:5:"param";s:15:"あいうえお";}
というテキストになっています。
Serialというクラスのオブジェクトで、インスタンス変数がひとつあって中身が'あいうえお'という文字列だ、という内容です。

serializeで保存されるのはインスタンス変数だけで、メソッドやクラス変数等は保存されません。
また、serializeしたものをそのままunserializeするとインスタンス変数だけが入った__PHP_Incomplete_Classというオブジェクトになります。

しかしb.phpのように、先に該当のクラスを読み込んでおくと、unserializeした時に自動的にそのクラスと組み合わされ、完全に元通りになります。
b.phpでunserializeした$serialは、a.phpでserializeしたものと全く同一の内容になるということです。

オブジェクトを流用できるので便利と言えば便利なのですが、そこまでしてひとつのオブジェクトを使い回すということ自体がそんなにないような気が。
大体のことならセッションやDBに突っ込んでおけば事足りますし。

 



2009/04/27 18:10 | Comments(0) | TrackBack() | PHP
PHP1-70:リフレクション

リフレクションを使うとクラスや関数の中身を解析することが出来ます。
PHPって基本的にソースが丸見えなんで、リバースエンジニアリングの意味がないような気がしないでもないんですが。
PHPの組み込み関数やエクステンションなどはPHPで書かれているわけではないので、そういう場合に中身を知りたい時に使うといいかもしれませんが、組み込み関数ならマニュアルを見ればいいし、いざとなればソースを見た方がより正確です。
まあソースはCなんでちょっと読めないのですが、そういう私みたいな中途半端な人がリフレクション使って役に立つものなんですかね?

使用法としては

・ReflectionFunctionに関数を突っ込む
・ReflectionClassにクラスを突っ込む
・ReflectionObjectにオブジェクトを突っ込む
・ReflectionMethodにメソッドを突っ込む
・ReflectionPropertyにクラス変数を突っ込む
・ReflectionExtensionにモジュールを突っ込む

となります。
その後は適当なメソッドを実行するだけで、例えばReflection::export()で簡単に内容の一覧を取得できます。
それ以外にも多様なメソッドで内容を解析できます。

Reflection_Extension.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
    
    $ret=array();
    
    //エクステンションの一覧
    $ext=get_loaded_extensions();
    
    //各エクステンションに対して
    foreach($ext as $val){
        $ref=new ReflectionExtension($val);
        //エクステンション名
            $ref_name =$ref->getName();
        //中に入っているクラス
            $ret[$ref_name]['class']=$ref->getClasses();
        //中に入っている関数
            $ret[$ref_name]['function']=$ref->getFunctions();
    }
    
    print("<html><pre>");var_dump($ret);die();

凄く簡単ですが、この例では、全てのエクステンションに対して、順番にクラスの一覧と関数の一覧を取得しています。

正直、なんのために使えばいいのかよくわからないんですが。
たとえばここのCurrency converterでは呼び出すメソッドを変更していますが、

$CurrencyConverter->{$_GET['currency1'].'-'.$_GET['currency2']}

でいいじゃない、とか。
開発時専用の機能のような気がしてならない。

 



2009/04/24 18:32 | Comments(0) | TrackBack() | PHP
PHP1-69:タイプヒンティング

Javaではメソッドの引数に必ず引数の型を指定する必要がありますが、PHPでもPHP5以降、関数とメソッドに対して引数の型を指定することが出来ます。
これによりメソッド呼び出しの時点で不正な呼び出しをチェックすることができ、メソッドの頭に毎回引数チェックを書く必要がなくなります。

ただ、最初に最大の問題点を挙げておくと、タイプヒンティングの指定がarray型とObject型しか使えないということです。
どうしてfunction func(string $str)ってできないんだよ……

とりあえず簡単な例。

hinting_test.php  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
    
    //適当なクラス
    class hinting_test{
        function hinting_array(array $arr){
            return true;
        }
    }
    
    //引数
        $arg1=array('1','2');
        $arg2='1,2';
    
    $hint=new hinting_test();
    
    $hint->hinting_array($arg1);
//    $hint->hinting_array($arg2);    //ここでCatchable fatal error発生


hinting_test::hinting_array()の引数にarrayを指定しているため、array以外の引数を渡すとエラーが発生します。
どうしてExceptionじゃないのかは謎ですが、これでJavaのように引数レベルで型を制御することができます。
ただしJavaで言うところのオーバーロードは使用できません。
function hinting_array(array $arr){}
function hinting_array(object $arr){}

と書くとredeclareエラーになります。

まったくもってどうでもいいんですが、長い間「タイプヒンディング」だと思っていました。
謎。
 

 



2009/04/21 12:53 | Comments(0) | TrackBack() | PHP
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とはなんか違うよなあ。

 



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

<<前のページ | HOME | 次のページ>>
忍者ブログ[PR]