как вызвать конструктор абстрактного класса в PHP? @ DeForum.ru
DeДверь  
Логин:  
Пароль:  
  Автологин  
   
Разместить рекламу
Письмо админу
Правила | FAQ | *Поиск | Наша команда | Регистрация | Вход
 
 
 Страница 1 из 1 [ Сообщений: 24 ] 
*   Список форумов / Начинка и техника / Программирование для WWW » ответить » создать топик « | »
Автор Сообщение
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Заголовок сообщения: как вызвать конструктор абстрактного класса в PHP?
Сообщение Добавлено: 31 Август 2006, 01:22:49 
вопрос по матчасти,
имею абстрактный класс, к примеру:

Код:
abstract class MyClass{

   function __construct() {
      echo "hello world";
   }

}



Требуется:
Если я первый раз вызываю класс, выполнить код который записан в конструктере (function __construct()).

Я понимаю, так как класс абстрактный (объект не создается), то конструктор не вызывается.
Но все таки PHP поддерживает конструкторы в абстрактных классах.
Неужели это только для наследования?
Long Муж.
SubAdmin
Теоретик
17
Сообщения: 4362
Зарегистрирован: 25.04.01
Откуда: Москва
Сообщение Добавлено: 31 Август 2006, 11:36:06 
AlexShop, parent:: отменили? ;)

_________________
Мудрость не всегда приходит с возрастом. Бывает, что возраст приходит один.
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Сообщение Добавлено: 2 Сентябрь 2006, 01:44:44 
Long нет, но я хочу использовать только абстрактный класс (без всяких наследуемых объектов).

Вот к примеру:
Код:
01   <?php
02   abstract class Test {
03      
04      static private $_name;
05      
06      function __construct() { self::$_name = "Petya"; }
07      
08      function hello() { return "Hello ".self::$_name; }
09      
10   }
11   
12   echo Test::hello();
13   ?>


Естественно выдает ошибку:
Hello Fatal error: Access to undeclared static property: Test::$_name in E:\Program Files\Apache Group\Apache2\htdocs\test.php on line 8

где то в строчке 11 надо вызвать конструктор, который не возможно вызвать в абстрактном классе.


приходится выкручиваться так:
Код:
01   <?php
02   abstract class Test {
03      
04      static private $_name;
05      
06      function __construct() { start(); }
07      
08      function start() { self::$_name = "Petya"; }
09      
10      function hello() { return "Hello ".self::$_name; }
11      
12   }
13   
14   Test::start();
15   echo Test::hello();
16   ?>


В строчке 14 функция Test::start() как бы играет роль конструктора.

Я хотел бы использовать конструкторы в абстрактных классах. Но это пока получается вторым способом.
Либо я чего то незнаю. :confused:
Paul Yanchenko Муж.
новый человек
1
Сообщения: 112
Зарегистрирован: 05.02.04
Откуда: Екатеринбург
Сообщение Добавлено: 3 Сентябрь 2006, 23:21:08 
Конструктор вызывается в момент создания объекта. Объекты не могут создаваться для абстрактных классов, следовательно, их конструктор может вызываться только в конкретных классах-потомках.

Статика сама по себе ограничена в гибкости, поэтому, если вам ее гибкости не хватает, то используйте объекты. В вашем случае придется делать либо так, как вы сейчас делаете, либо отказываться от статики.
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Сообщение Добавлено: 3 Сентябрь 2006, 23:52:21 
Спасибо за разьяснение!
А то я думал что где то не до понял.
:beer:
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Сообщение Добавлено: 8 Сентябрь 2006, 03:31:35 
у меня еще вопрос: как сделать print_r, var_export или var_dump абстрактному классу?

если делать:
Код:
print_r(Class);
то интерпретатор ищет константу "Class" и выдает ошибку.
заранее благодарен
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 8 Сентябрь 2006, 06:05:09 
AlexShop, а что ты ожидал получить на выходе var_dump для абстрактного класса?
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Сообщение Добавлено: 8 Сентябрь 2006, 06:47:48 

Crazy писал(а):
AlexShop, а что ты ожидал получить на выходе var_dump для абстрактного класса?


незнаю :laugh: :beer:

к примеру: мне надо получить значения private переменных, показать структуру.
я так понимаю что print_r, var_export, var_dump - работают с переменными, но не с классами.

а какую функцию применить к абстрактному классу что бы одним скопом получить содержимое его переменных? (можно правда свою написать)

ЗЫ:
вообще мне это надо когда делаю дебагинг.
останавливаю код (die), хочу посмотреть состояние класса и... упс - незнаю как.
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 9 Сентябрь 2006, 22:09:56 

AlexShop писал(а):
а какую функцию применить к абстрактному классу что бы одним скопом получить содержимое его переменных? (можно правда свою написать)



У абстрактного класса есть переменные? Оригинально.
Long Муж.
SubAdmin
Теоретик
17
Сообщения: 4362
Зарегистрирован: 25.04.01
Откуда: Москва
Сообщение Добавлено: 10 Сентябрь 2006, 04:17:44 
смотрю я на это "безобразие" и понимаю, что если бы сразу произошло разделение понятий "объект" и "класс", то вопроса "какую функцию применить к абстрактному классу" вообще бы не могло возникнуть. по определению :)

_________________
Мудрость не всегда приходит с возрастом. Бывает, что возраст приходит один.
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 10 Сентябрь 2006, 10:10:02 
Long, описанная тобой проблема определенно имеет место. :)
Developer® Муж.
новый человек
4
Сообщения: 57
Зарегистрирован: 09.09.06
Откуда: Украина, Киев
Сообщение Добавлено: 10 Сентябрь 2006, 13:37:30 

Цитата:
В строчке 14 функция Test::start() как бы играет роль конструктора.


Абстрактные классы не могут иметь экземпляра.

Если тебе нужно использование статических методов из класса, узнай больше про паттерн под названием "Singleton". Как пример:
Код:
class MyClass{
  public static $Handle = null;

  public static function Instance(){
    if(is_null(self::$Handle)){
       self::$Handle = new MyClass();
    }
    return self::$Handle;
  }

  public static function MyMethod(){
      //void
  }

}

$MyClass = MyClass::Instance(); //Вот это конструктор-синглтон(он не позволит создать два экземпляра при вызове конструктора 2 или более раз), делай дампы $MyClass сколько влезет
MyClass::MyMethod(); //Вот это статический метод

Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 10 Сентябрь 2006, 16:22:45 

Developer® писал(а):
Если тебе нужно использование статических методов из класса, узнай больше про паттерн под названием "Singleton".



Если мнение, что для использования в классе статических методов абсоютно не нужно ничего знать о паттерне Singleton. Строго наоборот: чтобы пользоваться этим паттерном, нужно понимать, что такие статические методы и как ими пользоваться.
Developer® Муж.
новый человек
4
Сообщения: 57
Зарегистрирован: 09.09.06
Откуда: Украина, Киев
Сообщение Добавлено: 10 Сентябрь 2006, 16:34:18 
Существует еще одно мнение, что человеку также необходимо было просмотреть дамп экземпляра этого класса. Значит все-таки конструктор нужен? А как красиво объединить конструктор и статический метод? Ваши мнения?
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 10 Сентябрь 2006, 16:37:44 
Developer®, человеку не может быть нужно просмотреть дамп экземпляра абстрактного класса. И синглетон ему здесь никак не поможет. :)
Developer® Муж.
новый человек
4
Сообщения: 57
Зарегистрирован: 09.09.06
Откуда: Украина, Киев
Сообщение Добавлено: 10 Сентябрь 2006, 16:46:42 

Цитата:
Developer®, человеку не может быть нужно просмотреть дамп экземпляра абстрактного класса.


Какой-то скрытый смысл в этой фразе
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 10 Сентябрь 2006, 16:49:32 
Developer®, а что именно непонятно в моей фразе? Или ты полагаешь, что "просмотр дампа экземпляра абстрактного класса" можно запрограммировать?
Developer® Муж.
новый человек
4
Сообщения: 57
Зарегистрирован: 09.09.06
Откуда: Украина, Киев
Сообщение Добавлено: 10 Сентябрь 2006, 16:55:22 

Цитата:
Developer®, _человеку_ не может быть нужно...


я про это
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 10 Сентябрь 2006, 16:58:51 
Надеюсь, мы не рассматриваем душевно больных и травмированных на мозг человеков? В таком случае я не вижу ни одного случая, в котором этого человек может хотеть.

Допускают, что он может думать, что этого хочет -- если не вполне понимает отличия класса от экземпляра и абстрактного класса от конкретного.
Developer® Муж.
новый человек
4
Сообщения: 57
Зарегистрирован: 09.09.06
Откуда: Украина, Киев
Сообщение Добавлено: 10 Сентябрь 2006, 17:17:00 
Ну а может буквально завтра, этот человек произведет фуррор в OOP :)
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Сообщение Добавлено: 10 Сентябрь 2006, 20:56:01 
Developer® - спасибо! :beer: Кажется я все понял:
я должен создавать обычный (не абстрактный) класс и использовать статические методы, которые не дадут создать больше 1 экземпляра. Такому классу* я смогу сделать Dump и пользоваться конструктором.

Crazy писал(а):
человеку не может быть нужно просмотреть дамп экземпляра абстрактного класса.


Crazy - я хочу просмотреть дамп абстрактного класса (его свойства), когда делаю дебагинг. :glasses:

* P.S. объекту!! (ну сколько раз)


Последний раз редактировалось AlexShop 13 Сентябрь 2006, 06:03:37, всего редактировалось 1 раз.
Developer® Муж.
новый человек
4
Сообщения: 57
Зарегистрирован: 09.09.06
Откуда: Украина, Киев
Сообщение Добавлено: 10 Сентябрь 2006, 23:48:15 
telepat mode off (c)

Таки "singleton" был нужен...

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

Дамп делается объекту, но не классу :) Может хоть так понятнее?
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 11 Сентябрь 2006, 07:30:53 
Developer®, :beer: хорошо сказал
+1

_________________
:: metal kick ass ::
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Сообщение Добавлено: 13 Сентябрь 2006, 06:02:04 
(упс, случайно сообщение добавилось)

ну тогда всем :beer: за терпение
*   Список форумов / Начинка и техника / Программирование для WWW « | » » ответить » создать топик
 Страница 1 из 1 [ Сообщений: 24 ] 
Показать сообщения за:   Поле сортировки  
Найти:
Перейти:  
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
cron


ООО ДеФорум
При использовании материалов сайта ссылка на DeForum.ru — обязательна.
Проект Павла Батурина ©2001-2077; // Powered by phpBB © 2013 phpBB Group
Rambler's Top100