PHPで動的にクラス名を指定するとオートロードできない件

PHP で動的にクラス名を指定する場合、現在いる名前空間が修飾されないため、
クラス名のみで名前空間内のクラスを指定して new するとクラスを見つけられず致命的なエラーになります。

エラーになる例

クラスファイルのパス構成

例えば PSR-0 規約に準拠して以下のような構成で Car クラスと CarCreator クラスを配置していたとします。

  • /var/www/sample/Vendor/SampleVendor/Entity
    • Car.php
    • CarCreator.php

Car.php

SampleVendor\Entity の名前空間に Car クラスを定義します。

<?php
namespace SampleVendor\Entity

class Car {}

CarCreator.php

この状態で Car クラスと同じ名前空間の CarCreator クラスから Car クラスのインスタンスを生成してみます。(autoload.php は既に読み込まれている状態とします。)

<?php
namespace SampleVendor\Entity

class CarCreator {
    public function create() {
        // 🙆🏻‍♀️ OKパターン:
        // 暗黙的に現在の名前空間が修飾され、問題なくインスタンスの生成ができる
        $car = new Car();

        // 🙅‍♀️ NGパターン:
        // 名前空間が修飾されずクラスが見つからないためエラー
        // Fatal error: Class 'Car' not found in /var/www/...
        $className = 'Car';
        $car = new $className();
    }
}

このエラーを解決するにはどうすればいいでしょうか?

解決方法

完全修飾形式(名前空間まで含めた完全な指定)でクラスを指定するか、Car クラスを別途 use 句で指定することで解決できます。

以下は完全修飾形式でクラスを指定する場合の例です。

<?php
namespace SampleVendor\Entity

class CarCreator {
    public function create() {
        $className = __NAMESPACE__ . '\\' . 'Car';
        $car = new $className();
    }
}

マジック定数の __NAMESPACE__ で現在の名前空間名の文字列を取得できるので、これを先頭に付けてクラスを指定します。

CakePHP3で現在のパスやURLを取得する

過去にCakePHP2でのURL取得方法をメモしましたが、CakePHP3では取得方法が変更されていましたのでメモしておきます。

View クラス(テンプレート上)で取得する場合

今までは HtmlHelper で取得していましたが、CakePHP3 では UrlHelper で取得できます。

// 絶対パスとして取得 (/controller/action/)
<?= $this->Url->build('/controller/action/') ?>

// フル URL として取得 (http://example.com/controller/action/)
<?= $this->Url->build('/controller/action/', true) ?>

通常は絶対パスで取得され、第二引数を true にすると URL として取得されます。

View 以外のクラスで取得する場合

Router クラスを使用しますが、use 句で使用することを宣言しておく必要があります。
UrlHelper::build() も最終的には同じメソッドが呼び出されるので引数の仕様は同じです。

use Cake\Routing\Router;

class HogeController extends AppController {
    public function index() {
        // フル URL として取得
        // (http://example.com/controller/action/)
        $path = Router::url('/controller/action/', true);
    }
}

【レビュー】ハイレゾウォークマンNW-ZX2を開封した

フラグシップウォークマンの NW-ZX2 遂に購入したので写真多めでファーストインプレッションレビューをしていきます。

以下が今回購入したものです。

  • ウォークマンZXシリーズ「NW-ZX2」
    • OS: Android 4.2
    • 内蔵メモリ: 128GB
    • 連続再生時間: 61 時間 (MP3)
    • 付加要素: ハイレゾ再生, MicroSDスロット, Bluetooth, DSEE HX, クリアオーディオ+
  • NW-ZX2専用レザーケース「CKL-NWZX2」
  • 密閉型インナーイヤーレシーバー「XBA-A3」
  • ZX/F880シリーズ専用液晶保護シート「PRF-NWH40」

ソニーストア10%OFFクーポンを使ってウォークマンだけで11万円ほど、総額16万円の買い物になりました( ゚_ ゚) その分、DAP として恐ろしくハイスペックです。3年ワイド保証もつけています。

ちなみにこのモデルは音質に特化しているため、それに相反する要素はばっさり捨てられています。例えばノイズキャンセリング機能や内臓スピーカは省かれています。また、イヤホンは付属しておらず、自分でそれなりのイヤホンやヘッドホンを用意してねという感じになっています。

NW-ZX2

まずはパッケージです。

NW-ZX2 パッケージ

重厚な包装でワクワク感が増します。取り出した第一印象はずっしりで、市場に出回っている同サイズのどのスマホよりも重いと思いますw

NW-ZX2 包装

イヤホンの接続端子は今回も金メッキです。

NW-ZX2 イヤホンジャック接続部

NW-ZX2専用レザーケース「CKL-NWZX2」

一緒に購入したケースも開封しました。天然皮革素材だそうです。

CKL-NWZX2 パッケージ

CKL-NWZX2 外観1

パカっと開いて、閉じる時はマグネットで固定されます。サイドに付いている再生ボタンなどの操作ボタンなどは全てそのまま使えるため便利です。

CKL-NWZX2 外観2

密閉型インナーイヤーレシーバー「XBA-A3」

イヤホンです。

XBA-A3 パッケージ

XBA-A3 化粧箱

取り出すのがもったいない><

XBA-A3 外観

イヤホンをしまうためのポーチも付属しています。これが結構良く出来ていて、開いた左右にポケットがついていて、イヤホンのジャックの部分と耳に入れる部分をそれぞれポケットに入れておけば絡まりません。とはいえ、毎回しまうのは少し大変なのでどうするか考え中です(ll´`)

XBA-A3付属キャリングポーチ

あと他にも付属品は色々充実していて、イヤホンのコードの長さを調節するコードアジャクターや、移動中の摩擦音を防ぐクリップ、イヤーピースなどが付属しています。

ここまでで開封の儀式終わりです。

音楽再生してみた

ドラッグ&ドロップで DIR EN GREY の ARCHE を転送してW.ミュージックアプリを起動したところです。写真だと分かりにくいのですが、ディスプレイも結構きれいで美しくアートワークが表示されています。再生してみるとバンドが作り出す空間を感じるサウンドを生々しく味わうことができました。

W.ミュージックアプリ(DIR EN GREY - ARCHE)

カバーアートビュー

W.ミュージックプレイヤーを触っていておもしろい機能だなと思ったのがカバーアートビューです。散らばったCDジャケットから聴きたいアルバムを選べます。

W.Music カバーアートビュー

歌詞表示 / 歌詞ピタ

音楽ファイル名の拡張子を.txtや.lrcに変えたファイルも一緒に入れておくとアートワークの上に歌詞表示してくれます。

W.Music 歌詞表示

音楽転送について

MP3 ファイルを D&D で放り込むだけで転送出来ました。手軽で良い感じです。個人的にオススメの転送方法は BunBackup というソフトを使って PC 側で追加・変更されたファイルのみ差分転送する方法です。

試しに可逆圧縮の flac + cue ファイルも転送してみましたが cue シートは認識してくれないようなのでトラックごとに分けて転送する必要がありそうです。

Android OS

Android 4.2.2 Jelly Bean が入っていました。5.0 Lollipop なんかも出始めていますが、ある程度枯れて安定した OS を入れているとのこと。

ブラウザや Youtube 見るのは問題なく出来ます。音楽再生にかかわらないアプリは大体アンインストールしました。

ちなみに自社で開発している Unity 製のゲームアプリをインストールしてみましたが普通に遊べました。どちらかというと iPhone5 のほうがサクサクかなという印象ではありました。

感想

決して安くない買い物でしたが、音楽を聴くことが一層楽しくなること間違いないです。ピュアオーディオはお金をかけ出すとマジできりがない訳ですが、手軽に一歩進んだピュアオーディオを味わうにはよい機種かなと思います。ファーストインプレッションレビューは以上です。