6

PHPにはある種using namespaceのC++がありますか?(したがって、呼び出しの前に名前空間を記述する必要はありません)

私は次の中で関数を定義しました:

namespace \Project\Library {
   function hello() {

    }

}

file.php:

use \Project\Library;

hello();     //> Error: Call to undefined function hello()

PS。

私は私が使うことができることを知っていますuse \Project\Library as L;

そして、L\hello();

私も避けたいですL\

編集

私は自分自身に答えます:あなたはそれをすることはできません。そして、それはimoを吸います(これは私がPHPで最初に嫌いなことです)。

Edit2

明確にするために:hello()クラスの場合、を使用して直接呼び出すことができますuse。問題はそれが単純な関数なので、その名前空間を書かなければならないということです。これはPHPのちょっとした気の毒です。

たぶん、これをバグと見なしてチケットを開くことができますか?

4

2 に答える 2

3

PHP 5.3.0 以降、次の構文をサポートしていますuse ... as

use My\Full\Classname as Another

useまた、直接 ( なしで)を使用してマニュアルから推測するas Anotherことはできません (マニュアルには記載されていません)。

クラス ファクトリやオートローダーを介した回避策などのハックを使用できる場合がありますが、単純で直接的な答えは「不可能です」です。:(

于 2012-11-10T18:58:01.350 に答える
1

PHP に名前空間があり、関数をクラスの外部で直接宣言できる場合でも、少なくとも静的クラス メソッドを使用することを強くお勧めします。その後、何かをハックする必要はなく、機能するように設計された名前空間を使用します。クラス付き。

これが実際の例です:

こんにちは.php

<?php

namespace Project\B;

class HelloClass {
    static function hello() {
        echo "Hello from hello.php!";
    }
}

a.php

<?php

namespace Project\A;

require('hello.php');  // still have to require the file, unless you have an autoloader

use \Project\B\HelloClass;   // import this class from this namespace

\Project\B\HelloClass::hello();   // calling it this way render the 'use' keyword obsolete

HelloClass::hello();  // or use it as it is declared

****:use foo as bar;クラスの名前を変更しましょう! 例えば ​​:

use \Project\B\HelloClass as Foo;   // import this class from this namespace as Foo

Foo::hello();   // calling it this way using the 'use' keyword and alias

** アップデート **

興味深いことに、これを行うことができます:

c.php

namespace Project\C;


function test() {
    echo "Hello from test!\n";
}

a.php

use \Project\C;             // import namespace only
use \Project\C as Bar;      // or rename it into a different local one

C\test();        // works
Bar\test();      // works too!

だから、書いuse Project\Library as L;て呼び出すだけL\hello();です。ここがあなたの最良の選択肢だと思います。

于 2012-11-10T19:12:11.990 に答える