PHP (непонятное предупреждение)
Warning: Call to protected UserEnter::__destruct() from context '' during shutdown ignored in Unknown on line 0
UserEnter - класс, который есть дочерним X класса.
Класс Х - абстрактный и все методы помечены как protected
Warning: Call to protected UserEnter::__destruct() from context '' during shutdown ignored in Unknown on line 0
UserEnter - класс, который есть дочерним X класса.
Класс Х - абстрактный и все методы помечены как protected
какая версия пхп стоит?
Если имеется в виду конструктор и деструктор, то вы в корне не правы по отношению ко всему ООП. Не знаю как это в PHP, но в других языках приватные конструкторы и деструкторы бывают очень полезны а при исспользовании некоторых паттернов проектирования просто необходимы. Напрмер тот же приватный конструктор можно исспользовать для запрета прямого создания объектов в обход фабрики. И четкого контроля этого процесса. Ну и т.п.
Ведь модификаторы доступа отвечают только за доступ к методам, а не за возможность их выполнения.
Вот человек и запретил вызов деструктора при прямом уничтожении
На это предупреждения быть не должно.
Тем более в этом предупреждении ясно сказано: "Call to protected..."
А теперь представь, что создаю я объект. Привожу пример в Delphi:
TMyObject = class(TObject)
private
constructor Create;
end;
TObject2 = class(TObject)
public
procedure AnyProcedure;
end;
...
procedure TObject2.AnyProcedure;
var Obj: TMyObject;
begin
Obj := TMyObject.Create;
end;
Он меня просто пошлёт ещё на стадии компиляции. Нельзя извне обратиться к приватному методу.
Ещё можно варежки надевать, когда код пишешь, чтобы нарочито неудобства создавать.
Смутно могу представить себе ситуацию, когда может понадобиться конструктор, которым ничего невозможно создать.
Вот опять.
private - это для использования внутри объекта.
protected - для использования внутри объекта и для потомков.
public - для всего остального.
Если constructor доступен только внутри класса, объект создать невозможно, т.к. объекты создаются снаружи, а не появляются волей Аллаха.
...
Он меня просто пошлёт ещё на стадии компиляции. Нельзя извне обратиться к приватному методу.
Потому, что вы пытаетесь создать объект вручную. Для того и делается, чтобы слало на этапе компиляции. Так же как будет слать при попытке обраться к приватной, не используемой вне класса переменной.
Ещё можно варежки надевать, когда код пишешь, чтобы нарочито неудобства создавать.
Это не неудобства, это средство объектного проектирования и контроля за коректностью кода. Или вы считаете объявление приватными переменных и методов класса не входящих в его интерфейс тоже неудобством? А зачем же тогда ООП юзать - есть ведь процедурный подход. )
Смутно могу представить себе ситуацию, когда может понадобиться конструктор, которым ничего невозможно создать.
Объект можно создать. Пример я привел - объекты создаются внутри статических методов класса и возвращаются экземпляры объектов. Приватный конструктор гарантирует, что экземпляры не будут созданны иначе и не нарушут нужную структуру и взаимодействие. Таких примеров может быть море. Если вы этого не знаете, это не значит, что такого нету. Если хотите могу дать интерессную литературу по ООП и различным паттернам объектного проектирования где это все активно применяется.
private - это для использования внутри объекта.
protected - для использования внутри объекта и для потомков.
Поправка - для исспользования внутри объектов и класса! ООП исспользует одинаково активно понятия класс и объект - это 2 ортогональные плоскости можно сказать. )
Если constructor доступен только внутри класса, объект создать невозможно, т.к. объекты создаются снаружи, а не появляются волей Аллаха.
Читайте выше - я там привел пример как можно создать. Объекты можно создавать не только снаружи.
/**
* Синглтон
*/
class Foo
{
private static $_instance = null;
private function __construct()
{
}
public static function getInstance()
{
if(is_null(self::$_instance)) {
return new Foo();
} else {
return self::$_instance;
}
}
}
Вот пример крайне распостранённого и нужного паттерна - синглтон.
Применяется при необходимости использовать только один экземпляр класса в любом случае. Пример из жизни. Корзина.
Сколько бы ты (по ошибки или как) не создавал $cart = Cart::getInstance() он будет тебе возврвщать всегда одну и ту же корзину.
2 mfender
посмотрите на реализацию TControlScrollBar, я очень ругался, когда увидел, что у него конструктор объявлен как private :)