2014-01-30 5 views
14

Некоторые из моих классов объявляют свои конструкторы частными, потому что объект такого класса разрешен только для статического метода класса. Могу ли я также объявить деструкторы таких классов, как частные, держать его симметричным, безопасно ли это?Можно ли объявить деструктор приватным?

EDIT: Хорошо, кажется, что это просто невозможно:

Fatal error: Call to private AClass::__destruct() from context '' in /script on line 0 

(контекст пуст, и нет такого понятия, как линия 0). По какой-то причине я привык думать, что среда выполнения PHP всемогуща и может уничтожить все, что она хочет.

ответ

15

В php __destruct магический метод must be public. Метод будет автоматически вызван извне к экземпляру. Объявление __destruct как protected или private приведет к предупреждению, и метод магии не будет вызван.

Нет необходимости в симметрии, так как вы никогда не должны явным образом звонить __destruct.

+0

Неустранимая ошибка: вызов в закрытый Foo :: __ destruct() из контекста при объявлении как закрытый – zloctb

2

Кажется, что вы используете одноэлементный шаблон. В этом шаблоне конструктор должен быть закрытым, и у вас есть статический метод, возвращающий экземпляр класса. Если нет экземпляра, этот статический метод создаст его и вернет.

Если вы установили доступ деструктора к закрытому, вы не разрешаете другим классам или функциям уничтожать этот экземпляр, и это может быть непоследовательным, если в момент выполнения вашего приложения вы больше не будете использовать этот экземпляр. Нет причин устанавливать деструктор в закрытый, поскольку, даже если он является общедоступным, статический метод способен возвращать новый экземпляр, если его нет.

+0

Они все равно должны быть осторожны с синхронизацией указателя/слота синглтона в определении класса через статический getter и деструктор. Не хотите, чтобы статический геттер возвращал синглтон перед его уничтожением. – atk

+0

Также имейте в виду, что одноэлементный шаблон является очень плохой моделью в большинстве (не всех) случаях и представляет много проблем дизайна. Также невозможно провести с ними правильное тестирование модулей. – ToBe

+0

Это реализовано таким образом, чтобы имитировать перегрузку функции несколькими статическими методами при построении объекта класса (перегрузка не поддерживается в PHP) –

Смежные вопросы