2

PDOを使用するDBラッパークラスがあり、コンストラクターでPDOオブジェクトを作成します。ラッパークラスは名前空間にあり、オートローダーを使用しています。問題は、名前空間内にPDOクラスが見つからないことです。そこで、ここで説明するようにグローバル名前空間を使用してみました。

//Class file
namespace Company\Common;
class DB {
    private function __construct(){
        $this->Handle=new PDO(...);
    }
}

これで、私はこれを(予想通りに)得ます:

Warning: require(...\vendors\Company\Common\PDO.class.php): failed to open stream

私がこれを行う場合:

namespace Company\Common;
use PDO;

私はこれを手に入れます:

Fatal error: Class 'DB' not found in ...\includes\utils.php

そして、utils.phpには、名前空間を実装する前に正常に機能したエラー行にこれが含まれています。

DB::getInstance();

あるいは、私はこれを試しました:

namespace Company\Common;
class DB {
    private function __construct(){
        $this->Handle=new \PDO(...);
    }
}

これは、元々のように名前空間内にPDOクラスをロードしようとしました。

どうすればこれを解決できますか?use PDOグローバルPDOクラスをロードするか、ロードするかと思いましたnew \PDOが、機能していないようです。

4

5 に答える 5

6

use名前空間PHPでは、クラスまたはその名前空間の一部を含むステートメントがない限り、クラスへの参照にはそのクラスの名前空間を含める必要があります。

したがって、ステートメントがない場合はuse、PDOおよびその他のグローバルクラスを先頭のバックスラッシュで参照する必要があります。$obj = new \PDO();

useそのクラスを参照するステートメントがある場合は、クラス名だけで参照できます。

use PDO;
....
$obj = new PDO();

多くのグローバルクラスを参照しているuse場合、毎回バックスラッシュを使用しないようにするには、それぞれを個別に参照する必要があります。

于 2013-01-11T16:43:45.340 に答える
0

通常、私たちのプロジェクトでは、次のようなインクルードパスを設定します。

set_include_path('PATH_TO_GLOBAL_LIBS; PATH_TO_LIBRARY_1; PATH_TO_LIBRARY_X; PATH_TO_DOCUMENT_ROOT');

これにより、PHP(Apache)に、オートローダーに含める必要のあるクラスを探すためにこれらのパスを検索するように指示します。

Library_1次に、いくつかが/var/www/Libs/library_1あり、このパスがinclude_pathに追加されていると仮定すると、次のようになります。

namespace Company\Common;

Class DB {
    private function __construct() {
        $this->Handle = new \Library_1();
    }
}

これはと同じである必要があります

namespace Company\Common;

use \Library_1;

Class DB {
    private function __construct() {
        $this->Handle = new Library_1();
    }
}
于 2013-01-11T16:16:26.437 に答える
0

これはうまくいきます、あなたの問題は他にありました。

index.php

<?php
include('_db.php');
use Company\Common\DB;
new DB;

_db.php

<?php
namespace Company\Common;
use \PDO;

class DB {
    public function __construct() {
        $this->Handle = new PDO;
    }
}
于 2013-01-11T16:17:02.560 に答える
0

PDOおよびのようなグローバルオブジェクトにアクセスするDateTimeには、それらの前に円記号を付ける必要があります。したがって、2つのオプションがあります。

まず、use名前空間クラスファイルで使用するクラスのいずれか:

<?php
namespace Vendor;

use \PDO;
use \PDOException;

class MyClass
{
    public function __construct()
    {
        try {
            $db = new PDO($dsn, $user, $pass);
            $db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
        }
        catch (PDOException $e) {
            echo $e->getMessage();
            exit;
        }
    }
}

または、クラス内でバックスラッシュプレフィックス付きの宣言を使用します。

<?php
namespace Vendor;

class MyClass
{
    public function __construct()
    {
        try {
            $db = new \PDO($dsn, $user, $pass);
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        catch (\PDOException $e) {
            echo $e->getMessage();
            exit;
        }
    }
}

個人的には、最初のアプローチが好きです。

于 2013-01-11T16:26:05.700 に答える
0

解決しました。名前空間のエイリアシングは現在のファイルにのみ適用され、将来含まれるファイルには適用されないことに気づきませんでした。これはPHP.netで見つかりました。これは、エイリアシングにも適用されます。

インポートルールはファイルごとです。つまり、インクルードされたファイルは親ファイルのインポートルールを継承しません。

于 2013-01-11T16:40:55.913 に答える