Ответы здесь не полностью меня убедили. Поэтому вместо этого я делаю еще один пример.
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
.
Ну, просто укажите пространство имен в строке:
$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
$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
}
}