[PHP] chiamata metodi da una classe

davide ravasi

Nuovo Utente
18 Mag 2018
6
1
3
Buongiorno a tutti,
ho da circa un anno ricominciato a studiare php in una scuola di informatica e ho un esercizio da fare.

Devo creare una classe che si occupi di ridimensionare e salvare delle immagini prendendole da una specifica cartella e salvandole in formato 100x100 in un'altra (chiamata thumbnail).

Nelle richieste è specificato il modo in cui devo chiamare i metodi:
PHP:
Image::load($imgSrc)
        ->resizeAuto($newWidth, $newHeight)
        ->save($imgDest)
        ->display();
Dunque non creo l'oggetto con "new" ma lo richiamo staticamente per il primo metodo, ma poi gli altri li richiamo normalmente.

il mio codice funziona se richiamo così i metodi:
PHP:
Image::load($imgSrc);
        Image::resizeAuto($newWidth, $newHeight);
        Image::save($imgDest);
        Image::display();
non riesco a venirne a capo....qualcuno ha qualche idea?

Di seguito il codice della classe:
PHP:
<?php
class Image {
    public static $src_im;
    public static $dst_im;
    public static $newWidth;
    public static $newHeight;
    public static $imgSrc;
 
    public static function imagecreatefrom($imgSrc) {
      
        if(!file_exists($imgSrc)) {
            throw new Exception("the image doesn't exists");
        }
      
        $ext = pathinfo($imgSrc, PATHINFO_EXTENSION);
      
        if($ext == 'jpg')
            $ext = 'jpeg';
      
        if(empty($ext))
            throw new Exception("l'estensione del file non è valida");
      
        return call_user_func("imagecreatefrom$ext",$imgSrc); // add generic function
    }
 
    public static function load($imgSrc) {
        self::$imgSrc = $imgSrc;
        //$ext = pathinfo(self::$imgSrc, PATHINFO_EXTENSION);
        self::$src_im = self::imagecreatefrom(self::$imgSrc);
      
    }
    public static function resizeAuto($newWidth, $newHeight) {
      
        if(!is_int($newWidth) or !is_int($newHeight))
            throw new Exception("Veuillez renseigner un entier");
          
      
        self::$newWidth = $newWidth;
        self::$newHeight = $newHeight;
        self::$dst_im = imagecreatetruecolor(self::$newWidth, self::$newHeight);
        $infos = pathinfo(self::$imgSrc);
      
        list($width, $height, $type, $attr) = getimagesize(self::$imgSrc);
        imagecopyresampled(self::$dst_im, self::$src_im, 0, 0, 0, 0, self::$newWidth, self::$newHeight, $width, $height);
    }
    public static function save($imgDest) {
        $extension = pathinfo($imgDest, PATHINFO_EXTENSION);
        if(empty($extension))
            throw new Exception("L'extension n'est pas specifié");
      
        $choices = array(
            'jpeg'=> 'imagejpeg',
            'jpg' => 'imagejpeg',
            'png' => 'imagepng',
            'gif' => 'imagegif'
        );
        
        call_user_func_array($choices[$extension],array(self::$dst_im, $imgDest));   
    }
    public static function display() {
        $infos = pathinfo(self::$imgSrc);
        header('location: http://' . $_SERVER['HTTP_HOST'] . '/php/img_gallery/thumbnail/'.$infos['basename']);
    }
}
?>
grazie mille :)

Davide
 
Ultima modifica di un moderatore:

otto9due

Utente Attivo
22 Feb 2014
529
21
28
Forse ti può essere utile questa:
Usa $this per riferirti all'oggetto corrente. Usa self per riferirti alla classe corrente.
In pratica, usa $this->member per i membri non statici, usa self::$member per i membri statici.

Un esemio..
PHP:
<?php
class X {
    private $non_static_member = 1;
    private static $static_member = 2;

    function __construct() {
        echo $this->non_static_member . ' '
           . self::$static_member;
    }
}

new X();
?>
Fonte: https://stackoverflow.com/questions/151969/when-to-use-self-over-this

Da te sembra tutto statico..
 
Ultima modifica di un moderatore:

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.298
332
83
@davide ravasi
Da regolamento del forum, come tutti noi sei tenuto ad usare il tag
code.gif
quando posti del codice, oppure la funzione codice dalla barra degli strumenti
box inserisci 2.png.JPG

Inoltre ti prego di leggere attentamente il regolamento generale del forum e quello di sezione dove posti
Grazie
Per questa volta te lo sistemo io ma mi raccomando per il futuro