Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2008/12/06

counter hits
since 1999/11/06


PHP6.0.0-devを試してみる - 定数の強化

caution2008/12/04付でリリースされたPHP5.3.0α3から、名前空間のデリミタがバックスラッシュ(\)に変更されました。PHP6でもこのままの仕様となりそうです。

次期メジャーバージョンであるPHP6をあれこれやってみます。今回は、定数定義についてです。

定数定義はdefine関数もしくはconstを使用しますが、PHP6に向けて大きな変更が入りました。配列のサポートと名前空間のサポートです。今回は、この2つについてCVS版PHP6-devを使って試してみました。

なお、今後正式リリースまでの間に仕様が変わり、ここにある内容が正しくなくなる可能性もありますので、注意してください。

使用した環境

今回の環境は、CentOS4.5+Apache2.2.4+PHP6.0.0-devです。ソースは2007/08/25に本家CVSリポジトリから直接取得したものです。build手順は『Do You PHP? - anonymous cvsからPHPのソースを取得する』を参照してください。また、PHPは以下のようなconfigureオプションを付けてbuildしています。

●PHP6.0.0-devのconfigureオプション
--with-apxs2=/usr/local/apache2/bin/apxs \
--prefix=/usr/local/lib/php6 \
--with-pear=/usr/local/lib/php6/pear \
--with-config-file-path=/usr/local/lib/php6/ini/ \
--with-config-file-scan-dir=/usr/local/lib/php6/ini.d \
--enable-zend-multibyte \
--with-dom \
--enable-filter=shared \
--with-gettext=shared \
--with-mcrypt=shared \
--with-gd=shared \
--with-jpeg-dir \
--with-png-dir \
--with-zlib-dir \
--with-ttf \
--with-freetype-dir \
--enable-gd-native-ttf \
--enable-gd-jis-conv \
--enable-soap=shared \
--enable-pdo=shared \
--with-pdo-sqlite=shared \
--with-sqlite=shared \
--enable-sqlite-utf8 \
--with-openssl=shared \
--with-curl=shared \
--enable-bcmath=shared \
--enable-pcntl=shared \
--enable-sockets=shared \
--with-oci8=shared,/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/ \
--with-pdo-oci=shared,/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/ \
--with-pdo=shared \
--enable-sigchild \
--with-xsl=shared \
--enable-zip=shared

いずれも「--prefix」オプションを付けているため、phpコマンドのパスがデフォルトとは変わっていますが適宜読み替えてください。

constの配列サポート

PHP5でも配列以外のスカラー値を指定することができましたが、PHP6からは配列もサポートされるようになりそうです。これは個人的には有り難いです。ただし、今のところdefine関数では配列はサポートされていません。この辺の整合性はどうするんでしょうね。。。

  
<?php
echo '<pre>';

/**
 * PHP5の場合、Parse error: syntax error, unexpected T_CONST in ...
 */
const A = array(1, 2, 'abc' => 'xyz');
var_dump(A);

/**
 * でも、defineではWarningが発生する
 * Warning:  Constants may only evaluate to scalar values in ...
 */
define('B', array(1, 2, 'abc'));

echo '</pre>';

また、アクセス方法ですが。。。今のところ、通常の配列のようにブラケットを使ったアクセスは使えません。この辺はさすがに「まだまだな状態」でしょうか。

  
<?php
const LIGHT_SWITCH = array('on' => 1, 'off' => 0);

$switch = 1;

var_dump(LIGHT_SWITCH);

foreach (LIGHT_SWITCH as $key => $value) {
    echo $key . '=>' . $value . '<br>';
}

/**
 * Parse error: syntax error, unexpected '[' in ...
 *
if ($flag === LIGHT_SWITCH['on']) {
    echo 'switch is on';
} else {
    echo 'switch is off';
}
 */

名前空間のサポート

PHP6で名前空間がサポートされますが、定数についても名前空間がサポートされます。これはイイですね :-)

  
<?php
namespace php6::constant::test;

echo '<pre>';

const CONSTANT_INT = 1;
const CONSTANT_STRING = 'constant';
const CONSTANT_ARRAY = array(1, 2, 3, 'abc');

var_dump(php6::constant::test::CONSTANT_INT);
var_dump(php6::constant::test::CONSTANT_STRING);
var_dump(php6::constant::test::CONSTANT_ARRAY);

import php6::constant::test as ns;

var_dump(ns::CONSTANT_INT);
var_dump(ns::CONSTANT_STRING);
var_dump(ns::CONSTANT_ARRAY);


echo '</pre>';

出力結果は次のようになります。

int(1)
string(8) "constant"
array(4) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  string(3) "abc"
}
int(1)
string(8) "constant"
array(4) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  string(3) "abc"
}

また、define関数を使う場合、定数名に定数「__NAMESPACE__」の値を付ければOKです。

  
<?php
namespace php6::test;

define('TEST', 1);
define(__NAMESPACE__ . '::TEST', 2);

var_dump(TEST);               // 2
var_dump(::TEST);             // 1
var_dump(php6::test::TEST);   // 2

名前空間をサポートすることで、既存の定数との衝突を回避することもできますまあ、わざわざトラブルが起こりそうなことをしなくても良いと思いますが。。。;-)

  
<?php
namespace constant::test;

echo '<pre>';
/**
 * 既存の定数との衝突
 */
const E_ALL = 0;
var_dump(E_ALL);                                // 0
var_dump(::E_ALL);                              // 8191
var_dump(constant::test::E_ALL);                // 0
var_dump(constant(__NAMESPACE__ . '::E_ALL'));  // 0

echo '</pre>';

強引な感じもしなくもないですが、直感的で良いんじゃないでしょうかね?本家では別の関数(define_ns関数とか)を導入しようとか、パラメータを増やそうとか議論になっていましたが、そっちの方が面倒な気がして「うーん」と思っていました。

まとめ

ようやく定数も名前空間がサポートされるようになった感じです。実装はまだまだな感じがぬぐえませんが、まあ、そのうち追いつくんでしょう(楽観的)。あとは、変数も名前空間をサポートしてくれると。。。と思ったんですが、それってクラス化することで回避できるよなぁ。。。



About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2008 by Hideyuki SHIMOOKA all rights reserved.