Using $this when not in object context...

Petit nouveau ! | 8 Messages

17 juil. 2012, 12:46

Bonjour,

Je débute et j'ai un bug que je n'arrive pas à comprendre.

Sur l'image il y a la classe appelée, sa méthode et le message d'erreur.

Image

La classe est appelée avec le code suivant :

Code : Tout sélectionner

$reccord = new fm_reccord($data); $_SESSION[EDIT_RECID]=$reccord->getValue(0,'recid');
J'ai beau tourner le problème dans tous les sens pas moyen de trouver ce qui bloque.

Si je remplace le contenu de la méthode par "$newrefdata=& $this->refdata; return 'DEBUG';"
J'ai le même message d'erreur.
Pourtant un var_dump de $this->refdata fonctionne parfaitement et affiche bien le contenu de $data.

Merci d'avance pour votre aide.

PS : je vais supprimer ce post dans la section débutant...

ViPHP
xTG
ViPHP | 7331 Messages

17 juil. 2012, 13:40

Je vois pas de problème. :/
Tu pourrais nous faire un copier/coller de ta class qu'on puisse effectuer des tests ?

Petit nouveau ! | 8 Messages

17 juil. 2012, 14:22

Je ne sais pas si ça va aider car je fais appèle à des fonctions d'une Bibliothèque Filemaker ; qui n'a rien de standard.

Code : Tout sélectionner

class fm_reccord{ private $refdata; public function __construct(FileMaker_Result& $data) { $this->refdata=&$data; return NULL; } public function __destruct() { return NULL; } public function getValue($recNumber=0, $fieldName='recid', $repetition=0){ $reccords = $this->refdata->getRecords(); $reccord = $reccords[$recNumber]; if($recNumber >= $this->refdata->getFetchCount()) return NULL; else if($fieldName=='recid') return $reccord->getRecordId(); else return $reccord->getField($fieldName,$repetition); } public function printValue($recNumber=0, $fieldName='recid', $repetition=0){ echo fm_reccord::getValue($recNumber, $fieldName, $repetition); } }

Petit nouveau ! | 8 Messages

17 juil. 2012, 18:00

Bon ... bhen j'ai trouvée la solution...
C'est caca !! Mais ça fonctionne :
@$reccords = $this->refdata->getRecords();
@$reccord = $reccords[$recNumber];
J'ai ajouté des @ :cry:

Mammouth du PHP | 1511 Messages

17 juil. 2012, 20:00

Non non non et non !

Si il y a une erreur, c'est qu'il y a un problème.

Ca c'est dégueulasse, ce n'est ni fait ni a faire !
Par hasard, tu n'aurais pas appelé ta fonction en statique ?

Petit nouveau ! | 8 Messages

18 juil. 2012, 07:30

Je ne penses pas non...

Voila l'appel :

Code : Tout sélectionner

$reccord = new fm_reccord($data); $_SESSION[EDIT_RECID]=$reccord->getValue(0,'recid');

ViPHP
xTG
ViPHP | 7331 Messages

18 juil. 2012, 09:14

Cette erreur peut être générée sur l'appel de la fonction suivante :
public function printValue($recNumber=0, $fieldName='recid', $repetition=0){
        echo fm_reccord::getValue($recNumber, $fieldName, $repetition);
    }
Là tu fais un appel statique, et donc dans getValue le $this est hors contexte.
Sinon aucun souci.

Voici mon code de test qui fonctionne sans erreur :
<?php
class Record{
	private $recid = null;
	public function __construct($val){
		$this->recid = $val;
	}
	public function getRecordId(){
		return $this->recid;
	}
	public function getField($name, $repetition){
		return $this->recid;
	}
}

class FileMaker_Result{

	public function getRecords(){
		return array(
			new Record(0),
			new Record(1)
		);
	}
	public function getFetchCount(){
		return 10;
	}

}

class fm_reccord{

    private $refdata;

    public function __construct(FileMaker_Result& $data) {
   $this->refdata=&$data;
   return NULL;
    }

    public function __destruct() {
   return NULL;
    }
   
   
   
    public function getValue($recNumber=0, $fieldName='recid', $repetition=0){
   $reccords = $this->refdata->getRecords();
   $reccord  = $reccords[$recNumber];
   
   if($recNumber >= $this->refdata->getFetchCount()) return NULL;
        else if($fieldName=='recid') return $reccord->getRecordId();
        else return $reccord->getField($fieldName,$repetition);
    }
   
    public function printValue($recNumber=0, $fieldName='recid', $repetition=0){
        echo fm_reccord::getValue($recNumber, $fieldName, $repetition);
    }
}
$reccord = new fm_reccord(new FileMaker_Result);
$reccord->getValue(0,'recid');

Petit nouveau ! | 8 Messages

18 juil. 2012, 11:39

Merci ! :D

J'ai trouvé grâce à toi.

Il y avait bien un appel static mais beaucoup plus loin dans le code et en dehors de la classe.
Je ne pige pas pourquoi php me plante pour un appel qui n'a pas encore été exécuté.

Il y a une compilation du code avant exécution sur les moteur PHP ?
Je pensais que c'était de l'interprétation pure.

ViPHP
xTG
ViPHP | 7331 Messages

18 juil. 2012, 15:03

Bah l'interprétation vérifie les erreurs de syntaxes et bien plus. ;)