Подтвердить что ты не робот

Использование "использования" или "использования" в языках программирования

Я всегда думал, что главная цель пространства имен - предотвращать столкновение имен и двусмысленность.

# 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();
}

Есть ли какая-либо разница между двумя?

4b9b3361

Ответ 1

+1 Очень интересный вопрос

Мое мнение

Ключевое слово use, так как многие виды использования и функциональности представляют это

use core\utils\sms\gateway\clickatell\http\SmsSender  as SmsCSender 
use core\utils\sms\gateway\fastSMS\ftp\Smssender as SmsFSender 

Сравнить теперь

if(!SmsCSender::send($sms))
{
    SmsFSender::send($sms);
}

To

if(!core\utils\sms\gateway\clickatell\http\SmsSender::send($sms))
{
    core\utils\sms\gateway\fastSMS\ftp\SmsSender::send($sms);
}

Заключение

Без namespace и use я не смог бы получить такой чистый читаемый код, поэтому я думаю, что namespace and use complement each other, а не "использование", побеждающее цель пространства имен