Originariamente inviato da dogeht
AGGIUNGO QUESTO:

un commento sulla documentazione di php mi ha fatto riflettere. diceva piu' o meno "un linguaggio ha molti strumenti per farti raggiungere l'obiettivo. se non riesci a raggiungere un obiettivo con uno strumento, prova a cambiare strumento. se tenti di usare diversamente lo strumento, sei sulla strada sbagliata"

insomma: si vede che non devo usare due classi tipo. ma che posso fare allora?
per ora ho adottato questa soluzione:
1) ho creato le classi tipo
2) le istanze delle classi operative hanno delle proprietà che sono istanze delle classi tipo.

percui operativa 3 avrà due proprietà-istanza delle classi tipo1 e tipo2. ma ci sono delle complicazioni che vi lascio immaginare
Sperando di aver capito bene ho provato a implementare un approccio diverso al tuo problema.
Volevo fare un esempio semplice poi mi sono messo a leggere le funzioni di reflection e ho voluto provarle.
Il tuo esempio aveva un problema di fondo anche se ci fosse stata l'eritarieta' multipla hai chiamato due proprieta' con lo stesso nome nelle due classi tipo e come avresti gestito questa cosa nelle classi figlie di entrambi ?.

prima definisco in una clase astratta i metodi di gestione dei tipi
Codice PHP:
abstract class AbsTipo {
   private 
$numProp 0;
   private 
$listProp = array();
   
   public function 
__construct ($str) {
          
$reflect = new ReflectionClass($str);

          
$list $reflect->getProperties();
          
$this->numProp count ($list);
          foreach (
$list as $prop) {
               
$this->listProp[] = $prop->getName();
          }
   }
   public function 
issetTipo($str) {
       return isSet(
$this->$str);
   }
   public function 
getTipo($str) {
      if (
$this->isSetTipo($str)) {
          return 
$this->$str;
      }  else {
          return 
null;
      }
   }
   public function 
numTipi() {
          return 
$this->numProp;
   }
   public function 
listaTipi() {
      return 
$this->listProp;
   }

cosi estendendo questa classe posso implementare i tipi in modo molto semplice.

Codice PHP:
class tipo1 extends AbsTipo {
   public function 
__construct() {
          
parent::__construct(__CLASS__);
   }
   protected 
$prop1 'pippo';
   protected 
$prop2 10;
}

class 
tipo2 extends AbsTipo {
   public function 
__construct () {
          
parent::__construct(__CLASS__);
   }
   protected 
$prop1 'pippo2';
   protected 
$prop3 100;

A questo punto posso implementare le classi logiche gestendo i tipi
come meglio credo

Codice PHP:
interface interOper {
          public function 
evalTipi();
}

class 
operativa1 implements interOper {
      private 
$tipo null;
      public function 
__construct() {
             
$this->tipo = new tipo1();
      }
      public function 
evalTipi() {
             
$output = array();
             foreach (
$this->tipo->listaTipi() as $key)   {
                     
$output[$key] =  $this->tipo->getTipo($key);
             }
             return 
$output;
      }
}

class 
operativa2 implements interOper {
      private 
$tipi = array();
      public function 
__construct() {
             
$this->tipi[] = new tipo1();
             
$this->tipi[] = new tipo2();
      }
      public function 
evalTipi() {
             
$output = array();
             foreach (
$this->tipi as $tipo) {
                     foreach (
$tipo->listaTipi() as $key)   {
                             if (!isset(
$output[$key]))  { // da notare che posso gestire il nome di proprieta' uguali come meglio credo
                             
$output[$key] =  $tipo->getTipo($key);
                             }
                     }
             }
             return 
$output;
      }


Per finire istanzio tutto
Codice PHP:
$operativa = new operativa1();
var_dump($operativa->evalTipi());

echo 
"

\n\n"
;
$operativa = new operativa2();
var_dump($operativa->evalTipi()); 

Spero di esserti stato utile.


Andrea