Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Dubbio su costruttore, posso invocare metodi dentro al costruttore? Come?

    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:

    codice:
    <?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
    Andrea

  2. #2

    Re: Dubbio su costruttore, posso invocare metodi dentro al costruttore? Come?

    Ti suggerisco di iniziare studiando le basi dell'OOP in PHP:

    http://www.php.net/manual/en/language.oop5.basic.php

  3. #3
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    già così potrebbe avere un senso...

    Codice PHP:
    <?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=array()){
            
    /* 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){
                
    $this->heap[$chiave+1] =$valore;    // Copia gli elementi traslandoli
                
    $this->heapSize ++;                 //Incrementa di 1 il numero elementi inseriti nell'heap
                
    }
            
            
    /* Invoca il metodo heapify sull'oggetto che sarà trasformato in un HEAP */
            
            
    $this->heap $this->heapify($heap);
            }
        
        
        private function 
    heapify($obj){
            echo 
    "heapify è stata chiamata
    "
    ;
            }
        
        }
    ?>
    se devi iniziare a programmare ad oggetti è meglio che prima ti chiarisca le idee su quello che è il concetto del 'this', comune a tutte le classi e in diversi linguaggi . Php usa il

    Codice PHP:
    $this->variabile 

    $this
    ->metodo() 
    mentre javascript
    codice:
    function ciccio(){
     this.variabile=10; 
     }
    ma entrambe hanno la stessa valenza, e cioè creare un riferimento alla classe stessa

    guarda cosa ho scritto io in alto per correggere la tua classe

    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  4. #4
    Ti ringrazio...sisi sò cosa è il this, l'ho visto in Java...vabbè...sarà stata la stanchezza di ieri sera e che è qualche mese che non programmo...

    Il mio grosso dubbio era se potevo chiamare un metodo dentro il costruttore visto che di fatto l'oggetto non è ancora costruito ed in PHP non sò come lo allochi in memoria (tieni conto che heapify poi sarà una funzione ricorsiva...)


    Comunque a quanto pare si può fare...

    Altri dubbietti...sempre relativi alle similitudine e differenze con Java (quello conosco...)

    In Java gli array sono oggetti (o sono considerati comunque come oggetti)...mi pare che anche se non sono istanze di una specifica classe Array sono considerati istanze di una sottoclasse della superclasse Object quindi su di essi possono essere richiamati su un array tutti i metodi dichiarati nella classe Object...

    In PHP invece come funziona? Mi sembra di capire che gli array quì non siano visti come oggetti e quindi ne li creo nel senso di creare un oggetto ne posso invocarci sopra dei metodi, ne posso accedere a delle variabili di istanza come la variabile lenght di Java...giusto? o mi manca qualcosa?

    Altra domanda....

    In Java se ho qualcosa del tipo (vabbè la sintassi ora è di PHP):

    private $a[] = array('bianco', 'nero', 'giallo', 'verde', 'rosso');
    private $b[] = $a;

    in Java succederebbe che facendo qualcosa del genere copierei in $b il RIFERIMENTO a $a...se poi vado a modificare $b mi si modifica di conseguenza anche $a (anche perchè anche dentro $a c'è un riferimento all'array).
    Infatti se vedete nel mio codice eseguo una COPIA HARD ovvero nel costruttore ricopio elemento per elemento il contenuto dell'array arr parametro dentro l'array heap

    In PHP invece che succede in un caso come questo? E' come in Java o viene creata automaticamente proprio una copia dell'oggetto e non ho problemi?

    Grazie
    Andrea

  5. #5
    Originariamente inviato da AndreaNobili
    In PHP invece come funziona? Mi sembra di capire che gli array quì non siano visti come oggetti
    Non sono oggetti, sono istanze del tipo array. Trovi tutto nel manuale ufficiale:

    http://www.php.net/array

    Originariamente inviato da AndreaNobili
    ne posso accedere a delle variabili di istanza come la variabile lenght di Java...giusto?
    In PHP esiste http://www.php.net/count e tutte le funzioni di manipolazione degli array. Ancora, ti invito a leggere il manuale ufficiale:

    http://www.php.net/manual/en/ref.array.php

    Originariamente inviato da AndreaNobili
    In PHP invece che succede in un caso come questo? E' come in Java o viene creata automaticamente proprio una copia dell'oggetto e non ho problemi?
    Da non credere, ma il manuale ufficiale risponde anche a questa domanda:

    http://www.php.net/manual/en/languag...les.basics.php
    http://www.php.net/manual/en/language.references.php

  6. #6
    Originariamente inviato da filippo.toso
    Non sono oggetti, sono istanze del tipo array. Trovi tutto nel manuale ufficiale:

    http://www.php.net/array



    In PHP esiste http://www.php.net/count e tutte le funzioni di manipolazione degli array. Ancora, ti invito a leggere il manuale ufficiale:

    http://www.php.net/manual/en/ref.array.php



    Da non credere, ma il manuale ufficiale risponde anche a questa domanda:

    http://www.php.net/manual/en/languag...les.basics.php
    http://www.php.net/manual/en/language.references.php
    mmm ok...mi sembra di capire che PHP esegue la copia per valore e quindi nel caso precedente se modifico il contenuto dell'array in $b non vado ad alterare i valori di quello contenuto in $a..così potrei risparmiarmi la copia hard fatta con il ciclo foreach...se è così lo trovo fantastico !!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.