Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

PHP5.3.0α3の名前空間

お約束通り(?)、α3の名前空間を試してみました。コードのネタはWEB+DB PRESS Vol.47の連載に書いたモノです。せっかく必死こいて書いたのに。。。

WEB+DB PRESS Vol.47

WEB+DB PRESS Vol.47

名前空間の宣言の例

まあ、予想通りですね。。。バックスラッシュになってますよ。ええ、バックスラッシュになってますよ。

<?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')」だったところですが、正直「::」はまだ許せた。でも、これはダメだ!トップレベルの関数やクラスと衝突しないように書かないとダメだ!気色悪すぎる!