Esiste una libreria PHP di classi (generate da un WSDL) che non possono essere modificate. Questi sembrano il sotto per semplicità.
class System extends \SoapClient
{
public function __construct(array $options = array(), $wsdl = 'http://example.com/system?wsdl')
{
// Do configuration and include required classes.
parent::__construct($wsdl, $options);
}
}
class Report extends \SoapClient
{
public function __construct(array $options = array(), $wsdl = 'http://example.com/report?wsdl')
{
// Do configuration and include required classes.
parent::__construct($wsdl, $options);
}
}
Il codice personalizzato deve eseguire alcune configurazioni (ad esempio l'impostazione di alcune intestazioni SOAP e la versione SOAP) ogni volta che è richiesto un oggetto System o Report. L'implementazione attuale è la seguente.
class mySystem extends System
{
public function __construct($wsdl, $configuration) {
$options = array(
'soap_version' => SOAP_1_2,
);
// Do more stuff here.
parent::__construct($options, $wsdl);
}
}
class myReport extends mySystem
{
public function __construct($wsdl, $configuration) {
parent::__construct($options, $wsdl);
}
}
Quanto sopra funziona, ma il mio IDE mi sta urlando ogni volta che faccio qualcosa su myReport
(non riesco a trovare il metodo, ecc.) e penso che funzioni solo perché a PHP non interessa molto il tipo e tutti i metodi attuali vengono passati al metodo SoapClient->__doRequest()
. Qualsiasi pensiero eccessivo, più concreto, sul perché questo sia male, è il benvenuto.
Voglio refactoring questo per un design migliore. La prima cosa è che mySystem
estende correttamente System
ma myReport
dovrebbe estendere anche Report
. Ciò significa che il codice costruttore deve essere duplicato in mySystem
e myReport
. C'è un modo per aggirare questo?
I miei pensieri finora:
- Hanno una caratteristica di "setup" che sia
mySystem
chemyReport
usano e chiamano il metodo appropriato "setup" nei loro costruttori. Il blocco principale qui è la versione di PHP su alcuni sistemi è 5.3 sebbene ci siano piani per aggiornarli. - Avere un metodo factory in grado di istanziare le classi richieste. Non sicuro al 100% di come sarebbe questo.