|
Страница 1 из 1 [ Сообщений: 24 ] |
Автор |
Сообщение |
AlexShop
участник
|
|
вопрос по матчасти,
имею абстрактный класс, к примеру:
Код: abstract class MyClass{
function __construct() { echo "hello world"; }
}
Требуется:
Если я первый раз вызываю класс, выполнить код который записан в конструктере (function __construct()).
Я понимаю, так как класс абстрактный (объект не создается), то конструктор не вызывается.
Но все таки PHP поддерживает конструкторы в абстрактных классах.
Неужели это только для наследования?
|
|
 |
|
 |
AlexShop
участник
|
|
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() как бы играет роль конструктора.
Я хотел бы использовать конструкторы в абстрактных классах. Но это пока получается вторым способом.
Либо я чего то незнаю. 
|
|
 |
|
 |
AlexShop
участник
|
|
у меня еще вопрос: как сделать print_r, var_export или var_dump абстрактному классу?
если делать: Код: print_r(Class); то интерпретатор ищет константу "Class" и выдает ошибку.
заранее благодарен
|
|
 |
|
 |
AlexShop
участник
|
|
Crazy писал(а): | AlexShop, а что ты ожидал получить на выходе var_dump для абстрактного класса? |
незнаю
к примеру: мне надо получить значения private переменных, показать структуру.
я так понимаю что print_r, var_export, var_dump - работают с переменными, но не с классами.
а какую функцию применить к абстрактному классу что бы одним скопом получить содержимое его переменных? (можно правда свою написать)
ЗЫ:
вообще мне это надо когда делаю дебагинг.
останавливаю код (die), хочу посмотреть состояние класса и... упс - незнаю как.
|
|
 |
|
 |
Crazy
Модератор
|
|
AlexShop писал(а): | а какую функцию применить к абстрактному классу что бы одним скопом получить содержимое его переменных? (можно правда свою написать) |
У абстрактного класса есть переменные? Оригинально.
|
|
 |
|
 |
Developer®
новый человек
|
|
Цитата: | В строчке 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
Модератор
|
|
Developer® писал(а): | Если тебе нужно использование статических методов из класса, узнай больше про паттерн под названием "Singleton". |
Если мнение, что для использования в классе статических методов абсоютно не нужно ничего знать о паттерне Singleton. Строго наоборот: чтобы пользоваться этим паттерном, нужно понимать, что такие статические методы и как ими пользоваться.
|
|
 |
|
 |
Developer®
новый человек
|
|
Цитата: | Developer®, человеку не может быть нужно просмотреть дамп экземпляра абстрактного класса. |
Какой-то скрытый смысл в этой фразе
|
|
 |
|
 |
Developer®
новый человек
|
|
Цитата: | Developer®, _человеку_ не может быть нужно... |
я про это
|
|
 |
|
 |
AlexShop
участник
|
|
Developer® - спасибо!  Кажется я все понял:
я должен создавать обычный (не абстрактный) класс и использовать статические методы, которые не дадут создать больше 1 экземпляра. Такому классу* я смогу сделать Dump и пользоваться конструктором.
Crazy писал(а): | человеку не может быть нужно просмотреть дамп экземпляра абстрактного класса. |
Crazy - я хочу просмотреть дамп абстрактного класса (его свойства), когда делаю дебагинг.
* P.S. объекту!! (ну сколько раз)
Последний раз редактировалось AlexShop 13 Сентябрь 2006, 06:03:37, всего редактировалось 1 раз.
|
|
 |
|
 |
Developer®
новый человек
|
|
telepat mode off (c)
Таки "singleton" был нужен...
Касаемо дампа абстрактного класса, ты этого сделать не сможешь -- точнее не сможешь сделать дамп абсолютно любого класса. Класс -- это общее описание структуры алгоритмов и полей под одной крышей, плоское и безжизенное. Оно есть и его нет, получить доступ к классу программно -- невозозможно, все через объект. То, с чем ты работаешь -- это экземпляры класса, объекты. Объект -- это... созданный и загруженный в память класс, экзепляр класса. Абстрактный класс не может быть создан, у него нет конструктора и быть не может, так как это лишь фундамент для чего-то дальнейшего или же связующий интерфейс для какого-то множества.
Дамп делается объекту, но не классу  Может хоть так понятнее?
|
|
 |
|
 |
MpaK999
участник
|
|
Developer®,  хорошо сказал
+1
_________________ :: metal kick ass ::
|
|
 |
|
 |
AlexShop
участник
|
|
(упс, случайно сообщение добавилось)
ну тогда всем  за терпение
|
|
 |
|
 |
|
Страница 1 из 1 [ Сообщений: 24 ] |
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
|
|