Domanda

Qual è la differenza tra quei due:

use Exception;
use \Exception;

O quelli:

use Foo\Bar;
use \Foo\Bar;

Il Manuale dice:

Si noti che per i nomi spaziati (nomi di nomi completamente qualificati contenenti nomi separatore dello spazio dei nomi, come FOO bar in contrapposizione ai nomi globali che non lo fanno, come il foobar), la retromarcia principale non è necessaria e non consentita, poiché i nomi delle importazioni devono essere pienamente qualificati, e non vengono elaborati rispetto allo spazio dei nomi correnti.

Ma non lo capisco davvero, poiché tutte le varianti di cui sopra funzionano, cioè sicuramente non è "non consentito".

Uno sguardo in zend_do_use mostrato, quello is_global (Impostare, quando c'è una retroscena principale) viene utilizzato solo per un avviso nel seguente caso:

namespace {
    use Exception;
}

Il che mi dice: "L'istruzione di utilizzo con il nome non composto" Eccezione "non ha alcun effetto". (Anche se fare lo stesso con use \Exception avrebbe altrettanto scarso effetto, ma non lancia un avvertimento.)

Quindi: mi manca qualcosa? C'è davvero qualche differenza?

È stato utile?

Soluzione

Il manuale specifica la retromarcia come non necessario, il che significa naturalmente che se lo usi ancora che il significato è equivalente. Tuttavia, come hai sottolineato, il manuale dice che presumibilmente non è consentito, il che è falso.

Tuttavia, c'è qualcos'altro preoccupante per il manuale. Pubblicizzano questo:

// importing a global class
use \ArrayObject;

Se è vero che i nomi delle importazioni non vengono elaborati rispetto allo spazio dei nomi correnti, allora use \ArrayObject e use ArrayObject deve avere lo stesso significato. Cos'altro potrebbe use ArrayObject Fare riferimento a quello globale? In pratica, il motore importerà quello globale.

Inoltre, con bug come questo:http://bugs.php.net/bug.php?id=49143

Credo che ci sia confusione su ciò che lo standard dovrebbe essere.

Per rispondere alla tua domanda: non c'è differenza. Tuttavia, se fossi lo sviluppatore di motori che era anche un credente allo standard di non leader-slash, allora non avrei bisogno di considerare un caso in cui qualcuno ha scritto use \Exception;. Credo che questo fosse probabilmente il caso.

Altri suggerimenti

In effetti non vi è alcuna differenza nell'uso di un backslash leader nell'importazione di spazi dei nomi al momento e anche informazioni in Manuale PHP è cambiato:

Si noti che per i nomi spaziati (nomi di nomi completamente qualificati contenenti nomi separatore dello spazio dei nomi, come FOO bar in contrapposizione ai nomi globali che non lo fanno, come Foobar), la parte principale di Backslash non è necessaria e non consigliato, poiché i nomi delle importazioni devono essere completamente qualificati e non sono elaborati rispetto allo spazio dei nomi correnti.

Quindi ora ci sono vere informazioni sul fatto che l'utilizzo di un backslash leader non è consigliato, ma non ci sono informazioni che non è consentita in passato.

Quindi al momento:

use Exception;
use \Exception;

Quelle 2 linee funzionano allo stesso modo, ma dovresti preferire usare il primo.

Di solito il principale backslash definisce che l'identificatore è assoluto. Se manca, l'interprete presuppone che si tratti di un identificatore relativo.

Questo è un identificatore assoluto:

$x = new \Name\Space\To\Class();

Questo è un identificatore relativo, a causa della barra senza leader. È relativo allo spazio dei nomi attuali:

namespace Name\Space;
$x = new To\Class;

Questo è anche un identificatore relativo. In questo caso, è risolto contro il use Dichiarazione, perché l'ultima parte (alias) è la stessa, come la prima della classe:

namespace Other\Name\Space;
use Name\Space;
$x = new Space\To\Class;

Tuttavia, perché in namespace e use Sono ammessi solo identificatori assoluti (nomi completamente qualificati), va bene ometterlo qui. In namespace, non è nemmeno autorizzato a impostare il principale retroscena.

Per ulteriori informazioni su come PHP risolve le diverse dichiarazioni dello spazio dei nomi, consultare il Manuale delle regole dello spazio dei nomi.

non dire che abbiamo

namespace MyNamespace
use Exception;
use \Exception;

quindi il primo utilizzo effettivamente importa la classe mynamespace eccezione e il secondo solo la classe principale eccezione

Quindi puoi avere qualcosa di simile

namespace MyNamespace;
class Exception extends \Exception{ }

E poi posso

throw new \Exception('Exception from global namespace');
throw new \MyNamespace\Exception('Exception from MyNamespace');

La backslash principale indica lo spazio dei nomi globali. Se sei nell'ambito di uno spazio dei nomi, devi usarlo per raggiungere lo spazio dei nomi globali. Per esempio:

namespace A
{
    class A
    {
        public function __construct()
        {
            echo('namespace: A<br />');
        }
    }
}

namespace B\A
{
    class A
    {
        public function __construct()
        {
            echo('namespace: B\\A<br />');
        }
    }
}

namespace B
{
    class B
    {
        public function __construct()
        {
            new \A\A(); // namespace: A
            new A\A(); // namespace: B\A
        }
    }
    new B();
}

Con la backslash leader hai il percorso assoluto e senza di essa hai il percorso relativo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top