В новый год с новыми проблемами =)
И так.
У меня есть 3 класса.
1. Content
2. Forum
3. ForumApi
Я загружаю всегда контент и уже изходя из ситуаций загружается и Forum.
Есть конструктор в Content-е и конечно там же я определил переменную Forum
и в нем сделал так
$this->Forum = new Forum;
Но проблема что потом я не могу использавать этот класс.
Тобишь дальше есть методы класса Forum где вызов может выглядеть примерно так и сразу же и ошибку.
$this->Forum->content($lang);
#Fatal error: Call to a member function content() on a non-object in.....
Хотя я не могу понять почему он ишет в Content-e когда это класс. и вызывать нужно метод класса... или может нужно указывать как-то конкретно на адрес при инициализации ?
Просто я хотел свести к минимуму инициализации классов и т.д.
Сейчас это работает но 2-ой КОД выглядит так.
Forum::content($lang);
Кто че скажет ?
Спустя 4 минуты, 5 секунд (12.01.2010 - 19:32) jetistyum написал(а):
$this->Forum->content($lang);
у тебя вызывается точно ПОСЛЕ инициализации объекта Forum?
в классе Forum у тебя метод content() точно есть? ...
у тебя вызывается точно ПОСЛЕ инициализации объекта Forum?
в классе Forum у тебя метод content() точно есть? ...
Спустя 8 минут, 37 секунд (12.01.2010 - 19:41) anonymouse написал(а):
Да точно вот код.
П.С. я только класс Content инициализирую - 1 рас.
Потом он уже должен сам все выполнять.
Класс Content
тут есть метод content в классе Content каторый я и вызываю ( логично что уже должен быть создан класс Форум - если была выполнена задача ( А так и есть )
Ну а в Форум-е метод Контент 100 % есть.
П.С. я только класс Content инициализирую - 1 рас.
Потом он уже должен сам все выполнять.
Класс Content
Class Content {
// Content var's
var $title;
var $name_art;
var $name_prod;
var $name_gallery;
var $desc_art;
var $type;
var $def_content_lang;
var $lang;
var $show_ratio;
var $Forum;
function __construct()
{
......
$id=intval($_GET['id']);
$q=mysql_query("SELECT * FROM `dbforum_cat` WHERE id='$id' and enable='1';");
if($r=mysql_fetch_array($q)) {
$this->title=$r['name'];
$this->type="forum";
$this->Forum = new Forum;
}
}
тут есть метод content в классе Content каторый я и вызываю ( логично что уже должен быть создан класс Форум - если была выполнена задача ( А так и есть )
elseif($this->type == "forum") {
global $Forum;
Forum::content($lang);
}
Ну а в Форум-е метод Контент 100 % есть.
function content($lang) {
$id_2='';
$id_cat=@intval($_GET['id']);
if(isset($_GET['id']))
{
$qt=mysql_query("SELECT * FROM `dbforum_cat` WHERE id_p='$id_cat';");
if($rt=mysql_fetch_array($qt))
{
$id_2=$rt['id_p'];
}
} else {
}
Спустя 2 минуты, 21 секунда (12.01.2010 - 19:43) VolCh написал(а):
Когда используешь -> вызываешь метод объекта, когда :: - метод класса (статический)
А где-нить есть в коде что-то вроде $content = new Content, может конструктор не вызывается, а используешь, опять-таки, Content::run() например, а не $content->run()
А где-нить есть в коде что-то вроде $content = new Content, может конструктор не вызывается, а используешь, опять-таки, Content::run() например, а не $content->run()
Спустя 44 секунды (12.01.2010 - 19:44) krasilich написал(а):
Попробуй Forum сделать методом Content а не свойством, который будет возвращать обьект класса Forum
Спустя 2 минуты, 1 секунда (12.01.2010 - 19:46) anonymouse написал(а):
VolCh
Ну конечно на Index.php я его вызываю - иначе бы ничего не работало в данный момент все работает но не так как я хотел.
see_man
На примере кода можно ? не забывай что Форум это класс. и у него есть свой методы.
Ну конечно на Index.php я его вызываю - иначе бы ничего не работало в данный момент все работает но не так как я хотел.
see_man
На примере кода можно ? не забывай что Форум это класс. и у него есть свой методы.
Спустя 5 минут, 47 секунд (12.01.2010 - 19:52) krasilich написал(а):
class Content
{
public get_forum()
{
return new Forum;
}
}
//использование
$content = new Content;
$content->get_forum->forum_method();
Если не вызовет ошибки компиляции значит будет все ок=))
Спустя 3 минуты, 8 секунд (12.01.2010 - 19:55) anonymouse написал(а):
Ок я согласен так сработает - но мне не это нужно !!!
Я хочу просто вызвать 1 рас Класс Контент.
А дальше чтоб он все сам делал в зависимости от ситуаций.
Таким образом я должен вызывать в index.php его - а зачем мне там лишний код?
Вот я подумал сделать такой-же метод и вызвать в самом классе при конструкторе... но что получиться хз...
Я хочу просто вызвать 1 рас Класс Контент.
А дальше чтоб он все сам делал в зависимости от ситуаций.
Таким образом я должен вызывать в index.php его - а зачем мне там лишний код?
Вот я подумал сделать такой-же метод и вызвать в самом классе при конструкторе... но что получиться хз...
Спустя 1 минута, 7 секунд (12.01.2010 - 19:56) jetistyum написал(а):
Ты мог бы сделать один листинг ... в нем по минимуму описать классы (только необходимые функции... и показать где что не работает .
а то у тебя global $Forum .. а где она инициализируется - непонятно...
пожалуйста все еще раз в едином листинге.. сначал объявление классов, потом инициализация объектов которые не работают.
а то у тебя global $Forum .. а где она инициализируется - непонятно...
пожалуйста все еще раз в едином листинге.. сначал объявление классов, потом инициализация объектов которые не работают.
Спустя 4 минуты, 35 секунд (12.01.2010 - 20:00) jetistyum написал(а):
ага, просмотрел где Forum инициализируется..
ну.. тогда может быть:
в случае если запрос не вернет ничего объект Forum не будет инициализирован..
может я что-то пропустил, т.к. голова другим забита.
ну.. тогда может быть:
if($r=mysql_fetch_array($q)) {
$this->title=$r['name'];
$this->type="forum";
$this->Forum = new Forum;
}
в случае если запрос не вернет ничего объект Forum не будет инициализирован..
может я что-то пропустил, т.к. голова другим забита.
Спустя 1 минута, 23 секунды (12.01.2010 - 20:02) krasilich написал(а):
anonymouse
Цитата |
А дальше чтоб он все сам делал в зависимости от ситуаций. |
Что значит все?
Спустя 35 секунд (12.01.2010 - 20:02) jetistyum написал(а):
и еще
$q=mysql_query("SELECT * FROM `dbforum_cat` WHERE id='$id' and enable='1';");
если тип поля id - INT .. то ковычки не нужны, enable=1 тоже ..
в конце запроса точка с запятой - лишняя
скорее всего запрос невалидный, и возвращает ошибку.. и Forum не инициализируется
$q=mysql_query("SELECT * FROM `dbforum_cat` WHERE id='$id' and enable='1';");
если тип поля id - INT .. то ковычки не нужны, enable=1 тоже ..
в конце запроса точка с запятой - лишняя
скорее всего запрос невалидный, и возвращает ошибку.. и Forum не инициализируется
Спустя 3 минуты, 23 секунды (12.01.2010 - 20:06) anonymouse написал(а):
jetistyum Ты не прав - все работает и код валиден.
Класс CONTENT
Класс форум.
Я хотел в классе Content - создать класс Forum в конструкторе при необходимости и потом просто в зависимости от метода вызывать уже созданий класс. а не статично вызывать его или пере создавать.
Класс CONTENT
Class Content {
// Content var's
var $title;
var $name_art;
var $name_prod;
var $name_gallery;
var $desc_art;
var $type;
var $def_content_lang;
var $lang;
var $show_ratio;
var $Forum;
function __construct()
{
if(isset($_GET['id'])) {
$id=intval($_GET['id']);
$q=mysql_query("SELECT * FROM `dbforum_cat` WHERE id='$id' and enable='1';");
if($r=mysql_fetch_array($q)) {
$this->title=$r['name'];
$this->type="forum";
$this->Forum = new Forum;
}
}
function content($lang) {
$this->type;
if($this->type == "page")
{
$this->page($lang);
}elseif($this->type == "category")
{
$this->category($lang);
}elseif($this->type == "product")
{
$this->products($lang);
}elseif($this->type == "gallery")
{
$this->gallery($lang);
}elseif($this->type == "feedback")
{
$this->feedback($lang);
}elseif($this->type == "forum") {
global $Forum;
Forum::content($lang);
}
}
}
Класс форум.
class Forum {
//----------------------------------------------------------
//----------------------------------------------------------
//----------------------------------------------------------
//----------------------------------------------------------
function __construct() {
#add new articles
if(isset($_POST['add_article']))
{
$this->add_new_articles();
}
#add new comments
if(isset($_POST['add_comment'])) {
$this->add_new_comments();
}
#Censored Comments
if (isset ( $_GET ['censored'] )) {
$this->censoder();
}
#move articles - if you are admin
if(isset($_POST['move_art']))
{
$this->move_article();
}
#block topic
if (isset ( $_GET ['blok'] )) {
$this->block_topic();
}
#edit_articles
if(isset($_POST['edit_art'])){
$this->edit_articles();
}
#edit_comment
if(isset($_POST['edit_com']))
{
$this->edit_comment();
}
}
function content($lang) {
$id_2='';
$id_cat=@intval($_GET['id']);
if(isset($_GET['id']))
{
$qt=mysql_query("SELECT * FROM `dbforum_cat` WHERE id_p='$id_cat';");
if($rt=mysql_fetch_array($qt))
{
$id_2=$rt['id_p'];
}
} else {
}
}
Я хотел в классе Content - создать класс Forum в конструкторе при необходимости и потом просто в зависимости от метода вызывать уже созданий класс. а не статично вызывать его или пере создавать.
Спустя 18 минут, 35 секунд (12.01.2010 - 20:24) jetistyum написал(а):
да, действительно был не прав, работает запрос .. может в ранних версиях не работало ... хм..
что на счет класса Content у тебя есть ф-я __construct и ф-я content() которая раньше использовалась вместо __construct
уверен ли ты, что вызывается именно __construct() а не content()???
что на счет класса Content у тебя есть ф-я __construct и ф-я content() которая раньше использовалась вместо __construct
уверен ли ты, что вызывается именно __construct() а не content()???
Спустя 19 минут, 33 секунды (12.01.2010 - 20:44) krasilich написал(а):
Кстати, справедливое замечание! jetistyum
content() переопределяет __сonstruct()!!
content() переопределяет __сonstruct()!!
Спустя 10 минут, 19 секунд (12.01.2010 - 20:54) anonymouse написал(а):
Цитата (see_man @ 12.01.2010 - 17:44) |
Кстати, справедливое замечание! jetistyum content() переопределяет __сonstruct()!! |
Чет я не понял - в смысле "content() переопределяет __сonstruct()" ????
Если брать по шагам процесс едет так.
В Index.php
$content = new Content;
Тобишь - значит он запускает фукц._construct
А там уже выбирает что и как делать. и инициализирует все что надо!!!
Когда я вызываю уже метод $content->content($lang);
В прицепи все уже создано так как в конструкторе он должен был все проверить и создать все что надо.
И вот тут из $content->content($lang); - я хочу вызвать другой класс ( Форум ) что я уже создал - но не пере создавая его и не ссылаясь на него статически !
Кажется логично - не пойму о чем вы !?
Спустя 9 минут, 6 секунд (12.01.2010 - 21:03) krasilich написал(а):
Дело в том что в качестве конструктора __construct начали использовать только в PHP5, а раньше конструктором был метод с именем класса (впрочем это действительно и сейчас)
Вот поэтому у тебя в качестве конструктора выполняеться метод content()
Так что либо меняй имя класса либо имя метода.
Class Content
{
function content()
{
// ЭТО КОНСТРУКТОР!!!!!!!
}
}
Вот поэтому у тебя в качестве конструктора выполняеться метод content()
Так что либо меняй имя класса либо имя метода.
Спустя 18 минут, 7 секунд (12.01.2010 - 21:21) glock18 написал(а):
content не может ничего переопределить. пых выдаст обычную ошибку парсинга в этом случае. что здесь - либо игнорирование/подавление ошибки, либо версия ниже 5й.
по вопросу.
к $Forum обращаешься в одном месте как к члену класса, а вдруг как к глобальной переменной. неужели непонятно что не так?
по вопросу.
к $Forum обращаешься в одном месте как к члену класса, а вдруг как к глобальной переменной. неужели непонятно что не так?
Спустя 15 минут, 32 секунды (12.01.2010 - 21:37) jetistyum написал(а):
Цитата (glock18 @ 12.01.2010 - 21:21) |
content не может ничего переопределить. пых выдаст обычную ошибку парсинга в этом случае |
Переопределение не при чем.. просто названия методов конструктора отличались в 4 версии НО НЕ ПЕРЕОПРЕДЕЛЯЛИ друг друга.
в 5-й версии приоритет имеет __coustruct() а если его нет, то classname()
тоесть в 5-й версии все сработать должно нормально ..
а вот 4-ка не станет искать метод __construct и запустит classname() в качестве конструктора.
поставь echo там и там, и посмотри что запускается...
Цитата (glock18 @ 12.01.2010 - 21:21) |
по вопросу. к $Forum обращаешься в одном месте как к члену класса, а вдруг как к глобальной переменной. неужели непонятно что не так? |
да, тут уж точно напутал все что можно
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
сначала обьект инициализируется как свойство объекта Content,
$this->Forum = new Forum;
потом
global $Forum;... глобальную переменную кто-то инициализировал????
потом обращение к статическому методу класса
Forum::content($lang);
Спустя 1 час, 14 секунд (12.01.2010 - 22:37) glock18 написал(а):
jetistyum
сам недавно, так получилось, по невнимательности написал метод search у класса Search. возможно, все дело еще и версии 5ого пыха, но у меня был еррор. самый что ни на есть говорящий.
сам недавно, так получилось, по невнимательности написал метод search у класса Search. возможно, все дело еще и версии 5ого пыха, но у меня был еррор. самый что ни на есть говорящий.
Спустя 12 минут, 13 секунд (12.01.2010 - 22:49) krasilich написал(а):
glock18
Can not redeclare method?
Can not redeclare method?
Спустя 15 минут, 15 секунд (12.01.2010 - 23:05) glock18 написал(а):
see_man
типа того. только не метод, а конструктор. но смысл, и так понятно, этот.
типа того. только не метод, а конструктор. но смысл, и так понятно, этот.
Спустя 32 минуты, 42 секунды (12.01.2010 - 23:37) anonymouse написал(а):
Цитата (see_man @ 12.01.2010 - 18:03) |
Дело в том что в качестве конструктора __construct начали использовать только в PHP5, а раньше конструктором был метод с именем класса (впрочем это действительно и сейчас)
Вот поэтому у тебя в качестве конструктора выполняеться метод content() Так что либо меняй имя класса либо имя метода. |
Ок - но конструктор то сробатывает сам автоматом- тобишь мне же не надо его запускать ?
У меня пых 5-ый.
Просто я не могу понять где вы видите что бы у меня выполнялся метод контент ?
Метод контент от класса Контент выполняется только тогда когда я его запускаю.
Так же и все остальные.
Я же говорю ша все работает просто я хотел чтобы я не обращался к классу Форум статически а 1 рас определил его и всегда вызывал. уже из класса Контент.
Тобишь.
Создать в Контенте переменную класса Форум и вызывать из любого метода Контента любой метод класса Форум без проблем.
ВО!
Спустя 11 минут, 10 секунд (12.01.2010 - 23:49) krasilich написал(а):
Ты разберись вызываеться ли у тебя конструктор вообще, и если да, то какой из тех двоих которые у тебя описаны в классе, если content() то понятно что с класом Forum ничего не получиться. Если __construct() то тогда будем думать дальше.
Вот только что проверил код подобный твоему (c двумя конструкторами) - действительно ошибка Cannot redeclare constructor for class.... PHP 5.1
Вот только что проверил код подобный твоему (c двумя конструкторами) - действительно ошибка Cannot redeclare constructor for class.... PHP 5.1
Спустя 26 минут, 18 секунд (13.01.2010 - 00:15) anonymouse написал(а):
Да конструктор контента работает без проблем - я же в него $this->type; записываю.
Без него дальше контент не знает что запускать!
Без него дальше контент не знает что запускать!
Спустя 11 часов, 37 минут, 39 секунд (13.01.2010 - 11:52) jetistyum написал(а):
Вот тебе листинг. разберись с ним.
Выкинуто все не нужное.
Все отлично работает.
Разберись и скажи что у тебя было не так..
Выкинуто все не нужное.
Все отлично работает.
Разберись и скажи что у тебя было не так..
<?php
error_reporting(E_ALL);
Class Content {
// Content var's
var $type;
var $Forum;
function __construct()
{
echo 'constructing Content [$content->__construct();]<br/>';
$this->type="forum";
$this->Forum = new Forum;
}
function content($lang) {
echo 'Running [$content->content();] <br/>';
if($this->type == "forum") {
$this->Forum->content($lang);
}
$this->Forum->country = 'Ukraine';
echo 'Forum Lang = '.$this->Forum->lang;
echo '<br/>';
echo 'Forum Country = '.$this->Forum->country;
}
}
//Класс форум.
class Forum {
var $lang = '';
var $country = '';
function __construct() {
echo 'Constructing Forum [$forum->__construct();] <br/>';
}
function content($lang) {
echo 'Running [$forum->content();] <br/>';
$this->lang = $lang;
}
}
$content = new Content();
$content->content('ru');
Спустя 17 часов, 46 минут (14.01.2010 - 05:38) anonymouse написал(а):
Если сделать так как ты показал. Вот она ошибка
Это именно то место где я потом пытаюсь вызвать метод класса Форум-а контент.
Fatal error: Call to a member function content() on a non-object in C:\Program Files\VertrigoServ\WWW\WEBSITE\engine\class\class.content.php on line 139
Это именно то место где я потом пытаюсь вызвать метод класса Форум-а контент.
Спустя 2 минуты, 43 секунды (14.01.2010 - 05:41) anonymouse написал(а):
Хотя не могу понять почему у тебя все работает... хз... буду искать ошибку
Спустя 4 минуты, 45 секунд (14.01.2010 - 05:46) anonymouse написал(а):
Простите ребят все было правильно - просто я был не внимателен есть одна из проверак каторая исключает случай когда это первый вход в форум.. и вот в тот момент форум не сработал... простите.... что морочил мозг.
jetistyum
Спс за код - он мне то и надаумил... хотя че я так тормозил.. может спать нужно больше!
jetistyum
Спс за код - он мне то и надаумил... хотя че я так тормозил.. может спать нужно больше!
Спустя 7 часов, 6 минут, 50 секунд (14.01.2010 - 12:53) jetistyum написал(а):
Бывает!
рад помочь!:)
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
_____________