[PHP] Non riesco a trovare errore

VAik

Utente Attivo
16 Apr 2016
117
3
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
 

VAik

Utente Attivo
16 Apr 2016
117
3
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 $tit, string $aut, string $cod, int $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:

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
26
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 ;)).
 
  • Like
Reactions: VAik

VAik

Utente Attivo
16 Apr 2016
117
3
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....
 

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
26
Il fatto del quarto elemento, e' inutile per il problema....rimane sempre l'ultimo messaggio di errore.
Sì, infatti era una cosa in più.

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

VAik

Utente Attivo
16 Apr 2016
117
3
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) ?
 

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
26
ma secondo te quale è "argument 1"
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).

mi sapresti dire come faccio a visualizzare bene la è (e accentata) ?
Se sei in ambito HTML, ti basta inserire nella head della pagina il seguente metatag:
HTML:
<meta charset="utf-8">
 
  • Like
Reactions: VAik

VAik

Utente Attivo
16 Apr 2016
117
3
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:

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
26
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().
 

VAik

Utente Attivo
16 Apr 2016
117
3
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?
 

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
26
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().
 
  • Like
Reactions: VAik

VAik

Utente Attivo
16 Apr 2016
117
3
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:

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
26
  • Like
Reactions: VAik

VAik

Utente Attivo
16 Apr 2016
117
3
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???
 

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
26
Che codice hai provato?
 

VAik

Utente Attivo
16 Apr 2016
117
3
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
 

VAik

Utente Attivo
16 Apr 2016
117
3
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 error, unexpected ':', 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);
 

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
26
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'.
 

VAik

Utente Attivo
16 Apr 2016
117
3
18
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.
ok, ma quando mi arriva una cosa anziché un'altra? per quale motivo?
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'.
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
 

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
26
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.