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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PHP5, OOP: общее свойство, экземпляры и их изменение 
V
    Опции темы
Canarat
Дата 11.3.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Приветствую.
Код

<?php
class Class1
{
   function __construct()
   {
      $this->Req = new Class2 ;
      $this->Typo = new Class3 ;
      $this->Typo->cl = & $this ;
   }
}
class Class2
{
   protected $counter = 0 ;
   function change()
   {
      $this->counter += 1 ;
   }
}
class Class3
{
   function change()
   {
      $this->cl->Req->change() ;
   }
}
$cl = new Class1 ;
echo var_dump($cl->Req) ;
$cl->Req->change() ;
echo var_dump($cl->Req) ;
$cl->Req->change() ;
echo var_dump($cl->Req) ;
$cl->Typo->change() ;
echo var_dump($cl->Req) ;
$cl->Typo->change() ;
echo var_dump($cl->Req) ;
$cl->Typo->change() ;
?>

Выдает следующий результат:
Код

object(Class2)[7]
  protected 'counter' => int 0

object(Class2)[7]
  protected 'counter' => int 1

object(Class2)[7]
  protected 'counter' => int 2

object(Class2)[7]
  protected 'counter' => int 2

object(Class2)[7]
  protected 'counter' => int 2


Т.е. в последних трех вызовах не происходит никаких изменений. Мне кажется такое поведение нелогично, если я ошибаюсь - можно ли это как-то объяснить или нужно задействовать другой способ вызова?

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


Эксперт
***


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

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



Какая версия php?
У меня на 5.2.1 ожидаемое поведение (от 1 до 4)


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Vaulter
Дата 11.3.2008, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата


object(Class2)#2 (1) {
  ["counter:protected"]=>
  int(0)
}
object(Class2)#2 (1) {
  ["counter:protected"]=>
  int(1)
}
object(Class2)#2 (1) {
  ["counter:protected"]=>
  int(2)
}
object(Class2)#2 (1) {
  ["counter:protected"]=>
  int(3)
}
object(Class2)#2 (1) {
  ["counter:protected"]=>
  int(4)
}
vaulter@vaulter-desktop:~$ php -v
PHP 5.2.3-1ubuntu6 (cli) (built: Oct  4 2007 23:35:54)
Copyright © 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright © 1998-2007 Zend Technologies




--------------------
PM MAIL WWW ICQ   Вверх
Canarat
Дата 11.3.2008, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



PHP 5.1.6, на серверах такая же. Что мне с ней поделать?
PM MAIL   Вверх
vasac
Дата 11.3.2008, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

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



А class3 тут причем?
PM WWW   Вверх
SelenIT
Дата 12.3.2008, 01:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



У меня (5.2.1 под WinXP) результат такой же, как у Vaulterа. Но вообще само обращение к $this->cl без объявления этой самой public $cl выглядит странно и непривычно...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
N0dwis
Дата 12.3.2008, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



 smile 
А можно узнать в чем суть таких телодвижений? Чисто академический интерес?
PM MAIL   Вверх
Canarat
Дата 12.3.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



N0dwis, в какой-то мере да, я в поисках оптимальной структуры взаимодействия не классов, а объектов.
SelenIT, объявление не помогает, поведение аналогично, хотя выглядит все более прозрачно.
vasac, я просто показал, что в системе из трех объектов, два из которых связаны с первым, но не связаны друг с другом, третий обьект не может изменить второй через жесткую ссылку на первый.

Я прошу тех, у кого 5.2, проверить результаты на 5.1.х, чтобы мои опасения подтвердились.
PM MAIL   Вверх
N0dwis
Дата 12.3.2008, 15:46 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Проверил у себя на 5.2.4 - тоже работает нормально.
Но по-моему ты все таки ерундой занимаешься. Все ООП создавалось для того, чтобы отделить разные сущности друг от друга. Инкапсуляция! А ты пытаешься сделать наоборот.
PM MAIL   Вверх
solenko
Дата 12.3.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



N0dwis, ерундой-не не важно. Скрипт ведет себя неожиданным образом, это недокументировано, а значит это либо баг либо фича о которой полезно знать. Если бы никто не занимался фигней, то до сих пор сидели бы мы с php3

Добавлено через 5 минут и 24 секунды
Код

php test.php 0-246 ~]$
object(Class2)#2 (1) {
  ["counter:protected"]=>
  int(0)
}
object(Class2)#2 (1) {
  ["counter:protected"]=>
  int(1)
}
object(Class2)#2 (1) {
  ["counter:protected"]=>
  int(2)
}
object(Class2)#2 (1) {
  ["counter:protected"]=>
  int(3)
}
object(Class2)#2 (1) {
  ["counter:protected"]=>
  int(4)
}
php -ver@leto0-246 ~]$
PHP 5.2.0 (cli) (built: Apr 11 2007 02:16:27)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2006 Zend Technologies




--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
solenko
Дата 12.3.2008, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Вобщем не знаю как это у вас получилось -- у меня так не получается
Код

[]$ php < bug.php
object(Class2)#2 (1) {
  ["counter:protected"]=>
  int(0)
}
object(Class2)#2 (1) {
  ["counter:protected"]=>
  int(1)
}
object(Class2)#2 (1) {
  ["counter:protected"]=>
  int(2)
}
object(Class2)#2 (1) {
  ["counter:protected"]=>
  int(3)
}
object(Class2)#2 (1) {
  ["counter:protected"]=>
  int(4)
}
[]$ php -v
PHP 5.1.6 (cli) (built: Sep 25 2006 09:11:22)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Canarat
Дата 12.3.2008, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



solenko
Может суть в том, что у меня не cli версия?

Именно недокументированное поведение меня и смущает, т.к. после этого инцидента я пересматривать буду структуру в соответствии с теорией дзен-буддизма и философией постулатов ООП.

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


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



Цитата(N0dwis @  12.3.2008,  15:46 Найти цитируемый пост)
Все ООП создавалось для того, чтобы отделить разные сущности друг от друга. Инкапсуляция! А ты пытаешься сделать наоборот. 

Имхо, все нормально - такая композиция объектов, при которой объект-часть знает, чей он (вроде свойства form у элемента формы в JS), имеет право на жизнь и во многих случаях оправдана.

Canarat, а каких-нибудь Zend Accelerator'ов и т.п. у тебя часом не стоит? Особенно старых версий, заточенных еще под ZE1?


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Canarat
Дата 12.3.2008, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



SelenIT, никаких надстроек и нестандартных библиотек. Есть xDebug, но это из другой оперы.
PM MAIL   Вверх
N0dwis
Дата 16.3.2008, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Еще раз посмотрел внимательно код, смутила одна строчка,
Код

      $this->Typo->cl = & $this ;

Насколько я знаю, в php5 операция & практически бессмысленна (уточните, если я ошибаюсь), все объекты и так передаются через указатели. Если подходить формально, то ты присваиваешь переменной $cl значение адреса переменной $this, но никак не значение адреса объекта. Попробуй так, вдруг получится:
Код

      $this->Typo->cl = $this ;

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.1170 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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