2009-10-28 4 views
1
<?php 
class Conversor { 
    function toLowerFirst($word) { 
     $word = 'test'; 
     return $word; 
    } 
} 

class Test { 
    function test() { 
     $word = 'Test'; 
     $word = $this->conversor->toLowerFirst($word); 
     echo $word; 
    } 
} 

class Launcher { 
    function launch() { 
     $Test = new Test(); 
     $Test->conversor = new Conversor(); 
     $Test->test(); 
    } 
} 

$launcher = new Launcher(); 
$launcher->launch(); 
?> 

Pourquoi ne fait-elle pas écho à 'test'?Appel à une fonction membre X sur un non-objet dans Y sur la ligne Z

Répondre

5

C'est parce que votre fonction test() est le même que le nom de la classe - il ressemble à un constructeur de style ancien, il est donc en cours d'exécution lorsque vous faites new Test(), à savoir avant de vous mettre conversor.

Renommer la fonction ou ajouter un nouveau style constructeur à tester: __construct()

+0

Je pensais en commençant par à la fonction et T dans la classe allaient les différencier. –

+0

Malheureusement pas :) – Greg

1

Parce que l'appel $word = $this->conversor->toLowerFirst($word); renvoie une erreur, la fonction toLowerFirst n'existe pas à ce moment-là (vous appelez la fonction par un non-existant instance de Conversor)

Remplacez $word = $this->conversor->toLowerFirst($word); par $word = Conversor::toLowerFirst($word); et cela fonctionnera.

Edit: le __construct est une meilleure solution, parce que mes résultats de suggestion à 2 fois l'écho .. (test est traité comme un constructeur pour le test)

+0

@Delirium tremens, c'est la raison! Belle réponse MisticEarth. Cela dit peut-être que vous devriez repenser le déroulement du programme car cela va probablement jeter un avertissement sur les normes strictes. – Frankie

+0

Dans le code non simplifié, la partie correspondant à $ word = $ this-> conversor-> toLowerFirst ($ word); s'exécute avant la partie qui correspond à $ Test-> conversor = new Conversor(); fonctionne. –

Questions connexes