«Это зависит». это правильный ответ. Относительно редко действительно требуется имя пакета; обычно у вас будет экземпляр или имя класса для начала. Тем не менее, бывают случаи, когда вам действительно нужно имя пакета - __PACKAGE__
явно инструмент для этой работы, превосходящий буквальное. Вот несколько рекомендаций:
Никогда не вызывайте методы из __PACKAGE__
внутри методов, так как это делает для наследников невозможным изменить вашу реализацию, просто переопределив вызываемый метод. Вместо этого используйте $self
или $class
.
Старайтесь избегать __PACKAGE__
внутренних методов в целом. Каждое использование __PACKAGE__
добавляет немного негибкости. Иногда гибкость - это то, что вы хотите (потому что вам нужно разрешение во время компиляции или вы очень хотите контролировать, где хранится информация), но будьте уверены, что то, что вы хотите, стоит своих затрат. Вы будете благодарить себя позже.
За пределами методов у вас нет доступа к $self
, и вы должны вызывать методы с __PACKAGE__
вместо литерала. Это главным образом важно для объявлений времени компиляции, подобных тем, которые предоставляются Class::Accessor
.