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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача объекта через конструктор 
:(
    Опции темы
S.A.P.
Дата 5.4.2005, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



САБЖ. Как такое осуществить? Поясню:

Код

# есть некий нестатический класс:
class Class1
{
    functon metod()
    {
        return 0;
    }
}

# создается объект этого класса
$obj1 = new Class1;


надо иметь возможность передать этот объект (вернее ссылку на него) в другой класс

Код

# делаю так
class Class2
{
    var $obj1;
    function __construct( $obj1 )
   {
        $this->obj1 = $obj1;
    }
    function callMetod()
    {
        return $obj1->metod();
    }
}

$obj1 = new Class1;
$obj2 = new Class2( $obj1 );


При попытке вызова метода из этого вложенного obj1 пишет,
Цитата
Fatal error: Call to a member function on a non-object in


Знаю, что в PHP 5 можно сразу задать тип аргумента
Код

function __construct( Class1 $obj1 )


но нужна совместимость с PHP 4. А как это сделать?



PM MAIL   Вверх
Mal Hack
Дата 5.4.2005, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Попробуй & поставить либо в
Код
$obj2 = new Class2( $obj1 );

либо
Код
function __construct( $obj1 )


Цитата(Perchilla @ 5.4.2005, 10:18)
но нужна совместимость с PHP 4. А как это сделать?

А как ты хочешь добится совсестимости при использовыании __construct.

ЗЫ: А что мешает сделать global $obg1; ?
PM ICQ   Вверх
S.A.P.
Дата 5.4.2005, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Mal @ 5.4.2005, 12:12)
А как ты хочешь добится совсестимости при использовыании __construct.

понял, это я тупанул smile . Сделал конструктор по стараму. Теперь пишет
Цитата
Object to string conversion in

Код

class Class2
{
    var $obj1;
    function Class2( $obj1 )
    {
        $this->obj1 = $obj1; // <<<----- вот в этом месте.
    }
    function callMetod()
    {
        return $obj1->metod();
    }
}
$obj1 = new Class1;
$obj2 = new Class2( $obj1 );


Цитата(Mal @ 5.4.2005, 12:12)
Попробуй & поставить либо в
пробовал по всякому, даже так
Код

$this->obj1 =& $obj1;


Цитата(Mal @ 5.4.2005, 12:12)
А что мешает сделать global $obg1; ?
Просто тут может быть несколько объектов класса Class1 и несколько Class2 и все они между собой соединяются. На C++ я придерживался именно такого стиля, потому что так наиболее универсально и логично. Надеюсь в PHP не придется отходить от привычек.

Может какие - нибудь указатели тут есть, или ссылки на объект?

Это сообщение отредактировал(а) Perchilla - 5.4.2005, 15:35
PM MAIL   Вверх
Mal Hack
Дата 5.4.2005, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Судя по всему придется по втором объекте делать массив объектов, куда загонять все жкземпляры Class1...
Гы ^)


Цитата(Perchilla @ 5.4.2005, 16:34)
$this->obj1 = $obj1; // <<<----- вот в этом месте.

нафиг $this, ты же его параметром передаешь smile
Код
<?php

class one
 {
  var $t;
  function one()
   {

   $this -> t = mt_rand( 0 , 10000 );
   }
 }

class two
 {
  var $t = "1";

  function two( $Obj )
   {
    print $Obj -> t;
   }

 }

 $ob1 = & new one();
 $ob2 = & new one();
 $ob3 = & new one();
 $ob4 = & new one();
 $ob5 = & new one();

 $ob10 = & new two( $ob2 );


?>

PM ICQ   Вверх
S.A.P.
Дата 5.4.2005, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Mal @ 5.4.2005, 16:16)
нафиг $this, ты же его параметром передаешь
так я же его в классе сохраняю, чтобы позже им воспользоваться smile
Код

    var $obj1; // <<<----- вот здеся 
    function Class2( $obj1 )
    {
        $this->obj1 = $obj1;
    }


Че то я не пойму. А это что такое???
Цитата(Mal @ 5.4.2005, 16:16)
$ob10 = & new two( $ob2 );

Если эту крякозяблу поставить, то будет работать чтоли smile .

Цитата(Mal @ 5.4.2005, 16:16)
Судя по всему придется по втором объекте делать массив объектов, куда загонять все жкземпляры Class1...
smile

Это сообщение отредактировал(а) Perchilla - 5.4.2005, 16:40
PM MAIL   Вверх
Mal Hack
Дата 5.4.2005, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Цитата(Perchilla @ 5.4.2005, 17:35)
так я же его в классе сохраняю, чтобы позже им воспользоваться smile

Код
<?php
class one
 {
  var $obj;
  var $t;
  function one()
   {
   $this -> t = mt_rand( 0 , 10000 );
   }
 }
class two
 {
  var $t = "1";
  function two( $Obj )
   {
    $this -> Obj = $Obj;
    print $this -> Obj -> t;
   }
 }
 $ob2 = & new one();
 $ob10 = & new two( $ob2 );
?>


Цитата(Perchilla @ 5.4.2005, 17:35)
Если эту крякозяблу поставить, то будет работать чтоли


Эта кракозяра ставится для того чтобы объект в PHp4 два раза не создавался (без копии имеется ввиду).
PM ICQ   Вверх
S.A.P.
Дата 5.4.2005, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Что то не работает smile .
Цитата
Object to string conversion in

PM MAIL   Вверх
Axxent
Дата 5.4.2005, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код Mal hack`а работает. Проверял на РНР4. Правда, я его слегка модифицировал:
Код

<?php
class one
 {
  var $obj;
  var $t;
  function one()
   {
   srand(time());
   $this -> t = rand( 0 , 10000 );
    // Не знаю в чем здесь дело, mt_rand давал одинаковое число
   }
 }
class two
 {
  var $t = "1";
  function two( $Obj )
   {
    $this -> Obj = $Obj;
    print $this -> Obj -> t;
   }
 }
 $ob2 = new one();
 $ob10 = new two( &$ob2 );
?>

PM MAIL ICQ   Вверх
Mal Hack
Дата 5.4.2005, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Perchilla
на 5 тестируешь?

Цитата(Mal @ 5.4.2005, 18:16)
$this -> Obj = $Obj;

Прибуй так:
$this -> Obj = (object) $Obj;
на крайняк:
$this -> Obj = (object) $this -> Obj;
$this -> Obj = (object) $Obj;
(вместе)
PM ICQ   Вверх
S.A.P.
Дата 5.4.2005, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Все, разобрался. Это я тупил всю дорогу: вызывал метод
Цитата(Perchilla @ 5.4.2005, 09:18)
$obj1->metod();
вместо
Цитата
$this->obj1->metod();
Хоть бы классы как в C++ сделали smile

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

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


 




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


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

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