Расскажите мне о константах...

Alien

Новичок
Расскажите мне о константах...

Взял класс "php2excel" с http://home.arcor.de/cnovak и с удивлением увидел:

class BiffWriter {
var $parse_order = array (
ID_BOF_REC,
ID_BACKUP_REC,
ID_PRINTROWHEADERS_REC,
ID_PRINTGRIDLINES_REC,
ID_FONT_REC,
ID_HEADER_REC,
ID_FOOTER_REC,
ID_LEFT_MARGIN_REC,
ID_RIGHT_MARGIN_REC,
ID_TOP_MARGIN_REC,
ID_BOTTOM_MARGIN_REC,
ID_COL_WIDTH,
ID_FORMAT_COUNT,
ID_FORMAT_REC,
ID_CELL_TEXT,
ID_CELL_NUMBER,
ID_IS_PROTECT_REC,
ID_IS_PASSWORD_REC,
ID_EOF_REC
);

// skip

// ***** constructor *****
function BiffWriter() {

//skip
// ***** BIFF stream record definitions *****
define('ID_BOF_REC', 9); define('LEN_BOF_REC', 4); define('VERSION', 2); define('TYPE', 10);
define('ID_BACKUP_REC', 64); define('LEN_BACKUP_REC', 2);

//skip


то есть константы определяются после их первого использования?
это допустимо или я чего то непонимаю? (-:
 

[DAN]

Старожил PHPClub
Ну ведь написано же, что конструктор.
Как только ты в программе объявляешь объект данного класса, автоматически запускается конструктор (ф-ция BiffWriter() ), который и инициализирует эти константы.
Т.е. они уже будут присутствовать в объекте, как только ты его создашь.
Делается так потому, что в самом описании данных-элементов (свойств) класса их нельзя инициализировать.

RTFM по ООП ;)
 

Alien

Новичок
Хэх.

Автор только что исправился (а как тему закрыть?).
 

Alien

Новичок
До того как конструктор запустится идет инициализация var $parse_order
состоящий из кучи еще не определенных констант.

( по твоему получается что первыми иниц. переменные обьявленные в конструкторе а потом - те что напрямую в классе. Т.е. бардак.).
 

igorekk

Guest
Альен, почитай сначала про ООП, будь другом.
 

[DAN]

Старожил PHPClub
Альен: класс - это тип данных, определяемый пользователем.
Пока ты не укажешь в конструкторе класса явную инициализацию свойств (в твоем случае констант) _объекта_ данного класса, эти свойства будут _неопределены_

Резюме:
строка var $parse_order = array ( ...); всего лишь _объявляет_ свойства класса,
т.е. что только эти свойства присущи _объекту_ данного класса, а не другие.
Конструктор же напротив задает _явные_значения_ этим свойствам.

Вобщем читай ООП.
 

Alien

Новичок
Дан, ты про какой язык говоришь? :)O)

В твоих словах смысл есть. Но только если отбросить инициализацию этой переменной. Фишка заключалась в этом.

Набей на досуге в PHP примерчик.
Мне что-от интерпретатор говорит про "Use of undefined constant AAA".
PHP:
<?
class foo {
var $p = AAA;
function foo() { 
        define ("AAA", 1);
        }
}
$d = new foo();
?>
p.s
Киньте рабочий пример. А лучше цитату из справочника по ООП где так делать можно.
p.p.s.
Для тех кто в танке - оба примера _неработают_ на моменте интерпретации.
 

[DAN]

Старожил PHPClub
Вобщем так. Т.к. поддержка ООП в PHP кастрирована и несколько извращена, на сегодняшний день в PHP дело выглядит следующим образом:

1) Посмотри это: TFM » Language Reference » Classes and ObjectsOnline

2) Как оказалось, константы, определенные как define('SOME_CONST', 123); доступны внутри любой функции, в т.ч. внутри конструктора. Причем в каком бы месте программы ты их ни определил (есс-но до их определения они просто не существуют и ссылаться на них не имеет смысла).
Если ты хочешь определить константы для класса, просто определи их либо в конструкторе либо перед описанием класса. В С++ константы класса определяются совсем по-другому.

3) Придерживайся парадигмы ООП и определяй дефолтные свойства класса в конструкторе.
> var $p = AAA; <--- плохая практика

Напоследок пример:

PHP:
<?php
define ('AAA', 123);
define ('BBB', 456);

class foo
{
    var $c;

    function foo() {
        $this->c = array(AAA, BBB);
    }
}

$d = new foo();
echo $d->c[1];
?>
 

Alien

Новичок
Спасибо за разьяснение.
Уж поверь, как с классами работать я знаю.

Меня интересовал вопрос именно в той форме, что был задан (не придумали ли что то новое в очередном phpX.XXX ).
 
Сверху