PHP5.3.0α3の名前空間
お約束通り(?)、α3の名前空間を試してみました。コードのネタはWEB+DB PRESS Vol.47の連載に書いたモノです。せっかく必死こいて書いたのに。。。
- 作者: 高橋徹,遠藤康裕,はまちや2,正野勇嗣,前坂徹,やまだあきら,笠谷真也,大沢和宏,縣俊貴,ミック,田中洋一郎,有賀一輝,石黒尚久,石室元典,長野雅広,池邉智洋,和田正則,下岡秀幸,伊藤直也,nanto_vi,武者晶紀,大塚知洋,山本陽平,高林哲,小飼弾,WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2008/10/23
- メディア: 大型本
- 購入: 10人 クリック: 90回
- この商品を含むブログ (32件) を見る
名前空間の宣言の例
まあ、予想通りですね。。。バックスラッシュになってますよ。ええ、バックスラッシュになってますよ。
<?php namespace webdb\stepup\php; class ClassA { private $param; public function get() { return strlen($this->param); } public function set($param) { $this->param = $param; } } function FunctionA() { return 123; }
大事なので2回(ry
複数の名前空間の宣言
これも想定の範囲内。ばっk(ry
<?php namespace webdb\stepup\php\classes; class ClassA {} // webdb\stepup\php\classes\ClassA namespace webdb\stepup\php\functions; function funcB {} // webdb\stepup\php\functions\funcB
名前空間を使った呼び出し
この辺から徐々に怪しくなってきます。
<?php namespace webdb\stepup\php; class ClassA { private $param; public function get() { return $this->param; } public function set($param) { $this->param = $param; } } function FunctionA() { return 'Hello!'; } /** * 名前空間「webdb\stepup\php」に属するクラス・関数の呼び出し */ $obj = new \webdb\stepup\php\ClassA(); $obj->set('hoge'); echo \webdb\stepup\php\FunctionA() . PHP_EOL; /** * 呼び出しのコードも同じ名前空間に属しているので、名前空間を * 省略できる */ $obj = new ClassA(); echo FunctionA();
現在の名前空間名の取得
でも、__NAMESPACE__定数は先頭のバックスラッシュを返しません。
<?php namespace webdb\stepup\php; echo __NAMESPACE__;
この結果は、
webdb\stepup\php
となります。
名前空間に別名を付ける
でも、別名を付けた場合は、先頭のバックスラッシュは不要です。相対パスのイメージ?
<?php namespace webdb\stepup\php; use webdb\stepup\php; use webdb\stepup\php as ns; use ns as foo; class ClassA { private $param; public function get() { return $this->param; } public function set($param) { $this->param = $param; } } function FunctionA() { return 'Hello!'; } $obj = new \webdb\stepup\php\ClassA(); echo get_class($obj) . PHP_EOL; echo \webdb\stepup\php\FunctionA() . PHP_EOL; $obj = new php\ClassA(); echo get_class($obj) . PHP_EOL; echo php\FunctionA() . PHP_EOL; $obj = new ns\ClassA(); echo get_class($obj) . PHP_EOL; echo ns\FunctionA() . PHP_EOL; /** * Fatal error: Class 'ns\ClassA' not found in ... * となる */ $obj = new foo\ClassA(); echo get_class($obj) . PHP_EOL; echo foo\FunctionA() . PHP_EOL;
クラス名や関数名の衝突の例
ここまでちょっと怪しかったですが、許容範囲でした。しかし、これはどうなんでしょう。。。注目は当然、最後の行。
<?php namespace webdb\stepup\php; function date($args) { return __NAMESPACE__ . '\date()'; } echo date('YmdHis') . PHP_EOL; // webdb\stepup\php\date()を呼び出す echo \date('YmdHis') . PHP_EOL; // PHP標準のdate()を呼び出す
絶句。。。
α2まで「::date('YmdHis')」だったところですが、正直「::」はまだ許せた。でも、これはダメだ!トップレベルの関数やクラスと衝突しないように書かないとダメだ!気色悪すぎる!