PDA

View Full Version : [PHP] Dubbio su costruttore, posso invocare metodi dentro al costruttore? Come?


e-commerce84
06-11-2009, 23:04
Ciao,
questo è il mio primo esperimento di realizzazione in PHP OO (ed anche il primo in PHP in generale) quindi abbiate clemenza...

Ho qualche dubbio su come realizzare il mio costruttore.

Praticamente si tratta di una classe che implementa una struttura dati HEAP per implementare l'algoritmo di ordinamento Heap Sort...ma questo non è importante.

Le variabili di istanza sono un array che implementa il mio HEAP ed una variabile heapSize che conterrà il numero di elementi inseriti in tale array.

Il costruttore deve ricevere un array arr come parametro di ingresso.
Tale array viene inizialmente copiato, con il ciclo foreach nell'array heap (nella variabile di istanza) e per ogni elemento copiato viene incrementato il valore della variabile heapSize.

Fino a qui credo sia corretto...il problema viene dopo...per far si che l'array heap sia un HEAP a tutti gli effetti deve essere trasformato in una specifica forma...tale trasformazione viene eseguita da uno specifico metodo chiamato heapify() che dato un array generico cambia l'ordine degli elementi in modo tale da rispettare le proprietà di un heap.

Il mio dubbio è: dentro al costruttore posso invocare un altro metodo oppure non posso? E se si...come devo fare?

Come potete vedere, l'array parametro viene copiato elemento per elemento nell'array che rappresenta una delle variabili di istanza...e poi su tale variabile di istanza vorrei chiamare il metodo heapify per trasformare l'array generico in un array heap

Il mio codice è questo:


<?php

/* Classe che implementa la struttura dati HEAP e la sua funzionalità per
l'ordinamento di una collezione mediante l'algoritmo di ordinamento
Heap Sort */

class Heap{

/* Variabile di istanza che implementa la struttura dati ad albero
dell'heap per mezzo di un array */
private $heap[];
private $heapSize = 0; // Numero di elementi correntemente dentro l'HEAP

/* Costruttore: Crea un nuovo oggetto istanza di Heap. Riceve un qualunque
array come parametro di input, lo copia dentro alla
variabile di istanza heap[] (mettendoli dentro l'array Heap
a partire dalla posizione 1) e su di esso richiama ilmetodo
di classe heapify per trasformarlo in loco in un heap */

public function__construct($arr[]){
private $i; // Variabile privata del metodo da usare come contatore

/* Scorre l'array ricevuto come parametro e lo copia nel'array heap
traslando gli elementi una posizione in avanti (per farli partire dalla
posizione 1 e non 0) */
foreach($arr as $chiave => $valore){
$heap[$chiave+1] = $arr[chiave]; // Copia gli elementi traslandoli
$heapSize ++; //Incrementa di 1 il numero elementi inseriti nell'heap
}

/* Invoca il metodo heapify sull'oggetto che sarà trasformato in un HEAP */

$heap = heapify($heap);
}

?>


Grazie

vhost87
07-11-2009, 07:09
Si dentro al costruttore puoi chiamare altri metodi.

$heap = heapify($heap);


Però non mi sembra un oggetto.
Da dove arriva?

Inoltre, dove è il metodo nel costruttore? :)

e-commerce84
07-11-2009, 09:25
Si dentro al costruttore puoi chiamare altri metodi.

$heap = heapify($heap);


Però non mi sembra un oggetto.
Da dove arriva?

Inoltre, dove è il metodo nel costruttore? :)

Scusa ma non capisco cosa intendi dire...

Il costruttore è il costruttore della classe heap ovvero:
public function__construct($arr[]){

heap effettivamente non è un oggetto...forse stò facendo un po' di casini con Java in cui gli array sono oggetti :mc:

Se dentro al costruttore volessi invocare il metodo heapify() per modificare l'array heap, andrebbe bene così:
$this->heap = $this->heapify($heap);
Accedo al membro heap dell'oggetto corrente e lo passo al metodo heapify per poi ricopiare il contenuto in se stesso...che ne pensi?

Se andasse bene...tale metodo heapify dovrebbe essere un normale metodo private (perchè viene richiamato solo all'interno del costruttore e non deve essere mai richiamato da chi usa la classe) oppure dovrebbe essere anche static?

Grazie

vhost87
07-11-2009, 11:03
SI puoi richiamarlo e deve essere private :)