Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: Funzionamento anomalo __toString()

  1. #1

    Funzionamento anomalo __toString()

    Ciao, ritengo che ci sia un funzionamento anomalo del metodo __toString per le classi di php, in sostanza, se tale classe deve restituire una stringa va tutto bene, ma se deve restiuire un numero si verificano i problemi, per esempio, questo codice restiuisce errore
    Codice PHP:
    <?php
    class  tmp{
      private 
    $dato;
      function 
    __construct($value='') {
        
    $this->dato=$value;
      }

      function 
    __toString() {
        return 
    $this->dato;
      }
    }

    $tmp=new tmp(1);
    echo 
    $tmp;
    Questo codice invece no:
    Codice PHP:
    class  tmp{
      private 
    $dato;
      function 
    __construct($value='') {
        
    $this->dato=$value;
      }

      function 
    __toString() {
        return (
    $this->dato) ? $this->dato '';
      }
    }

    $tmp=new tmp('1');
    echo 
    $tmp
    Ho superato il problema modificando il metodo in questo modo
    Codice PHP:
    function __toString() {
      if(
    is_numeric($this->dato))
        return (string)
    $this->dato;
      return (
    $this->dato) ? $this->dato '';

    ma poi si verifica un Notice se vado a scrivere questo:
    $tmp=new tmp(1);
    echo $tmp>0;

    E' normale come funzionamento?

  2. #2
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,155
    ho fatto un paio di prove e scrivendo

    Codice PHP:
    function __toString() {
        return 
    "$this->dato";
      } 
    mi sembra funzioni correttamente

  3. #3
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jul 2002
    residenza
    Lyon
    Messaggi
    5,341
    Di per se il metodo si chiama toString quindi rinviare un dato puramente numerico è un'eresia. No ?

    con puramente numerico voglio dire che non sia una stringa composta da soli numeri.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  4. #4
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    11,411
    Ma è così difficile scrivere anche i messaggi d'errore invece di dire solo "mi da errore"? Che errore? Che warning?
    Basta fare copia/incolla, non è così faticoso.

    Leggi e rispetta il regolamento per favore.
    Ultima modifica di Alhazred; 28-10-2018 a 11:54

  5. #5
    Quote Originariamente inviata da badaze Visualizza il messaggio
    Di per se il metodo si chiama toString quindi rinviare un dato puramente numerico è un'eresia. No ?

    con puramente numerico voglio dire che non sia una stringa composta da soli numeri.
    Ovviamente far restituire un valore numerico q quel metodo non è corretto, ma pensavo facesse lui un casting del dato senza controllarlo. C'è da controllare prima che su quella proprietà non finisca un valore numerico e questo mi sembra un limite.
    Comunque l'errore che ricevo nel primo esempio è questo:
    Catchable fatal error: Method tmp::__toString() must return a string value in /var/wwwtest1.php on line 14

    Invece se modifico la classe in questo modo:
    Codice PHP:

    class  tmp{
      private 
    $dato;
      function 
    __construct($value='') {
        
    $this->dato=$value;
      }

      function 
    __toString() {
        if(
    is_numeric($this->dato))
          return (string)
    $this->dato;
        return (
    $this->dato) ? $this->dato '';
      }
    }

    $tmp=new tmp(1);
    echo 
    $tmp>0
    L'errore ricevuto è questo:
    Notice: Object of class tmp could not be converted to int in /var/www/test1.php on line 16

    Quote Originariamente inviata da clasku Visualizza il messaggio
    ho fatto un paio di prove e scrivendo

    Codice PHP:
    function __toString() {
        return 
    "$this->dato";
      } 
    mi sembra funzioni correttamente
    Quello che scrivi è fare il casting del dato, se poi faccio il controllo come nel secondo esepio non va bene e ricevo l'errore indicato.

  6. #6
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jul 2002
    residenza
    Lyon
    Messaggi
    5,341
    Veramente non capisco il tuo problema. Perché fai quel controllo ? In sostanza fai un casting se numerico e altrimenti torni un valore alfanumerico. A questo proposito non capisco la presenz dell’operatore ternario.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  7. #7
    Quote Originariamente inviata da badaze Visualizza il messaggio
    Veramente non capisco il tuo problema. Perché fai quel controllo ? In sostanza fai un casting se numerico e altrimenti torni un valore alfanumerico. A questo proposito non capisco la presenz dell’operatore ternario.
    Il controllo se numerico lo faccio perché nel caso in cui dentro quella proprietà ci finisce un valore numerico, il __toSstring restituisce questo errore Catchable fatal error: Method tmp::__toString() must return a string value.

  8. #8
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,486
    Scusa, ma
    Codice PHP:
    echo $tmp 
    Cosa c'entra con __toString() ? Stai provando a confrontare un oggetto con un intero, mi par ovvio che hai un notice. Ma son due cose distinte
    Ultima modifica di boots; 30-10-2018 a 13:28

  9. #9
    Quote Originariamente inviata da boots Visualizza il messaggio
    Scusa, ma
    Codice PHP:
    echo $tmp 
    Cosa c'entra con __toString() ? Stai provando a confrontare un oggetto con un intero, mi par ovvio che hai un notice. Ma son due cose distinte
    quando fai questo echo $tmp, la classe richiama il metodo __toString() che restituisce il contenuto di una proprietà, facendo questo echo $tmp>0 tu __toString() restituisce una stringa, è qui che si verifica l'errore.
    Pensavo che il confronto in quel modo fosse sul dato restituito, ma in realtà è sull'oggetto

  10. #10
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,486
    No. __toString() viene richiamata quando $tmp deve essere trattato come una stringa. Se fai
    echo $tmp>0
    php prima cerca di valutare $tmp > 0, per poi stamparne il risultato.Ovviamente facendo $tmp>0 php non richiamerà mai la __toString()

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 © 2018 vBulletin Solutions, Inc. All rights reserved.