Q:

Call to a member function on a not object when the object variable is the same

Hello i have this problem: i have a php file with all my function and all class and in this file i have a class called Studente:
 class Studente implements JsonSerializable{

    private $codiceFiscale; 
    private $nome;
    private $cognome;

function __construct($codiceFiscale,$nome,$cognome) {

        $this->codiceFiscale=$codiceFiscale;
        $this->nome=$nome;
        $this->cognome=$cognome;

    }

public function getCodiceFiscale(){
    return $this->codiceFiscale;
}
public function getNome(){
    return $this->nome;
}
public function getCognome(){
    return $this->cognome;
}

then i have a function with received an istance of a studente object correctly created. the problem is on how i call the variable $studente
function test ($studente){

$studente=$studente->getCodiceFiscale(); // this generates the error "call on a non //object...." and i dont't understand why

$std=$studente->getCodiceFiscale(); //NO ERROR

}

So i'don't understand why i can't use the same variable; the method getCodiceFiscale() returns a string.
THX FOR HELP
for completition the code on page called "responseRegistroDocente" witch include in the first line the file on witch i have all the function is:
elseif (isset($_POST['operazione']) && $_POST['operazione']==='calcolaMedia' && isset($_POST['nomeStudente']) && isset($_POST['dataInizio']) && isset($_POST['dataFine']) && isset($_POST['tipoProva'])){
    try{
        $regExp='/^(0[1-9]|[12][0-9]|3[01])[/](0[1-9]|1[012])[/](19|20)\d\d$/';
        $dataInizio=null;
        $dataFine=null;
        $studente=new Studente($_POST['nomeStudente'],null,null);
        $tipoProva=$_POST['tipoProva'];
        $test=true;//preg_match($regExp,'scemo');
        if(!$test){
            throw new Exception ("La data di inizio non rispetta il formato GG/MM/YYYY.");
        }
        else{
            $test=true;//preg_match($regExp,$_POST['dataFine']);
            if(!$test){
                throw new Exception("La data di fine non rispetta il formato GG/MM/YYYY.");
            }
            else{
                $data=str_replace("/","-", $_POST['dataInizio']);
                $dataInizio=new DateTime($data);
                $data=str_replace("/","-", $_POST['dataFine']);
                $dataFine=new DateTime($data);
                $dataFine->setTime(0,0,0);
                $dataInizio->setTime(0,0,0);
                if($dataFine<$dataInizio){
                    throw new Exception("La data di inizio deve essere minore della data di fine.");
                }
                else{
                    $medie=getMedie($conn,$studente,$dataInizio,$dataFine,$tipoProva,$_SESSION['corso'],$_SESSION['classe'],$_SESSION['codiceFiscale']);
                    if(!$medie){
                        echo("Lo Studente non ha sostenuto alcuna prova nel periodo di tempo specificato.");
                    }
                    else{
                        echo(json_encode($medie));
                    }
                }
            }
        }
    }
    catch (Exception $e){
        echo($e->getMessage());
    }

}

and i have the external file on witch i have all class declaration on the top and specifically the function that generates the error
function getMedie($conn,Studente $studente,$dataInizio,$dataFine,$tipoProva,$corso,$classe,$docente){
    $votiAndMedia=array();
    $idProve=array();
    $msg='SCRITTA';
    if($tipoProva==='O'){
        $msg='ORALE';
    }
    $query="SELECT idProva FROM prova where docente_codiceFiscale='{$docente}' && materia_idMateria='{$corso}' && classe_idclasse='{$classe}' && tipoProva='{$tipoProva}';";
    $result=mysqli_query($conn,$query);
    if(!$result){
        throw new Exception("Errore nell' esecuzione della query per caricare le medie: ".mysqli_error($conn).".");
    }
    else{
        if(($nRow=mysqli_num_rows($result))===0){
            throw new Exception("Non esiste nessuna prova ".$msg." relativa a ".$corso." memorizzata nel Database.");
        }
        else{
            for($a=0;$a<mysqli_num_rows($result);$a++){
                $prove=mysqli_fetch_assoc($result);
                $idProve[$a]=$prove['idProva'];
            }
            mysqli_free_result($result);
            foreach ($idProve as $prova){
                $studente=$studente->getCodiceFiscale();
                $query="SELECT data,voto FROM sostieneprova where studente_codiceFiscale='{$codf}' && prova_idprova=$prova && data>=? && data<=?;";
                $stmt=mysqli_prepare($conn,$query);
                if(!$stmt){
                    throw new Exception("Errore nell' esecuzione della query per caricare le medie: ".mysqli_error($conn).".");
                }
                else{
                    $dataI=$dataInizio->format("Y-m-d");
                    $dataF=$dataFine->format("Y-m-d");
                    mysqli_stmt_bind_param($stmt,"ss",$dataI,$dataF);
                    $successo=mysqli_stmt_execute($stmt);
                    if(!$successo){
                        throw new Exception(mysqli_stmt_error($stmt));
                    }
                    else{
                        mysqli_stmt_store_result($stmt);
                        if(($nRow=mysqli_stmt_num_rows($stmt))===0){
                        //NON HA SOSTENUTO ANCORA LA PROVA
                        }
                        else{
                            $data=null;
                            $voto=null;
                            mysqli_stmt_bind_result($stmt,$data,$voto);
                            while (mysqli_stmt_fetch($stmt)){
                                $obj= new stdClass();
                                $obj->data=$data;
                                $obj->voto=$voto;
                                $votiAndMedia[]=$obj;
                        }
                        mysqli_stmt_free_result($stmt);
                    }
                }
            }
          }
       }
       }
       usort($votiAndMedia,function (stdClass $a,stdClass $b){
        $data1=new DateTime($a->data);
        $data1->setTime(0,0,0);
        $data2=new DateTime($b->data);
        $data2->setTime(0,0,0);
        if($data1<$data2){
            return -1;
        }
        elseif ($data1==$data2) {
            return 0;
        }
        else{
            return 1;
            }
       });
    return $votiAndMedia;

}

OK now the problem is that in the function i can't write this code: 
$studente=$studente->getCodiceFiscale();

and also $dataInizio=$dataInizio->format("d-m-Y");
and also $dataFine=$dataFine->format("d-m-Y);
but if i change all name of the variable before the equal sign there are no error. why??

A:

Alright... I've figured it out.
You're using the foreach loop, like this:
foreach ($idProve as $prova){
 $studente=$studente->getCodiceFiscale();

Like you said, getCodiceFiscale() returns string, and when it's called again, there is no object in it, but string, and you can't call this method on type string.

