[PHP] Non riesco a trovare errore

Discussione in 'PHP' iniziata da VAik, 9 Ottobre 2016.

  1. VAik

    VAik Utente Attivo

    Registrato:
    16 Aprile 2016
    Messaggi:
    117
    Mi Piace Ricevuti:
    3
    Punteggio:
    18
    PHP:
    <?php
    class Prodotto {
          
    //qui ci sono dei commenti che ho messo io


       
    protected $price;
       protected 
    $qta;
       protected 
    $database;
       
       public function 
    getPrezzo():float {     ///QUI C'E' ERRORE STRANO
         
    return $this->price;
       }
       public function 
    setPrezzo(float $prezzo) {
          
    $this->price $prezzo;
       }
       public function 
    getQta(): int {
          return 
    $this->qta;
       }
       public function 
    setQta(int $qta) {
          
    $this->qta $qta;
       }
       public function 
    addQta(int $quantita) {
          
    $this->qta += $quantita;
       }  

    Ciao a tutti ragazzi
    non riesco a capire perchè ho un errore legato a questa classe non segnalato da Eclipse, ma quando vado ad eseguire il file index.php .

    non riesco proprio a capire:


    Parse error: syntax error, unexpected ':', expecting ';' or '{' in C:\Program Files\EasyPHP---\OOP-primo\classi\Prodotto_overriding.php on line 31
     
  2. VAik

    VAik Utente Attivo

    Registrato:
    16 Aprile 2016
    Messaggi:
    117
    Mi Piace Ricevuti:
    3
    Punteggio:
    18
    NON capisco: mi sembra tutto lineare il programma proprio perchè sono all'inizio e faccio copia ed incolla di quello che ho sviluppato poco prima e che funziona, ed applico delle modifiche minime al codice.....

    Ho risolto togliendo :float, però mi sono comparse altri errori

    per questo ho tolto anche la specifica del tipo alla funzione getTitolo della classe figlia Libro

    PHP:
    class Libro extends Prodotto {
         protected 
    $titolo;
         protected 
    $autore;
         protected 
    $codiceisbn;
         protected 
    $prezzousato;
     
         public function 
    __construct(string $titstring $autstring $codint $qta) {    //ERRORE LINEA 26

          
    $this->titolo $tit;
          
    $this-> autore $aut;
          
    $this-> codiceisbn $cod;
          
    $this-> qta $qta;
         }

     public function 
    getTitolo() {
              return 
    $this->titolo;
         }

       
    //facciamo un overriding  della funzione setPrezzo svolgendo due cose:
         
    public function setPrezzo(float $prezzo) {
            
    parent::setPrezzo($prezzo);
            
    //richiamo metodo setPrezzo della classe padre, valorizzando la proprietà
            //$price della classe padre

     
    $this->prezzousato $prezzo $prezzo*0.1;
            
    //valorizzo $prezzousato, che è proprietà interna alla calsse libro
     
            
    }
    }



    Il file index è

    PHP:
    <?php
      
    require_once "classi/Prodotto_overriding.php";
      require_once 
    "classi/Libro_overriding.php";

      
    $prezzo 26.78;
      
    $libro = new Libro('Eneide','Virgilio''UHJUI899');     //ERORRE ALLA LINEA 6
      
    $prezzi $libro->setPrezzo($prezzo);
      
    var_dump$libro);


    ora mi esce


    Catchable fatal error: Argument 1 passed to Libro::__construct() must be an instance of string, string given, called in C:\Program Files\EasyPHP-.....\OOP-primo\index_overriding.php on line 6 and defined in C:\Program Files\EasyPHP-......\OOP-primo\classi\Libro_overriding.php on line 26


    EDIT: il problema per me è il fatto di dover specificare il tipo di dati, come si faceva prima era meglio
     
    Ultima modifica: 9 Ottobre 2016
  3. AdeKnite

    AdeKnite Utente Attivo

    Registrato:
    3 Agosto 2016
    Messaggi:
    161
    Mi Piace Ricevuti:
    35
    Punteggio:
    28
    Sesso:
    Maschio
    Ciao. Ti conviene togliere la tipizzazione in input e controllare il tipo di dato ricevuto manualmente. A quanto ho capito è un comportamento perverso di PHP.

    Attento che nel costruttore hai dichiarato quattro variabili nella classe Libro, tuttavia quando l'hai istanziata, l'hai fatto senza inserire la variabile quantità (ma te ne saresti accorto da solo ;)).
     
    A VAik piace questo elemento.
  4. VAik

    VAik Utente Attivo

    Registrato:
    16 Aprile 2016
    Messaggi:
    117
    Mi Piace Ricevuti:
    3
    Punteggio:
    18
    Il fatto del quarto elemento, e' inutile per il problema....rimane sempre l'ultimo messaggio di errore.

    Provo a togliere i tipi , ma npn capisco petche non funziona: argument 1 e sempre stringa sia che sia eneide che virgilio che il codice isbn....
     
  5. AdeKnite

    AdeKnite Utente Attivo

    Registrato:
    3 Agosto 2016
    Messaggi:
    161
    Mi Piace Ricevuti:
    35
    Punteggio:
    28
    Sesso:
    Maschio
    Sì, infatti era una cosa in più.

    Per quanto riguarda questo problema della tipizzazione, esso è trattato nel sito di PHP, a questo link.
     
  6. VAik

    VAik Utente Attivo

    Registrato:
    16 Aprile 2016
    Messaggi:
    117
    Mi Piace Ricevuti:
    3
    Punteggio:
    18
    Grazie AdeKnite

    ma secondo te quale è "argument 1"
    così visualizzo e capisco quale potrebbe essere il problema......


    Cmq ho copiato pari pari i vari codici togliendo appunto i tipi e mi funziona bene....


    p.s. "VADO OT"
    mi sapresti dire come faccio a visualizzare bene la è (e accentata) ?
     
  7. AdeKnite

    AdeKnite Utente Attivo

    Registrato:
    3 Agosto 2016
    Messaggi:
    161
    Mi Piace Ricevuti:
    35
    Punteggio:
    28
    Sesso:
    Maschio
    Argument 1 è semplicemente il primo parametro (argomento) che passi in input alla funzione. Se togli il tipo (string) al primo argomento (lasciandolo quindi al secondo) ti risulterà l'errore in riferimento al secondo argomento, ossia Argument 2 passed to Libro::__construct() must be an instance of string, string given.

    Il punto è che l'errore si presenta in tutti gli argomenti, solo che PHP si ferma al primo e ti segnala l'errore, non parsando più lo script (è come se facesse un exit(), per capirci).

    Se sei in ambito HTML, ti basta inserire nella head della pagina il seguente metatag:
    HTML:
    <meta charset="utf-8">
     
    A VAik piace questo elemento.
  8. VAik

    VAik Utente Attivo

    Registrato:
    16 Aprile 2016
    Messaggi:
    117
    Mi Piace Ricevuti:
    3
    Punteggio:
    18
    ma parser , parsando e cose così cosa vogliono dire????

    cmq come procedo: piano piano aggiungo i tipi ai vari dati e vedo come funzia?

    con var_dump($nlibro)
    vedo che tutti i prima 4 campi sono stringa...quindi???

    grazie per tutti i vari consigli che mi dai
     
    Ultima modifica: 10 Ottobre 2016
  9. AdeKnite

    AdeKnite Utente Attivo

    Registrato:
    3 Agosto 2016
    Messaggi:
    161
    Mi Piace Ricevuti:
    35
    Punteggio:
    28
    Sesso:
    Maschio
    In parole povere, PHP parsa lo script nel senso che ne fa un'analisi sintattica.

    Non penso che aggiungendo i tipi come hai fatto prima inizi a funzionare, il mio consiglio è quello di non tipizzare l'input, bensì controllare a inizio funzione che le variabili in ingresso siano del tipo corretto. Puoi utilizzare le funzioni is_string() e is_int().
     
  10. VAik

    VAik Utente Attivo

    Registrato:
    16 Aprile 2016
    Messaggi:
    117
    Mi Piace Ricevuti:
    3
    Punteggio:
    18
    Non le conosco come funziona, ma facendo una minima ricerca penso che possa fare una cosa del genere
    PHP:
    <?php 
     
    if (is_string(23))  
    { echo 
    "Yes";
     } else { 
    echo 
    "No"; } 
    ?>
    però non capisco come faccio a renderlo per una classe:
    per ogni proprietà che ha l'oggetto devo creare nella classe una funzione che le legge singolarmente?
    per esempio getTitolo che ritorna appunto il titolo

    poi faccio una cosa del genere?

    PHP:

    (is_string($nlibro->getTitolo()))
    { echo 
    "Yes";
     } else { 
    echo 
    "No"; } 
    però mi sembra qualcosa di troppo lungo da potersi fare in un codice, o sbaglio?
     
  11. AdeKnite

    AdeKnite Utente Attivo

    Registrato:
    3 Agosto 2016
    Messaggi:
    161
    Mi Piace Ricevuti:
    35
    Punteggio:
    28
    Sesso:
    Maschio
    In questo modo:
    PHP:
         public function __construct($tit$aut$cod$qta) {    //ERRORE LINEA 26

            
    if (!is_string($tit) || !is_string($aut) || !is_string($cod) || !is_int($qta)) { // se non è rispettato il formato degli argomenti
                
    trigger_error("Il tipo di uno o più parametri nell'istanza della classe è errato."E_USER_ERROR); // mostra un errore
            
    }
              
    $this->titolo $tit;
              
    $this->autore $aut;
              
    $this->codiceisbn $cod;
              
    $this->qta $qta;
         }
    Ora, se provi a istanziare la classe, ad esempio, in questo modo
    PHP:
      $libro = new Libro('Eneide','Virgilio''UHJUI899','ciao');     //ERORRE ALLA LINEA 6
    vedrai che ti genera l'errore definito con la funzione trigger_error().
     
    A VAik piace questo elemento.
  12. VAik

    VAik Utente Attivo

    Registrato:
    16 Aprile 2016
    Messaggi:
    117
    Mi Piace Ricevuti:
    3
    Punteggio:
    18
    Ciao AdeKnite
    grazie ancora per il tuo intervento chiarificatore.

    troppo bella la tua soluzione.....

    ti vorrei chiedere: http://www.w3ii.com/it/php/func_error_trigger_error.html

    da questo link ho visto che trigger_error( errormsg,errortype );
    nel primo parametro ci va la frase che io voglio che sia visualizzata in caso di errore, giusto?
    nel secondo parametro possono esserci questi
    • E_USER_ERROR
    • E_USER_WARNING
    • E_USER_NOTICE (this is default)
    che cosa significa? cosa cambia? o meglio, anzi sicuramente meglio, quale è il più utilizzato?

    Andando al controllo che mi hai inserito nel codice, con la funzione trigger_error()
    il programma si blocca?
    è una specie di exit che ti spiega l'errore?

    Ora cmq lo provo
     
    Ultima modifica: 10 Ottobre 2016
  13. AdeKnite

    AdeKnite Utente Attivo

    Registrato:
    3 Agosto 2016
    Messaggi:
    161
    Mi Piace Ricevuti:
    35
    Punteggio:
    28
    Sesso:
    Maschio
    A VAik piace questo elemento.
  14. VAik

    VAik Utente Attivo

    Registrato:
    16 Aprile 2016
    Messaggi:
    117
    Mi Piace Ricevuti:
    3
    Punteggio:
    18
    ho provato e mi da errore.....bloccandomi il programma.

    Ho provato ad eliminare un controllo per volta, per poi aggiungerli, sono arrivato alla conclusione che ora come ora il problema è la quantità.
    nel senso che se lascio il controllo sui primi tre argomenti ,non ci sono problemi il programma gira. Se metto anche il controllo sulla quantità allora mi si blocca il programma


    EDIT
    EDIT
    ho notato che se il numero della quantità viene messo con gli apici ' ' è come se venisse letto male, forse stringa, invece se tolgo gli apici, allora il programma gira bene. E' normale???
     
  15. AdeKnite

    AdeKnite Utente Attivo

    Registrato:
    3 Agosto 2016
    Messaggi:
    161
    Mi Piace Ricevuti:
    35
    Punteggio:
    28
    Sesso:
    Maschio
    Che codice hai provato?
     
  16. VAik

    VAik Utente Attivo

    Registrato:
    16 Aprile 2016
    Messaggi:
    117
    Mi Piace Ricevuti:
    3
    Punteggio:
    18
    ho provato il codice che mi hai suggerito (commento #11) con is_string e is_int


    EDIT
    EDIT

    Ho fatto un ulteriore prova, riportando il codice con gli apici attorno al numero della quantità e togliendo il controllo che mi hai suggerito.
    quando vado a stampare si vede che viene memorizzato come stringa
     
  17. VAik

    VAik Utente Attivo

    Registrato:
    16 Aprile 2016
    Messaggi:
    117
    Mi Piace Ricevuti:
    3
    Punteggio:
    18
    Come pure un'altra cosa....ho provato a reinserire una per volta i tipi alle funzioni come ad esempio
    PHP:
    public function getTitolo() : string{   //ERRORE
              
    return $this->titolo;
         }
    [
    PHP]
    mi compare come sempre questo tipo di errore
    Parse error
    syntax errorunexpected ':'expecting ';' or '{' in C:\Program Files\EasyPHP-....\OOP-primo\classi\Libro_overriding_senza_tipi.php on line 40

    Basta
    !!!! non li uso più....faccio il controllo che mi hai suggerito nel messaggio #11 e basta!!!!

    Però poichè il controllo è importante mi chiedevo poichè è nella classe
    [PHP]
    if (!
    is_string($tit) || !is_string($aut) || !is_string($cod) || !is_int($qta)) {
                
    trigger_error("Il tipo di uno o più parametri nell'istanza della classe è errato."E_USER_ERROR); 
            }
     
    perchè lo si mette un controllo del genere?
    Può accadere che quando si istanzia un oggetto
    PHP:
      $libro = new Libro('Eneide','Virgilio''UHJUI899'20);  
     
    può succedere che questi valori siano presi dinamicamente nel senso
    PHP:
    $titolo=$_POST['qualcosa'];
    $autore=$_POST['qualcosaltro'];
     
    $libro = new Libro($titolo,$autore'UHJUI899'20);  
     
     
  18. AdeKnite

    AdeKnite Utente Attivo

    Registrato:
    3 Agosto 2016
    Messaggi:
    161
    Mi Piace Ricevuti:
    35
    Punteggio:
    28
    Sesso:
    Maschio
    Il controllo lo metti poiché può capitare che dove tu ti aspetti un numero, ti arrivi una stringa e viceversa. E se una cosa del genere succede ti cade tutto.

    Quando prima mi hai detto che ti si bloccava il programma, se hai usato il mio codice è normale, perché se ci fai caso, dove lui si aspetta una quantità, quindi un intero, trova invece la stringa 'ciao'.
     
  19. VAik

    VAik Utente Attivo

    Registrato:
    16 Aprile 2016
    Messaggi:
    117
    Mi Piace Ricevuti:
    3
    Punteggio:
    18
    ok, ma quando mi arriva una cosa anziché un'altra? per quale motivo?
    no no ho usato la mia di oggetto, la tua l'ho considerata solo quando ho letto il tuo 11° messaggio, poi ho visto che non aveva partiocolarità di sorta e non l'ho considerata, e poi anche io avevo istanzato un oggetto
     
  20. AdeKnite

    AdeKnite Utente Attivo

    Registrato:
    3 Agosto 2016
    Messaggi:
    161
    Mi Piace Ricevuti:
    35
    Punteggio:
    28
    Sesso:
    Maschio
    Ti può arrivare una cosa anziché un'altra per due motivi: o l'utente sbaglia a compilare il campo di un form e ti invia un valore al posto di un altro o, semplicemente, lo inserisci tu nella funzione per svista.
     
Sto caricando...

Condividi questa Pagina