Pagina 1 di 1

[Risolto][PHP] Problema astrazione classe

Inviato: martedì 24 maggio 2016, 8:46
da TommyB1992
Classe astratta base:

Codice: Seleziona tutto

<?php
namespace cache;

abstract class CacheEngine {
	abstract public isCached($key);
	abstract public store($key, $data, $expiration = 0);
	abstract public erase($key);
	abstract public load($key);
}
Classe figlia base:

Codice: Seleziona tutto

<?php
namespace cache;

class CacheFile extends CacheBuilder interface ICacheFile {
	
	public function store($key, $data, $expiration = 0) {
		
		
	}
	
	public function buildFileName($cacheFile) {
		
		
	}
	
	// ...
}
Ora vorrei estendere la classe figlia CacheFile per vari argomenti, esempio: file linguistici che provengono dal filesystem, configurazioni e dati generali che provengono dal database e boh qualsiasi cosa che mi venga in mente.

Quindi:

Codice: Seleziona tutto

class CacheFileLang extends CacheFile {}
class CacheFileDB extends CacheFile {}
class CacheFileTPL extends CacheFile {}
Con il punto che: non voglio inizializzare le classi nipote (CacheFileLang, CacheFileDB, CacheFileTPL) ma voglio comunque utilizzare le loro configurazioni (tipo che ne so la path per le lingue sarà una e per il database sarà un'analtra e per i template un'altra ancora. Voglio essere costretto solo a definire la classe padre CacheFile .

Soluzioni? Grazie

Re: [PHP] Problema astrazione classe

Inviato: martedì 24 maggio 2016, 8:53
da SuperStep
puoi utilizzare membri e metodi statici per farlo

Re: [PHP] Problema astrazione classe

Inviato: martedì 24 maggio 2016, 9:13
da TommyB1992
Tipo?

Codice: Seleziona tutto

CacheFileLang::setPath('/cache/languages/');
CacheFileDB::setPath('/cache/db/');

$cache = new CacheFile();
Non avrebbe molto senso, poi le classi figlie non sarebbero più di alcuna utilità.

Io voglio inizializzarle senza inzializzarle, ma inizializzando solo la classe padre.

Se clono la classe?

Re: [PHP] Problema astrazione classe

Inviato: martedì 24 maggio 2016, 9:25
da SuperStep
non e' ben chiara la richiesta, ma se intendi che, alcuni attribbuti debbano essere gia' presenti, basta metterli all'interno; esempio:

Codice: Seleziona tutto

step@Cris:~$ php -a
Interactive mode enabled

php > class A { public $x = 1; }
php > class B extends A {};
php > $b = new B();
php > echo $b->x;
1
e' la normale ereditarieta' degli attributi.

se poi vuoi fare ancora meglio, allora crei una cosa di questo tipo:

Codice: Seleziona tutto

php > interface hasPath {
php { public function getPath();
php { }
php > class A implements hasPath {
php { public function getPath(){ return '/some/A'; }
php { }
php > class B implements hasPath {
php { public function getPath(){ return '/some/B'; }
php { }
php > $a = new A();
php > $b = new B();
php > echo $a->getPath();
/some/A
php > echo $b->getPath();
/some/B

Re: [PHP] Problema astrazione classe

Inviato: martedì 24 maggio 2016, 9:42
da TommyB1992
Provo a spiegarmi meglio:

Io voglio accedere alle classi figlie dalla classe padre utilizzando i metodi settati nella classe figlia.
p.s. io teoricamente non so quali sono le classi figlie.

esempio:
$cache = new CacheFile();
$cache->CacheFileLang->store($arrayLingua); // nella classe CacheFileLang è definita la $cache_path = '/cache/language/'
$cache->CacheFileDB->store($arrayFetchSQL); // nella classe CacheFileLang è definita la $cache_path = '/cache/db/'

però il metodo store è presente solo nella classe padre, che ovviamente la classe figlia erediterà.
Questo mi permette di aggiungere infinite classi per dati di store differenti e volendo anche cambiare totalmente l'architettura un domani (tipo fare lo store nel database):
$cache->CacheSQLDB->store($arrayFetchSQL);

senza modificare una riga di codice se non quella che inizializza la classe la prima volta.

// Edit:

Ipotizzo che posso utilizzare __call, ma non mi faceva impazzire come idea, volevo trovare una soluzione differente, altrimenti mi metto l'anima in pace e faccio:

Codice: Seleziona tutto

	public function __call($name, $arguments = '') {
		return new $name($arguments);
	}
// Edit 2:

Ok ho risolto così:

Codice: Seleziona tutto

<?php
namespace cache;

class CacheFile extends CacheBuilder implements ICacheFile {
	
	static private $classes = [];
	
	public function store($key, $data, $expiration = 0) {
		
		
	}
	
	public function buildFileName($cacheFile) {
		
		
	}
	
	public function __call($name, $arguments = '') {
		return self::$classes[$name]?: (self::$classes[$name] = new $name($arguments));
	}
	
	// ...
}
Anche se call non mi fa impazzire, così se mai vorrò cambiare metodo di caching dovrò modificare solo una righa di codice in futuro con la nuova classe aggiunta.

Re: [PHP] Risolto - Problema astrazione classe

Inviato: martedì 24 maggio 2016, 10:13
da SuperStep
invece cosi'?

Codice: Seleziona tutto

interface Talk {
	public function talk();
}

abstract class Something implements Talk {
	public function saySomething() { return 'I have to say something: ' . $this->talk(); }
}

class HelloWorld extends Something {
	public function talk(){ return 'Hello World'; }
}

$a = new HelloWorld();
echo $a->saySomething();
output

Codice: Seleziona tutto

I have to say something: Hello World
1) Chiami il metodo talk dal padre implementato dal figlio senza sapere quale sia il risultato
2) Non Puoi instanziare il padre in quanto alcune cose non sono definite (come il metodo talk nel figlio)
3) devi per forza specializzare il comportamento astratto in modo da ottenere una specializzazione di quello che vuoi
4) puoi riutilizzare i comportamenti del padre modificando solo la specializzazione del figlio.

[edit]

ad esempio, nel tuo caso, puoi creare un interfaccia dove inserisci i metodi che vanno a restituire il path, alcune configurazioni, ...
mentre lasci inalterato il padre in quanto una cache funziona quasi sempre allo stesso modo.

Re: [PHP] Risolto - Problema astrazione classe

Inviato: martedì 24 maggio 2016, 10:19
da SuperStep
Attenzione: Il titolo del post deve essere:
[Risolto][PHP] Problema astrazione classe

e non come hai messo tu.

Re: [Risolto][PHP]- Problema astrazione classe

Inviato: martedì 24 maggio 2016, 11:23
da TommyB1992
Più tardi provo ad astarre la classe come dici tu, anche se ad essere onesto non mi convince molto. Se trovo difficoltà o non sono convinto riscrivo sul post.

Grazie di tutto.