Поведение клона - не может установить значение атрибута для клона? - PullRequest
3 голосов
/ 15 апреля 2010

Этот код не работает должным образом:

// $field contains the name of a subclass of WMSInput.
$fieldClone = clone $field;

echo $fieldClone->getInputName();

// Method on abstract WMSInput superclass.
$fieldClone->setInputName( 'name' );

echo $fieldClone->getInputName();

Класс WMSInput:

abstract class WMSInput {
  private $inputName;

  public function setInputName( $inputName ) {
    $this->inputName = $inputName;
  }
}

Нет ошибок PHP (для сообщения об ошибках установлено значение E_ALL).

Фактические результаты

email
email

Ожидаемые результаты

email
name

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2010

На моем тестовом сайте все работало нормально.

В вашем примере вы не скопировали метод getInputName. Я бы начал искать там. Может быть, вы возвращаете не нужную переменную?

Мой тестовый код был:

<?php

abstract class WMSInput {
  private $inputName;

  public function setInputName( $inputName ) {
    $this->inputName = $inputName;
  }

  public function getInputName() {
    return $this->inputName;
  }
}

class Test extends WMSInput {
}

$field = new Test();

$field->setInputName('email');

// $field contains the name of a subclass of WMSInput.
$fieldClone = clone $field;

echo $fieldClone->getInputName();

// Method on abstract WMSInput superclass.
$fieldClone->setInputName( 'name' );

echo $fieldClone->getInputName();

Выход:

emailname

что правильно.

0 голосов
/ 15 апреля 2010

эхо немного отлаживает :)

  1. в наборе InputName повторяет $ inputName перед присваиванием
  2. в наборе InputName повторяет $ this-> inputName перед назначением
  3. в наборе InputName повторяет $ this-> inputName после назначения

также попробуйте установить для свойства inputName значение protected: если у вас этот класс абстрактный, то в родительских классах у вас не будет доступа к этому методу

...