PHP wie man alle Klassen aus einem anderen Namespace importiert

73

Ich implementiere Namespaces in meinem vorhandenen Projekt. Ich habe festgestellt, dass Sie das Schlüsselwort 'use' verwenden können, um Klassen in Ihren Namespace zu importieren. Meine Frage ist, kann ich auch alle Klassen aus einem Namespace in einen anderen importieren. Beispiel:

namespace foo
{

    class bar
    {

        public static $a = 'foobar';

    }

}

namespace
{
    use \foo;  //This doesn't work!
    echo bar::$a;
}

Update für PHP 7+

Eine neue Funktion in PHP 7 sind gruppierte Deklarationen. Dies macht es nicht so einfach wie die Verwendung von 1 'use-Anweisung' für alle Klassen in einem bestimmten Namespace, macht es aber etwas einfacher ...

Beispielcode:

<?php
// Pre PHP 7 code
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;

// PHP 7+ code
use some\namespace\{ClassA, ClassB, ClassC as C};
?>

Siehe auch: https://secure.php.net/manual/en/migration70.new-features.php#migration70.new-features.group-use-declarations

rauben
quelle
1
Wohlgemerkt, dass "Importieren" nicht bedeutet, dass Sie diese Klasse tatsächlich finden können. Sie müssen diese Klasse weiterhin über einen manuellen oder einen Autoloader zur Verfügung haben.
Nanne
1
Natürlich, aber ich weiß nicht, wie ich es anders ausdrücken soll.
Rob
Ich dachte schon, aber um Verwirrung zu vermeiden :)
Nanne
Als ich das Update auf PHP7 las, runzelte ich die Stirn. Ich bin verblüfft, dass PHP nicht wusste, wie bequem es wäre, ALLE Klassen in einem Namespace zu öffnen. In Java haben Sie geradeuse foo/*
Eggmatters
1
@Ultimater Schöne Ergänzung. Wenn Sie mit der Aktivierung des Eval-Supports einverstanden sind, ist dies möglicherweise eine Lösung. Persönlich würde ich es nicht empfehlen.
Rob

Antworten:

71

Dies ist in PHP nicht möglich.

Alles was Sie tun können ist:

namespace Foo;

use Bar;

$obj = new Bar\SomeClassFromBar();
Ondřej Mirtes
quelle
4
Oder Sie können natürlich konkrete Klassen in die Verwendungsklausel aufnehmen. ( use Bar\SomeClassFromBar; $obj = new SomeClassFromBar();)
Ondřej Mirtes
3
Aus der C # -Welt stammend, klang das nicht sehr erfreulich. : - (
dotNET
1
@dotNET Ich liebe PHP bis dahin wurde ich in echtes OOP eingeführt. Ich benutze immer noch PHP, aber dies ist einer der Gründe, warum ich
boi_echos
beiseite: Sie sollten dem Namespace wirklich einen Backslash voranstellen. Andernfalls sagen Sie, dass es relativ zum Foo-Namespace ist. Oft beißt diese angenommene Vernachlässigung Menschen in den Hintern. Gewöhnen Sie sich einfach an, den Root-Namespace explizit anzugeben, wenn es sich um den Root-Namespace handelt und nicht relativ zum aktuellen Namespace (auch wenn der aktuelle Namespace möglicherweise root ist)
ahnbizcad
3

Sie können das "as" zum Kürzen und Aliasing langer Namespaces verwenden

composer.json

{
    "autoload": {
        "psr-4": {
            "Lorem\\Ipsum\\": "lorem/ipsum",
            "Lorem\\Ipsum\\Dolor\\": "lorem/ipsum/dolor",
            "Lorem\\Ipsum\\Dolor\\Sit\\": "lorem/ipsum/dolor/sit"
        }
    }
}  

index.php

    <?php

    use Lorem\Ipsum\Dolor\Sit as FOO;

    define ('BASE_PATH',dirname(__FILE__));
    require BASE_PATH.DIRECTORY_SEPARATOR.'vendor'.DIRECTORY_SEPARATOR.'autoload.php';

    $bar = new FOO\Bar();
    $baz = new FOO\Baz();
    $qux = new FOO\Qux();
András Szabácsik
quelle