private static Dictionary<string, string> GetAuthors()
{
return typeof(Book).GetProperties()
.SelectMany(prop => prop.GetCustomAttributes())
.OfType<AuthorAttribute>()
.ToDictionary(attribute => attribute.Name, attribute => attribute.Name);
}
Эта переменная не инициализирована, она просто необъявлена.
Объявление переменных в определении класса - это стиль для удобства чтения. Кроме того, вы можете установить доступность (частную или общедоступную).
В любом случае явное объявление переменных не имеет ничего общего с ООП, это зависит от языка программирования. В Java вы не можете этого сделать, потому что переменные должны быть объявлены явно.
Если вы объявляете член внутри класса, вы можете установить его доступность, например,
private $varname;
Вы всегда должны объявлять свои переменные-члены и указывать их доступность в ваших классах. Мне нравится помещать эту информацию в конце класса после моих функций.
Вы должны определить их, как только у вас будет достаточно информации для этого. Возможно, в конструкторе или через функции установки.
Это важно, потому что это значительно облегчает жизнь людям, работающим с вашим кодом. Им не нужно гадать, откуда берутся разные свойства или почему они там. Кроме того, большинство (если не все) IDE не будут обрабатывать переменные класса, если вы не объявили их где-то. Автозавершение кода / подсказки - одно из многих преимуществ IDE, и без объявления переменных вы сделаете эту функцию бесполезной.
Обычно переменные должны быть инициализированы, как только у вас будет достаточно информации, чтобы сделать это должным образом.
Если переменная класса требует правильной инициализации определенной информации, то эту информацию следует передать в конструктор.
Использование синтаксиса PHP для неявного объявления переменных в точке определения - это, IMHO, верный способ внести ошибки - если вашему классу нужна переменная, объявите ее и используйте всю скрытую информацию, которую предоставляет вам ООП.
Общая парадигма инкапсуляции ООП гласит, что вы не должны открывать свои внутренние переменные состояния извне, что означает, что они должны быть частными, что позволяет вам изменять реализацию вашего класса без необходимости изменения кода, где вы пользуетесь им. Лучше всего инициализировать переменные через конструкторы и методы получения и установки класса.