Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

PHP (непонятное предупреждение)

4.9K
07 июня 2007 года
77713
43 / / 22.02.2006
Что это может быть, скрипт работает, но в конце пишет строку:

Warning: Call to protected UserEnter::__destruct() from context '' during shutdown ignored in Unknown on line 0

UserEnter - класс, который есть дочерним X класса.
Класс Х - абстрактный и все методы помечены как protected
304
07 июня 2007 года
Fenyx
707 / / 26.01.2005
Цитата: 77713
Что это может быть, скрипт работает, но в конце пишет строку:

Warning: Call to protected UserEnter::__destruct() from context '' during shutdown ignored in Unknown on line 0

UserEnter - класс, который есть дочерним X класса.
Класс Х - абстрактный и все методы помечены как protected


какая версия пхп стоит?

8
08 июня 2007 года
mfender
3.5K / / 15.06.2005
Обращаю внимание, что методы __construct() и __destruct() не могут быть protected. Они всегда дожны быть public. Это не только в PHP. Это "альфа и омега" всего ООП. Потому что обрабатываются всегда, вне зависимости от того, написал их разработчик, или нет.
15
08 июня 2007 года
shaelf
2.7K / / 04.05.2005
Обращаю внимание, что __constract() может быть private)))
240
08 июня 2007 года
aks
2.5K / / 14.07.2006
Цитата: mfender
Обращаю внимание, что методы __construct() и __destruct() не могут быть protected. Они всегда дожны быть public. Это не только в PHP. Это "альфа и омега" всего ООП. Потому что обрабатываются всегда, вне зависимости от того, написал их разработчик, или нет.


Если имеется в виду конструктор и деструктор, то вы в корне не правы по отношению ко всему ООП. Не знаю как это в PHP, но в других языках приватные конструкторы и деструкторы бывают очень полезны а при исспользовании некоторых паттернов проектирования просто необходимы. Напрмер тот же приватный конструктор можно исспользовать для запрета прямого создания объектов в обход фабрики. И четкого контроля этого процесса. Ну и т.п.
Ведь модификаторы доступа отвечают только за доступ к методам, а не за возможность их выполнения.

7.9K
08 июня 2007 года
vasa_c
191 / / 05.04.2007
Цитата:
Напрмер тот же приватный конструктор можно исспользовать для запрета прямого создания объектов в обход фабрики


Вот человек и запретил вызов деструктора при прямом уничтожении

4.9K
08 июня 2007 года
77713
43 / / 22.02.2006
А проблема то у меня была в том, что я объявил конструктор, а не объявил деструктор - вот и высвечивалось предупреждение. После того как все поправил - работает, и даже с пометкой protected в родительском классе, а в дочерних - public
7.9K
08 июня 2007 года
vasa_c
191 / / 05.04.2007
Цитата:
не объявил деструктор - вот и высвечивалось предупреждение.


На это предупреждения быть не должно.
Тем более в этом предупреждении ясно сказано: "Call to protected..."

8
08 июня 2007 года
mfender
3.5K / / 15.06.2005
Цитата: shaelf
Обращаю внимание, что __constract() может быть private)))


А теперь представь, что создаю я объект. Привожу пример в Delphi:

Код:
type
  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;


Он меня просто пошлёт ещё на стадии компиляции. Нельзя извне обратиться к приватному методу.

Цитата:
Напрмер тот же приватный конструктор можно исспользовать для запрета прямого создания объектов в обход фабрики. И четкого контроля этого процесса.


Ещё можно варежки надевать, когда код пишешь, чтобы нарочито неудобства создавать.
Смутно могу представить себе ситуацию, когда может понадобиться конструктор, которым ничего невозможно создать.

7.9K
08 июня 2007 года
vasa_c
191 / / 05.04.2007
Извне нельзя. А при создании объектов внутри потомков или дружественных структур можно.
8
08 июня 2007 года
mfender
3.5K / / 15.06.2005
Цитата: vasa_c
Извне нельзя. А при создании объектов внутри потомков или дружественных структур можно.


Вот опять.
private - это для использования внутри объекта.
protected - для использования внутри объекта и для потомков.
public - для всего остального.

Если constructor доступен только внутри класса, объект создать невозможно, т.к. объекты создаются снаружи, а не появляются волей Аллаха.

240
08 июня 2007 года
aks
2.5K / / 14.07.2006
Цитата: mfender
А теперь представь, что создаю я объект. Привожу пример в Delphi:
...
Он меня просто пошлёт ещё на стадии компиляции. Нельзя извне обратиться к приватному методу.


Потому, что вы пытаетесь создать объект вручную. Для того и делается, чтобы слало на этапе компиляции. Так же как будет слать при попытке обраться к приватной, не используемой вне класса переменной.


Цитата: mfender
А теперь представь, что создаю я объект.
Ещё можно варежки надевать, когда код пишешь, чтобы нарочито неудобства создавать.


Это не неудобства, это средство объектного проектирования и контроля за коректностью кода. Или вы считаете объявление приватными переменных и методов класса не входящих в его интерфейс тоже неудобством? А зачем же тогда ООП юзать - есть ведь процедурный подход. )

Цитата: mfender
А теперь представь, что создаю я объект.
Смутно могу представить себе ситуацию, когда может понадобиться конструктор, которым ничего невозможно создать.


Объект можно создать. Пример я привел - объекты создаются внутри статических методов класса и возвращаются экземпляры объектов. Приватный конструктор гарантирует, что экземпляры не будут созданны иначе и не нарушут нужную структуру и взаимодействие. Таких примеров может быть море. Если вы этого не знаете, это не значит, что такого нету. Если хотите могу дать интерессную литературу по ООП и различным паттернам объектного проектирования где это все активно применяется.

240
08 июня 2007 года
aks
2.5K / / 14.07.2006
Цитата: mfender
Вот опять.
private - это для использования внутри объекта.
protected - для использования внутри объекта и для потомков.


Поправка - для исспользования внутри объектов и класса! ООП исспользует одинаково активно понятия класс и объект - это 2 ортогональные плоскости можно сказать. )

Цитата: mfender

Если constructor доступен только внутри класса, объект создать невозможно, т.к. объекты создаются снаружи, а не появляются волей Аллаха.


Читайте выше - я там привел пример как можно создать. Объекты можно создавать не только снаружи.

15
08 июня 2007 года
shaelf
2.7K / / 04.05.2005
Код:
<?php
/**
 * Синглтон
 */

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() он будет тебе возврвщать всегда одну и ту же корзину.
268
10 июня 2007 года
Михаил
587 / / 25.06.2005

2 mfender

посмотрите на реализацию TControlScrollBar, я очень ругался, когда увидел, что у него конструктор объявлен как private :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог