Я всегда думал, что главная цель пространства имен - предотвращать столкновение имен и двусмысленность.
# 1, исправленная пространствами имен php.net:
Сопоставления имен между созданным кодом и внутренним PHP классы/функции/константы или сторонние классы/функции/константы.
Однако большинство языков каким-то образом реализуют ключевое слово "use" для псевдонима или импортируют другое пространство имен в текущее. Я знаю, как это работает, но я не понимаю, почему такая функциональность когда-либо используется.
Не использует ключевое слово 'use' эффективно опуская цель пространства имен?
namespace core\utils;
class User {
public static function hello(){
return "Hello from core!";
}
}
//---------------------------------------------------
namespace core2\utils;
class User {
public static function hello(){
return "Hello from core2!";
}
}
//---------------------------------------------------
namespace core2;
//causes name collision, we now have two different classes of type 'utils\User'
use core\utils; //without this line the result is 'Hello from core2'
class Main {
public static function main(){
echo utils\User::hello();
}
}
Main::main();
//outputs Hello from core!
?>
Я что-то упускаю или использую ключевые слова "use", которые обычно вообще не поощряются?
В любом случае, при каких обстоятельствах это действительно хорошая идея пожертвовать инкапсуляцией?
Я использовал для использования, но теперь я не уверен, когда следует использовать использование.
Изменить: Хорошо, дайте мне понять это: если я использую 'use' для получения короткого имени, как это лучше, чем просто объявление класса в глобальном пространстве имен? См. Ниже:
namespace core\utils\longname {
class User {} //declare our class in some namespace
}
//------------------Other File---------------------------
namespace { //in another file import our long name ns and use the class
use core\utils\longname\User as User;
new User();
}
^ В чем преимущество использования имен в этом объявлении:
namespace {
class User {} //declare our class in global namespace
}
//------------------Other File---------------------------
namespace { //in another file just use the class
new User();
}
Есть ли какая-либо разница между двумя?