2013-03-09 11 views
5

Mam plik z klasą i definicji funkcji, zgodnie z PSR-0 definicji (z autoloading):Funkcja i klasa w tym samym pliku: niezdefiniowana funkcja

namespace Foo; 

function b() {}; 

class Bar {} 

I mam test dla tej klasy należy umieścić w tej samej przestrzeni nazw:

namespace Foo; 

class BarTest {} 

Kiedy próbuję uzyskać dostęp do funkcji b() wewnątrz klasy testu, otrzymuję błąd: undefined function

namespace Foo; 

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

Nic nie działa. Jak mogę wywołać tę funkcję?

+4

Czy dołączono plik zawierający 'b' i' Bar'? Możliwe, że masz automatyczne ładowanie, które nie będzie zawierało pliku 'Bar', dopóki nie użyjesz tej klasy. – Halcyon

+0

Co chcesz osiągnąć przez 'testSomething()' 'b(); Foo \ b(); \ b(); ' –

+0

@FritsvanCampen Edytowałem pytanie z automatycznym ładowaniem informacji. –

Odpowiedz

1

PHP autoloading nie obsługuje funkcji. Jednak to nie działa dla statycznych metod klasy:

namespace Foo; 

abstract class Util 
{ 
    static function doSomething() { 

    } 
} 

Następnie można use że klasa w niektórych innych plików prąd nazw i wywołać metodę statyczną:

use Foo\Util; 

Util::doSomething(); 

Ponieważ jest to metoda klasy i autoloading jest dla klas, to działa wtedy.

Należy zwrócić uwagę na to, że poprawniejszy sposób grupowania metod wewnątrz przestrzeni nazw/klas prawdopodobnie jest również taki, że jest on również finalDocs, jednak PHP tego nie obsługuje (patrz Cannot create a final abstract class­PHP Sadness #41).

Znajdziesz to również przedstawione w poniższej Q & materiału tutaj na miejscu:

0

Twoja funkcja b(); musi mieć ciało, zmień go na

function b(){};

+0

Właściwie to ma ciało. To był literówka. –

+0

Proszę spojrzeć na to @drgomesp http://codepad.viper-7.com/e5Momf –

+0

Chodzi o to, że chcę wywołać funkcję 'b()' z zewnątrz, i nie mam metody wrappera wewnątrz obiektu tej klasy . –

Powiązane problemy