PHP Включение подпространства имен из класса с относительными квалификаторами [duplicate]

Ответы здесь не полностью меня убедили. Поэтому вместо этого я делаю еще один пример.

public void passOn(Consumer<Animal> consumer, Supplier<Animal> supplier) {
    consumer.accept(supplier.get());
}

звучит нормально, не так ли? Но вы можете передавать только Consumer s и Supplier s для Animal s. Если у вас есть потребитель Mammal, но поставщик Duck, они не должны соответствовать, хотя оба являются животными. Чтобы отменить это, добавлены дополнительные ограничения.

Вместо вышесказанного мы должны определить отношения между используемыми нами типами.

E. g.,

public <A extends Animal> void passOn(Consumer<A> consumer, Supplier<? extends A> supplier) {
    consumer.accept(supplier.get());
}

гарантирует, что мы можем использовать только поставщика, который предоставляет нам правильный тип объекта для потребителя.

OTOH, мы могли бы также сделать

public <A extends Animal> void passOn(Consumer<? super A> consumer, Supplier<A> supplier) {
    consumer.accept(supplier.get());
}

, где мы идем в другую сторону: мы определяем тип Supplier и ограничиваем, что его можно поместить в Consumer.

Мы даже можем сделать

public <A extends Animal> void passOn(Consumer<? super A> consumer, Supplier<? extends A> supplier) {
    consumer.accept(supplier.get());
}

где, имея интуитивные отношения Life -> Animal -> Mammal -> Dog, Cat и т. д., мы могли бы даже поставить Mammal в Life, но не String в потребителя Life.

33
задан hakre 18 April 2013 в 16:06
поделиться

2 ответа

Ну, просто укажите пространство имен в строке:

$definition = Definer::defineProfile($_SESSION['user']->UserType);
$class = '\\Editor\\' . $definition;
$foo = new $class();

И если это дочернее пространство имен (как указано в комментариях), просто добавьте пространство имен с помощью __NAMESPACE__:

$class = __NAMESPACE__ . '\\Editor\\' . $definition;

Итак, если текущее пространство имен \Foo\Bar, а $definition - «Baz», результирующий класс будет \Foo\Bar\Editor\Baz

66
ответ дан ircmaxell 28 August 2018 в 23:57
поделиться
$url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : null;
$url = explode('/', rtrim($url, '/'));

class Dispatcher {
    public static function dispatch() {
        global $url; //
        if (empty($url[0])) {
            $url[0] = "Index";
            $url[1] = "main";
        }
        $class = '\\Controller\\' .$url[0];
        $controller = new $class(); //Index Class
        $controller->$url[1](); //This Class Main Method
    }
}
-3
ответ дан Bob Gilmore 28 August 2018 в 23:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: