Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Организация иерархической стркутруры, Классы 
:(
    Опции темы
Enjoy
  Дата 8.6.2007, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 4.2.2006

Репутация: нет
Всего: нет



Здравствуйте!

Я занимался программированием в Object Pascal и C++, и не давно стал изучать PHP.

Мне нужно создать иерархическую структуру классов - один класс вложен в другой, и т.д.

Я сделал так, как я делал это всегда раньше, но в PHP это не работает!

Код

class cScript
{    
}

class cMain
{    
        private $Script = new cScript();
}


Может быть PHP его не видит? Что я могу сделать?

Да, и для чего в PHP применяется такая форма записи переменной: "var $variable"?
Это означает, что изменения передаваемой в функцию переменной затронут и переданную переменную?

Заранее благодарен.
PM MAIL   Вверх
Rock
Дата 8.6.2007, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 264
Регистрация: 13.1.2005
Где: Краснодар

Репутация: 0
Всего: 1



По всей видимости Вы используете PHP5.
var - это пережиток от  PHP4 и более ранних версий, в PHP5 он сохранен для совместимости, эквивалентен public

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

Вы можете сделать так:

Код

class cScript
{    
}
class cMain
{    
        private $Script = null;
        public function __construct() {
              $this->Script = new cScript();
        }
}

PM MAIL ICQ   Вверх
skyboy
Дата 8.6.2007, 19:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(Enjoy @  8.6.2007,  17:48 Найти цитируемый пост)
Да, и для чего в PHP применяется такая форма записи переменной: "var $variable"?

смешались в кучу: кони, люди...
в РНР4 все поля объекта имели  одинаковую область видимости(public) и задавались так: "var $amount".
в РНР5 появились области видимости и поля объекта стали задаваться так: "public $name" или "private $surname". А вариант с "var" перекочевал из объектной модели 4 версии для обеспечения обратной совместимости(так же как и возможность объявления конструктора в виде функции с именем класса, хотя уже появилась магическая функция __contrsuct)
Цитата(Enjoy @  8.6.2007,  17:48 Найти цитируемый пост)
private $Script = new cScript();

как именно не работает? ругается или ты не можешь за пределами класса получить значение этого поля(область видимости private - на всякий случай обращаю внимание)?
быть может, инициализировать поля при объявлении можно только константными значениями, а обращение к конструктору, как-никак, это вызов функции. Не встречал я в С++ такого:
Код

class Some {
 int b= -21;
 int a= abs(b);
}

Если причина в невозможности инициализировать поля функциями, то запизни эту инициализацию в конструктор(так сразу "по-правильному" и надо было сделать - для того конструкторы и существуют).
И заведи себе какой-нить мануал + учебник.
Лучший мануал - php.net
Если не дружишь с английским, то есть русское зеркало, только оно медленнее отзывается на обновление "старшего брата" - php.ru
PM MAIL   Вверх
Enjoy
Дата 9.6.2007, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 4.2.2006

Репутация: нет
Всего: нет



Цитата(skyboy @ 8.6.2007,  19:52)


Цитата(Enjoy @  8.6.2007,  17:48 Найти цитируемый пост)
Да, и для чего в PHP применяется такая форма записи переменной: "var $variable"?

смешались в кучу: кони, люди...
в РНР4 все поля объекта имели  одинаковую область видимости(public) и задавались так: "var $amount".
в РНР5 появились области видимости и поля объекта стали задаваться так: "public $name" или "private $surname". А вариант с "var" перекочевал из объектной модели 4 версии для обеспечения обратной совместимости(так же как и возможность объявления конструктора в виде функции с именем класса, хотя уже появилась магическая функция __contrsuct)
Цитата(Enjoy @  8.6.2007,  17:48 Найти цитируемый пост)
private $Script = new cScript();

как именно не работает? ругается или ты не можешь за пределами класса получить значение этого поля(область видимости private - на всякий случай обращаю внимание)?
быть может, инициализировать поля при объявлении можно только константными значениями, а обращение к конструктору, как-никак, это вызов функции. Не встречал я в С++ такого:
Код

class Some {
 int b= -21;
 int a= abs(b);
}

Если причина в невозможности инициализировать поля функциями, то запизни эту инициализацию в конструктор(так сразу "по-правильному" и надо было сделать - для того конструкторы и существуют).
И заведи себе какой-нить мануал + учебник.
Лучший мануал - php.net
Если не дружишь с английским, то есть русское зеркало, только оно медленнее отзывается на обновление "старшего брата" - php.ru

Спасибо за ответ, я имел ввиду вот это:
Код

class cDatabase {
}

class cServer {
 cDatabase database;
}


Если я делаю так:
Код

    class cMain
    {
        public function __construct()
        {
            $this -> $Script = new cScript(); //Line 11
        }

        private $Script;
    }

то меня матерят так: Fatal error: Cannot access empty property in ... on line 11

Если так:
Код

class cMain
    {
        private $Script = new cScript(); //Line 51
    }

то меня матерят вот так: Parse error: parse error, unexpected T_NEW in ... on line 51

Help please.

Добавлено через 2 минуты и 37 секунд
Цитата(Rock @ 8.6.2007,  19:42)
По всей видимости Вы используете PHP5.
var - это пережиток от  PHP4 и более ранних версий, в PHP5 он сохранен для совместимости, эквивалентен public

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

Вы можете сделать так:

Код

class cScript
{    
}
class cMain
{    
        private $Script = null;
        public function __construct() {
              $this->Script = new cScript();
        }
}

Похоже заработало, спасибо!
PM MAIL   Вверх
skyboy
Дата 11.6.2007, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(Enjoy @  9.6.2007,  08:35 Найти цитируемый пост)
Fatal error: Cannot access empty property in ... on line 11

естественно. т.к. в твоем коде свойство объявляется позже конструктора, то в конструкторе об этом поле ничего ещё неизвестно. интепретатору не лениво сразу же при попытке доступа создать такое поле, но такое не делается, т.к. ты просто мог очепятаться при наборе названия поля. оттого - ошибка.
потому надо сначала объявлять поле, а потом уже получать доступ к нему. как и указал уже Rock, просто я посчитал необходимым ещё и пояснить: что и зачем.
примечание: инициализировать при помощи null, в приниципе, не обязательно. хотя может сильно выручить при необходимости отделения неинициализированных полей от инициализированных.
И ещё: необязательно в ответе цитировать пост полностью. smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0819 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.