Последовательное разыменование одним оператором...

whirlwind

TDD infected, paranoid
Последовательное разыменование одним оператором...

PHP:
class C{
	public $value;

	function set($v){
		$this->value = $v;
	}

}

class A{
	public $hash;

	function A(){
		$this->hash = array("attr1"=>new C,"attr2"=>new C);
		$this->hash["attr1"]->set(1);
		$this->hash["attr2"]->set(2);

	}

	function attr($id){
		return $this->hash[$id];
	}
}

$r = new A;
var_dump($r);
$r->attr("attr1")->set(50);
$r->attr("attr2")->set(100);
var_dump($r);
Почему это работает? Ведь A::attr должна возвращать копию объекта?
 

whirlwind

TDD infected, paranoid
вот это то и смущает

PHP:
$assigned  =  $instance;
$reference  =& $instance;

$instance->var = '$assigned will have this value';

$instance = null; // $instance and $reference become null

var_dump($instance);
var_dump($reference);
var_dump($assigned);
А как тогда будет выглядеть получение из attr копии? Или

$r->attr("attr1")->set(10);

не соответствует

$v = $r->attr("attr1");
$v->set(10);

?
 

whirlwind

TDD infected, paranoid
Так что, никаких идей по поводу как записать, что бы в дальнейшем не огрести гемороя, ни у кого нет?

ИМХО, вот так наиболее корректно

PHP:
function & attr($id){ 
    return $this->hash[$id]; 
}
Или нет?
 

tony2001

TeaM PHPClub
В PHP5 объекты не копируются, если их явно об этом не просят.
Что не ясно в мануале? Какое слово непонятно?
 

whirlwind

TDD infected, paranoid
tony2001 Извините что туплю, но что то не дойдет до меня, как же "их явно об этом попросить"?

PHP:
class A{ 
    public $hash; 

    function A(){ 
        $this->hash = array("attr1"=>new C,"attr2"=>new C); 
        $this->hash["attr1"]->set(1); 
        $this->hash["attr2"]->set(2); 

    } 

    function attr($id){ 
        return $this->hash[$id]; 
    }

	function attr2($id){
		$r = $this->hash[$id]; 
        return $r;
	}

	function attr3($id){
		$h = $this->hash;
		$r = $h[$id]; 
        return $r;
	}

	function attr4($id){
		$h = $this->hash;
		$v = $h[$id];
		$r = $v;
        return $r;
	}


} 

$r = new A; 
var_dump($r); 
$r->attr("attr1")->set(50); 
$r->attr("attr2")->set(100); 
var_dump($r);
$r->attr2("attr1")->set(150); 
$r->attr2("attr2")->set(2100); 
var_dump($r);
$r->attr3("attr1")->set(10); 
$r->attr3("attr2")->set(200); 
var_dump($r);
$r->attr4("attr1")->set(50); 
$r->attr4("attr2")->set(100); 
var_dump($r);
object(A)#1 (1) {
["hash"]=>
array(2) {
["attr1"]=>
object(C)#2 (1) {
["value"]=>
int(1)
}
["attr2"]=>
object(C)#3 (1) {
["value"]=>
int(2)
}
}
}
object(A)#1 (1) {
["hash"]=>
array(2) {
["attr1"]=>
object(C)#2 (1) {
["value"]=>
int(50)
}
["attr2"]=>
object(C)#3 (1) {
["value"]=>
int(100)
}
}
}
object(A)#1 (1) {
["hash"]=>
array(2) {
["attr1"]=>
object(C)#2 (1) {
["value"]=>
int(150)
}
["attr2"]=>
object(C)#3 (1) {
["value"]=>
int(2100)
}
}
}
object(A)#1 (1) {
["hash"]=>
array(2) {
["attr1"]=>
object(C)#2 (1) {
["value"]=>
int(10)
}
["attr2"]=>
object(C)#3 (1) {
["value"]=>
int(200)
}
}
}
object(A)#1 (1) {
["hash"]=>
array(2) {
["attr1"]=>
object(C)#2 (1) {
["value"]=>
int(50)
}
["attr2"]=>
object(C)#3 (1) {
["value"]=>
int(100)
}
}
}

-~{}~ 14.12.05 12:43:

PS. Только не говорите мне про clone, если объект это инстанс, а не референс.
 
Сверху