2010-04-15 7 views
3

Ce code ne fonctionne pas comme prévu:Comportement de clonage - impossible de définir une valeur d'attribut pour le clonage?

// $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(); 

La classe WMSInput:

abstract class WMSInput { 
    private $inputName; 

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

Il n'y a pas d'erreurs PHP (rapports d'erreur est réglé sur E_ALL).

Résultats réels

email 
email 

Résultats attendus

email 
name 

Toutes les idées?

Répondre

2

Sur mon site de test, cela a fonctionné correctement.

Vous n'avez pas copié la méthode getInputName dans votre exemple. Je commencerais à chercher là-dedans. Peut-être que vous ne retournez pas la variable désirée?

Mon code de test a été:

<?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(); 

Sortie:

emailname 

qui est correct.

0

écho debug un peu :)

  1. dans le jeu InputName écho à la inputName $ avant la assign
  2. dans le jeu InputName écho le $ this-> inputName avant la assign
  3. dans le jeu InputName écho à la $ this-> inputName après l'affectation

également essayer de définir la propriété inputName à protéger, si vous avez cette classe comme abstraite, alors dans les classes parentes vous n'auriez pas accès à cette meth od

+0

Mais il utilise des méthodes publiques (accesseurs) pour obtenir/définir cette propriété. C'est correct. –

+0

J'ai ajouté beaucoup d'instructions d'écho pour le débogage. Lorsque vous utilisez la méthode 'setInputName', la variable' inputName' est correctement définie. La valeur revient immédiatement après avoir quitté la méthode. Déroutant. –