[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
30
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....
 

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
30
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
30
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
30
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:

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???
 

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
30
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
30
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.
 
Discussioni simili
Autore Titolo Forum Risposte Data
Leshabituelles Non riesco ad aggiornare PHP PHP 0
T [PHP] aiuto....Fatal error: Uncaught Error:non riesco a capire PHP 1
O PHP 5.6 non riesco ad abilitare TSL 1.2 PHP 1
A Non riesco ad inviare una mail attraverso PHP su Xampp PHP 2
ANDREA20 [PHP] Non riesco ad impostare reset password invio via email PHP 6
S [PHP] Aiuto! Non riesco a richiamare una variabile PHP 2
SimooRu [PHP] Non riesco a far passare i dati con i form PHP 4
neo996sps Non riesco a fare un parse XML con PHP PHP 1
S non riesco a capire la struttura di questo sito in PHP PHP 0
S [RISOLTO]aiuto, non riesco afar funzionare il camp odi ricerca per un DB con PHP PHP 5
S non riesco ad eliminare dei caratteri in PHP - Excel PHP 10
C Non riesco ad attivare il sito in locale (nè in rete) - PHP / EasyPHP PHP 4
W Non riesco a integrare php con html PHP 1
P Non riesco più ad inviare email con il php PHP 82
A [MYSQL+PHP]Non riesco a fare la query!!!Penso sia semplice.. PHP 1
G non riesco ad integrare l’interprete php nel server Apache su Vista PHP 2
L Non riesco a stampare BitMap con PHP PHP 1
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
P Data scraping in PHP non funziona PHP 4
L php mysql non salva solo id PHP 21
A php metodo post jquery non da mai errore jQuery 4
M Guestbook - non funziona dopo upgrade di PHP PHP 5
Valerio93 [PHP] non capisco come mai mi da la data NULL PHP 3
S [PHP] non prende la query PHP 0
WebmasterFioriniAndrea [PHP] Problema che non mi fa vedere niente PHP 2
Max 1 [PHP] Script che funziona in locale e non online PHP 16
R [PHP] pagina inclusa che non viene visualizzata PHP 2
Punix [PHP] query non valida PHP 1
M [PHP] Visualizzare un array partendo dal numero 1 e non 0 PHP 5
gandalf1959 [PHP] Inserimento di più righe non funziona come mi aspetto... PHP 2
M [PHP] Query UPDATE che non mi aggiorna campi seconda tabella PHP 3
M [PHP] header (location..) non funzionante dopo login PHP 3
B [PHP] Valore variabile non riconosciuto PHP 1
M [PHP] Selezionare immagini directory non presenti in db PHP 11
P [PHP] $_GET non preleva variabile nell’URL PHP 4
R mojave php non interpretato PHP 11
M Non corretta lettura del file php.ini della sezione CLI PHP 3
P [PHP] Input Type="date" non va correttamente con Apple PHP 2
Cosina [PHP] Preservare i campi del form solo se l'invio non ha successo PHP 5
S [PHP] Selezionare i campi non in comune con le altre colonne della tabella PHP 4
Monital [PHP] Insert into non inserisce tutti i dati PHP 1
T interpretare uno script php non fatto da me... PHP 3
M PHP - Funzione non e scrive il risultato PHP 3
L [PHP] case then e campo non riconosciuto PHP 0
T [PHP] ...Parse error che non c'è... PHP 7
M [PHP] Non si connette PHP 7
W [PHP] Non esegue il parsing su un dato sito e negli altri si... PHP 0
A Php mail non invia due mail di seguito PHP 3
L [PHP] Nuovo server, query non funzionano PHP 3
M [PHP] Escludere campi non valorizzati PHP 22

Discussioni simili