[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Классы без Наследования
anonymouse
Всем привет - 100 лет 100 зим. Всех с прошедшими праздниками !!!

В новый год с новыми проблемами =)

И так.

У меня есть 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() точно есть? ...

Спустя 8 минут, 37 секунд (12.01.2010 - 19:41) anonymouse написал(а):
Да точно вот код.
П.С. я только класс 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()

Спустя 44 секунды (12.01.2010 - 19:44) krasilich написал(а):
Попробуй Forum сделать методом Content а не свойством, который будет возвращать обьект класса Forum

Спустя 2 минуты, 1 секунда (12.01.2010 - 19:46) anonymouse написал(а):
VolCh
Ну конечно на 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 минута, 7 секунд (12.01.2010 - 19:56) jetistyum написал(а):
Ты мог бы сделать один листинг ... в нем по минимуму описать классы (только необходимые функции... и показать где что не работает .

а то у тебя global $Forum .. а где она инициализируется - непонятно...

пожалуйста все еще раз в едином листинге.. сначал объявление классов, потом инициализация объектов которые не работают.


Спустя 4 минуты, 35 секунд (12.01.2010 - 20:00) jetistyum написал(а):
ага, просмотрел где 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 не инициализируется

Спустя 3 минуты, 23 секунды (12.01.2010 - 20:06) anonymouse написал(а):
jetistyum Ты не прав - все работает и код валиден.





Класс 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()???

Спустя 19 минут, 33 секунды (12.01.2010 - 20:44) krasilich написал(а):
Кстати, справедливое замечание! jetistyum
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, а раньше конструктором был метод с именем класса (впрочем это действительно и сейчас)

Class Content
{
function content()
{
// ЭТО КОНСТРУКТОР!!!!!!!
}
}


Вот поэтому у тебя в качестве конструктора выполняеться метод content()

Так что либо меняй имя класса либо имя метода.

Спустя 18 минут, 7 секунд (12.01.2010 - 21:21) glock18 написал(а):
content не может ничего переопределить. пых выдаст обычную ошибку парсинга в этом случае. что здесь - либо игнорирование/подавление ошибки, либо версия ниже 5й.

по вопросу.
к $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
сначала обьект инициализируется как свойство объекта Content,
$this->Forum = new Forum;

потом
global $Forum;
... глобальную переменную кто-то инициализировал????

потом обращение к статическому методу класса

Forum::content($lang);

Спустя 1 час, 14 секунд (12.01.2010 - 22:37) glock18 написал(а):
jetistyum
сам недавно, так получилось, по невнимательности написал метод search у класса Search. возможно, все дело еще и версии 5ого пыха, но у меня был еррор. самый что ни на есть говорящий.

Спустя 12 минут, 13 секунд (12.01.2010 - 22:49) krasilich написал(а):
glock18
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, а раньше конструктором был метод с именем класса (впрочем это действительно и сейчас)

Class Content
{
function content()
{
// ЭТО КОНСТРУКТОР!!!!!!!
}
}


Вот поэтому у тебя в качестве конструктора выполняеться метод content()

Так что либо меняй имя класса либо имя метода.

Ок - но конструктор то сробатывает сам автоматом- тобишь мне же не надо его запускать ?

У меня пых 5-ый.
Просто я не могу понять где вы видите что бы у меня выполнялся метод контент ?
Метод контент от класса Контент выполняется только тогда когда я его запускаю.

Так же и все остальные.

Я же говорю ша все работает просто я хотел чтобы я не обращался к классу Форум статически а 1 рас определил его и всегда вызывал. уже из класса Контент.

Тобишь.
Создать в Контенте переменную класса Форум и вызывать из любого метода Контента любой метод класса Форум без проблем.
ВО!

Спустя 11 минут, 10 секунд (12.01.2010 - 23:49) krasilich написал(а):
Ты разберись вызываеться ли у тебя конструктор вообще, и если да, то какой из тех двоих которые у тебя описаны в классе, если content() то понятно что с класом Forum ничего не получиться. Если __construct() то тогда будем думать дальше.

Вот только что проверил код подобный твоему (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
Спс за код - он мне то и надаумил... хотя че я так тормозил.. может спать нужно больше!

Спустя 7 часов, 6 минут, 50 секунд (14.01.2010 - 12:53) jetistyum написал(а):
Бывает! smile.gif рад помочь!:)


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.