Маленькая загадка от Grey_EM

Grey_EM

Guest
Маленькая загадка от Grey_EM

Здравствуйте мои дорогие. Как вы тут, не скучаете?
Ну тогда есть у меня малюсенькая загадка для умных.
Тому кто разгадает ее от меня пиво, а живу я в Питере. :)
Итак вопрос , почему имеем разные значания?
Два малюсеньких файла.
PHP:
--- CoreError.phtml -----
<?php

require_once("CoreError.inc");

print("Plain <br>");
$coreError = new CoreError();
$coreError->someMethod();

print("In Class <br>");
$coreErrorTest = new CoreErrorTest();

/*
*
* @version 0.6
*/

class CoreErrorTest
{

/*
* @return void
* @version 0.6
* @private
*/
function CoreErrorTest()
{
$coreError = new CoreError();
$coreError->someMethod();
}//end func CoreErrorTest

} //end class CoreErrorTest

?>
--- CoreError.inc -----
<?php

/*
*
* @version 0.6
*/

class CoreError
{

var $test;

/*
* @return void
* @version 0.6
* @private
*/
function CoreError()
{
$GLOBALS["coreError"] = &$this;
$this->test = 1;
print("In CoreError" . "<br>");
print('$this->test = ' . $this->test . "<br>");
print('$GLOBALS["coreError"]->test = ' . $GLOBALS["coreError"]->test . "<br>");

}//end func CoreError

/*
* @return void
* @version 0.6
* @private
*/

function someMethod()
{
$this->test = 2;
print("In someMethod" . "<br>");
print('$this->test = ' . $this->test . "<br>");
print('$GLOBALS["coreError"]->test = ' . $GLOBALS["coreError"]->test . "<br>");
}//end func someMethod() 


} //end class CoreError
?>
Мои результаты (php 4.2.1)

Plain
In CoreError
$this->test = 1
$GLOBALS["coreError"]->test = 1
In someMethod
$this->test = 2
$GLOBALS["coreError"]->test = 2
In Class
In CoreError
$this->test = 1
$GLOBALS["coreError"]->test = 1
In someMethod
$this->test = 2
$GLOBALS["coreError"]->test = 1
Повторяю вопрос , почему имеем разные значания?
 

si

Administrator
А такой вопрос: по твоему не верно работает `Plain` или `in Class` ?


P.S. По моему `Plain`

[добавленно]

По моему все в порядке :)
 

Grey_EM

Guest
Автор оригинала: si
А такой вопрос: по твоему не верно работает `Plain` или `in Class` ?


P.S. По моему `Plain`
Это смотря как считать. Лично я предполагал что работать оба должны одинаково. Но как видно я был не прав. А вот почему и есть основной вопрос.
 

si

Administrator
в основном файле:

PHP:
print("Plain <br>"); 
$coreError = new CoreError(); 
$coreError->someMethod();
замени например например на:

PHP:
print("Plain <br>"); 
$c = new CoreError(); 
$c->someMethod();

и еще
PHP:
<?
  class Foo {
    //$this;
  }


$a = new Foo();
$b = &new Foo();
?>
Так вот в $a не тот же обьект что и в $this в конструкторе, а в $b как раз тот же.

P.S понятнее обьяснить что-то не получается пока :)
 

si

Administrator
Короче говоря в первом случае

$coreError и $GLOBALS["coreError"] и $this в конструкторе указывают на один и тот же экземпляр обьекта , CoreError благодоря $GLOBALS["coreError"] = &$this;

во втором случае - разные экземпляры.
 

Grey_EM

Guest
Твое пиво. :)
Надо было в новички задачку закинуть. Глядишь и нашли бы золотую, молодую голову.
Кстати неплохо было бы подобные задачки время от времени кидать что ли. Викторина блин. :)
Кстати кто сможет толково, членораздельно объяснить общественности, так чтобы было даже новичку понятно в чем здесь была маленькая хитрость (SI уже не считаем :) ), тот также получит от меня бутылку хорошего пива. Дополнителное условие, объяснить почему такой проблемы не возникло бы в яве например.
 

Alien

Новичок
>Дополнителное условие, объяснить почему такой проблемы не возникло бы в яве например.

хЫм. Имхо за это как раз разработчиков нашего любимого PHP пинать надо.

p.s.
CoreError :D
 

Grey_EM

Guest
Автор оригинала: Альен
>Дополнителное условие, объяснить почему такой проблемы не возникло бы в яве например.

хЫм. Имхо за это как раз разработчиков нашего любимого PHP пинать надо.

p.s.
CoreError :D
:)
 

kvn

programmer
Кстати кто сможет толково, членораздельно объяснить общественности, так чтобы было даже новичку понятно в чем здесь была маленькая хитрость (SI уже не считаем ), тот также получит от меня бутылку хорошего пива. Дополнителное условие, объяснить почему такой проблемы не возникло бы в яве например.
Какое еще объяснение нужно, мануал рулит :) :
PHP Manual -> Language Reference -> Classes and Objects -> References inside the constructor

Apparently there is no difference, but in fact there is a very significant one: $bar1 and $globalref[0] are _NOT_ referenced, they are NOT the same variable. This is because "new" does not return a reference by default, instead it returns a copy.

Another final example, try to understand it.

PHP:
class A
{
   function A($i)
   {
       $this->value = $i;
       // try to figure out why we do not need a reference here
       $this->b = new B($this);
   }

   function createRef()
   {
       $this->c = new B($this);
   }

   function echoValue()
   {
       echo "<br>","class ",get_class($this),': ',$this->value;
   }
}


class B
{
   function B(&$a)
   {
       $this->a = &$a;
   }

   function echoValue()
   {
       echo "<br>","class ",get_class($this),': ',$this->a->value;
   }
}

// try to undestand why using a simple copy here would yield
// in an undesired result in the *-marked line
$a =& new A(10);
$a->createRef();

$a->echoValue();
$a->b->echoValue();
$a->c->echoValue();

$a->value = 11;

$a->echoValue();
$a->b->echoValue(); // *
$a->c->echoValue();

/*
output:
class A: 10
class B: 10
class B: 10
class A: 11
class B: 11
class B: 11
*/
 
Сверху