2

最近、私は zend フレームワーク 2 を学んでいましたが、長い間悩まされていた問題があります。次のようになります。

<?php
namespace Album\Model;

// Add these import statements
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;

class Album implements InputFilterAwareInterface
{
    public $id;
    public $artist;
    public $title;
    protected $inputFilter;

    public function exchangeArray($data)
    {
        $this->id     = (isset($data['id']))     ? $data['id']     : null;
        $this->artist = (isset($data['artist'])) ? $data['artist'] : null;
        $this->title  = (isset($data['title']))  ? $data['title']  : null;
    }

    // Add content to these methods:
    public function setInputFilter(InputFilterInterface $inputFilter)
    {
        throw new \Exception("Not used");
    }

    //....
    ?>

このコードは、ZF2 のチュートリアルである「スケルトン アプリケーション」プログラムの一部でした。プログラムを初めて見たとき、この 2 つのキーワードが php5.2 には存在しないため (以前の版でも同じ)、"namespace" と "use" の使用法がわかりません。実際に何が起こるかをシミュレートするプログラムを書きます:

<?php
use script\lib\test;

$o = new test();
echo $o->getWelcome();

function __autoload( $className ) {  
$classname = strtolower( $classname );  
require_once( dirname( __FILE__ ) . '/' . $classname . '.php' );  
}
?>

上記のプログラムは問題なく動作します。もちろん、script と lib という名前の 2 つのフォルダーを作成し、test.php という名前のファイルがあります。すべてが明確なようです.zendフレームワークにもオートロード機能がありますが、「スケルトンアプリケーションプログラム」のコードに気付いたとき、最初に名前空間があったので、名前空間も自分のプログラムに追加します:

<?php
namespace test;
use script\lib\test;

$o = new test();
echo $o->getWelcome();

function __autoload( $className ) {  
$classname = strtolower( $classname );  
require_once( dirname( __FILE__ ) . '/' . $classname . '.php' );  
}
?>

ページから次のような情報が返されました: Fatal error: Class 'script\lib\test' not found in E:\wamp\www\test\test_29.php on line 6

script\lib、script\lib\test などの名前空間の名前を変更しようとしましたが、役に立ちません。

どんな答えでも感謝します、ありがとう。


ここで、この問題について詳しく説明します。「namespace」と「use」の使用法を理解するために、php.net の資料 ( http://php.net/manual/en/language.namespaces) を調べました。 importing.php このページには、次のようなコードのセクションがありました。

例1 use 演算子を使用したインポート/エイリアス

<?php
namespace foo;
use My\Full\Classname as Another;

// this is the same as use My\Full\NSname as NSname
use My\Full\NSname;

// importing a global class
use ArrayObject;

$obj = new namespace\Another; // instantiates object of class foo\Another
$obj = new Another; // instantiates object of class My\Full\Classname
NSname\subns\func(); // calls function My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // instantiates object of class ArrayObject
// without the "use ArrayObject" we would instantiate an object of class
?>

上記で書いたプログラムを見直してみましょう。

<?php
namespace test;
use script\lib\test;

$o = new test();
echo $o->getWelcome();

function __autoload( $className ) {  
$classname = strtolower( $classname );  
require_once( dirname( __FILE__ ) . '/' . $classname . '.php' );  
}
?>

autoload 関数を使用しない場合、同じです。そのインスタンスをシミュレートしようとしています。

<?php
namespace test;
use script\lib\test;
require_once 'script/lib/test.php';

$o = new test();
echo $o->getWelcome();
?>

それもうまくいきますが、__autoload関数を使用してクラスファイルをロードすると、何か問題があります。どこに問題があるのか​​ わかりません。または、「例#1」を実践するためにインスタンスを作成しようとした団体はありますか?私はあなたの答えを待ちます。

4

2 に答える 2

1

ZF2 ドキュメントから

Zend\Loader\StandardAutoloader は、PSR-0 準拠のオートローダーとして設計されています。名前空間とクラス名のファイルシステムへの 1:1 マッピングを想定しており、名前空間区切り記号とアンダースコアはディレクトリ区切り記号に変換されます。

詳細を読む: PSR-0

したがって、名前空間を使用している場合、オートローダーに送信されるクラス名は のようには見えませんtest。のように見えますYOUR_NAMESPACE\test。YOUR_NAMESPACE は、クラスで定義した名前空間ですnamespace YOUR_NAMESPACE;

PSR-0 は次のような標準です。名前空間はファイルシステムを反映する必要があります。バックスラッシュをスラッシュに置き換えるだけです。または、ZF1 のような疑似名前空間を使用_して/いる場合。(アルバム_モデル_アルバム)

したがって$className、オートローダーに送信された を出力すると、..

于 2013-09-27T14:09:27.577 に答える