2016-11-20 5 views
0

У меня есть следующий фрагмент кода (например, для задачи):PHP массив преобразования класса ребенок с sha1

class A { 
public $x; 
public $y; 
public function __construct($x, $y) { 
    $this->x = sha1($x); 
    $this->y = $y; 
} 
public function __clone() { 
    return new A($this->x, $this->y); 
} 
} 

class B extends A { 

public $z; 
public function __construct($z, $parent_obj) { 
    $this->z = $z; 
    parent::__construct($parent_obj->x, $parent_obj->y); 
} 
public function doSomeThing() { 
    $parent_a_array = (array) parent::__clone(); 
    $child_a_array = array_diff_assoc((array) $this, $parent_a_array); 
    echo "Parent Array Printing :<br/>"; 
    foreach ($parent_a_array as $key => $value) { 
     echo "Key: $key; Value: $value\n".'<br/>'; 
    } 
    echo "Child Array Printing: <br/>"; 
    foreach ($child_a_array as $key => $value) { 
     echo "Key: $key; Value: $value\n".'<br/>'; 
    } 


} 
} 

$t = new B('C', new A("A", "B")); 
$t->doSomeThing(); 

Я получаю немного странно выход, я ожидаю, чтобы иметь х, у печати только родителей , в то время как г версия для печати только на ребенка, но выход

Parent Array Printing : 
Key: x; Value: 726c6aeb8252ad589562fe2c7409d50c90a058aa 
Key: y; Value: B 
Child Array Printing: 
Key: z; Value: C 
Key: x; Value: bd605412133b28b10c5fa7a45fce29df67c18bd7 

Когда я удалить вызов функции sha1 в классе а застройщик, выход, кажется, хорошо.

Parent Array Printing : 
Key: x; Value: A 
Key: y; Value: B 
Child Array Printing: 
Key: z; Value: C 

Я буду благодарен, если кто-нибудь знает решение этой проблемы.

ответ

2

Вы хешируете x дважды, когда вы клонируете его, следовательно, x в экземпляре B имеет другое значение, чем значение в клоне его родителя (A).

$this->x = sha1($x), то в клоне у вас есть new A($this->x, $this->y), что на самом деле является new A(sha1(x), $this->y). Итак, вы закончили с этим

t = { 
    x: sha1('A'), 
    y: 'B', 
    z: 'C' 
} 
clone_of_t = { 
    x: sha1(sha1('A')), 
    y: 'B' 
} 
+1

Очень ясное объяснение, спасибо, решила мою проблему. – TOMP

+0

@TOMP вы могли бы поделиться, как вы его решили. – developer

+0

@developer Я сделал двойное шифрование также на странице, когда я проверяю это, однако вы можете удалить вызов sha1 на конструкторе и называть его только функцией клонирования, и он будет работать нормально – TOMP

 Смежные вопросы

  • Нет связанных вопросов^_^