2013-03-09 18 views
5

ho un file con una classe e una definizione di funzione, secondo le PSR-0 definizioni (con caricamento automatico):funzione e la classe nello stesso file: funzione non definita

namespace Foo; 

function b() {}; 

class Bar {} 

E ho la prova per quella classe , posizionare nello stesso namespace:

namespace Foo; 

class BarTest {} 

Quando provo ad accedere alla funzione b() all'interno della classe di test, ottengo un errore undefined function:

namespace Foo; 

class BarTest extends PHPUnit_Framework_TestCase 
{ 
    public function testSomething() 
    { 
     b(); 
     Foo\b(); 
     \b(); 
    } 
} 

Nulla sembra funzionare. Come posso chiamare quella funzione?

+4

Hai incluso il file che contiene 'b' e' Barra'? Potrebbe darsi che tu abbia un autoloading che non includa il file con 'Bar' finché non usi quella classe. – Halcyon

+0

Cosa vuoi ottenere con 'testSomething()' 'b(); Foo \ b(); \ b(); ' –

+0

@FritsvanCampen Ho modificato la domanda con informazioni sul caricamento automatico. –

risposta

1

PHP caricamento automatico non supporta le funzioni. Tuttavia, non funziona per metodi classe statiche:

namespace Foo; 

abstract class Util 
{ 
    static function doSomething() { 

    } 
} 

È quindi possibile use quella classe in alcuni altri file namespace corrente e chiamare il metodo statico:

use Foo\Util; 

Util::doSomething(); 

Poiché si tratta di un metodo di classe e l'autoloading è per le classi, quindi funziona.

Fare attenzione che il modo più corretto per raggruppare i metodi all'interno di uno spazio dei nomi/classe è probabilmente lo rende anche finalDocs, tuttavia PHP non lo supporta (vedere Cannot create a final abstract class­PHP Sadness #41).

Potete trovare questo pure delineato nel seguente Q & A Materiale qui sul sito:

0

La tua funzione b(); deve avere corpo, modificarlo a

function b(){};

+0

In realtà ha un corpo. Era un errore di battitura. –

+0

Si prega di guardare questo @drgomesp http://codepad.viper-7.com/e5Momf –

+0

Il fatto è, voglio chiamare la funzione 'b()' dall'esterno, e non ho un metodo wrapper all'interno dell'oggetto di quella classe . –