2010-02-28 12 views
92

Ho un problema:

Sto scrivendo una nuova WebApp senza Framework.

Nel mio index.php sto usando: require_once('load.php');

E in load.php sto usando require_once('class.php'); per caricare il mio class.php.

Nel mio class.php ho questo errore:

Fatal error: Using $this when not in object context in class.php on line ... (in this example it would be 11)

Un esempio di come la mia class.php è scritto:

class foobar { 

    public $foo; 

    public function __construct() { 
     global $foo; 

     $this->foo = $foo; 
    } 

    public function foobarfunc() { 
     return $this->foo(); 
    } 

    public function foo() { 
     return $this->foo; 
    } 
} 

Nel mio index.php Sto caricando forse foobarfunc() in questo modo:

foobar::foobarfunc(); 

ma può anche essere

$foobar = new foobar; 
$foobar->foobarfunc(); 

Perché l'errore in arrivo?

+0

che dovrebbe essere pubblico ** funzione ** __costruct() – Gordon

+0

nel mio codice è la funzione, scusa appena dimenticata in questo esempio – ahmet2106

+1

Per coincidenza ho sofferto con questo errore per circa 3 ore ieri! :) – Jack

risposta

112

In my index.php I'm loading maybe foobarfunc() like this:

foobar::foobarfunc(); // Wrong, it is not static method 

but can also be

$foobar = new foobar; // correct 
$foobar->foobarfunc(); 

Non si può richiamare il metodo in questo modo perché non è metodo statico.

foobar::foobarfunc(); 

Si dovrebbe invece usare:

foobar->foobarfunc(); 

Se invece si è creato un metodo di qualcosa di statico come:

static $foo; // your top variable set as static 

public static function foo() { 
    return self::$foo; 
} 

quindi è possibile utilizzare questo:

foobar::foobarfunc(); 
+1

Le variabili con lo stesso nome non sono un problema. '$ this-> foo' è un membro della classe, mentre' $ foo' è solo una variabile nell'ambito della funzione (importata dall'ambito globale).Anche i nomi delle funzioni con lo stesso nome di un membro non sono un problema. – Gordon

+0

@Gordon: oh, sì hai ragione, grazie uomo :) – Sarfraz

+102

Non puoi usare '$ this' in un metodo statico. – Yacoby

9

Se stai invocando foobarfunc con resolution scope operator (::), quindi lo si chiama statically, ad es. a livello di classe invece del livello di istanza, quindi si è utilizzando $this quando non si trova nel contesto dell'oggetto. $this non esiste nel contesto di classe.

Se si abilita E_STRICT, PHP alzerà un avviso su questo:

Strict Standards: 
Non-static method foobar::foobarfunc() should not be called statically 

fare questo, invece

$fb = new foobar; 
echo $fb->foobarfunc(); 

Su un sidenote, suggerisco di non usare global dentro le classi.Se hai bisogno di qualcosa dall'esterno della tua classe, passa attraverso il costruttore. Questo è chiamato Dependency Injection e renderà il tuo codice molto più gestibile e meno dipendente da cose esterne.

4

Quando si chiama la funzione in un contesto statico, $this semplicemente non esiste.

Dovresti invece utilizzare this::xyz().

Per sapere quale contesto si è in quando una funzione può essere richiamata sia staticamente che in un'istanza di oggetto, un buon approccio è delineato in questa domanda: How to tell whether I’m static or an object?

18

si chiama un metodo non statico:

public function foobarfunc() { 
    return $this->foo(); 
} 

utilizzando una statica chiamata:

foobar::foobarfunc(); 

Quando si utilizza un statico-chiamata, la funzione verrà chiamata (anche se non dichiarato come static), ma, poiché non esiste un'istanza di un oggetto, non c'è $this.

Quindi:

  • Si consiglia di non utilizzare le chiamate statici per i metodi non statici
  • I suoi metodi statici (o staticamente-cosiddetti metodi) non può usare $ this, che normalmente indica l'istanza corrente della classe, in quanto non esiste un'istanza di classe quando si utilizzano le chiamate statiche.


Qui, i metodi della classe si utilizza l'istanza corrente della classe, come hanno bisogno di accedere alla proprietà $foo della classe.

Ciò significa che i metodi richiedono un'istanza della classe, il che significa che non possono essere statici.

Questo significa che non si dovrebbe usare le chiamate statiche: si dovrebbe instanciate la classe, e utilizzare l'oggetto per chiamare i metodi, come hai fatto nel tuo ultimo porzione di codice:

$foobar = new foobar(); 
$foobar->foobarfunc(); 


Per ulteriori informazioni, non esitate a leggere, nel manuale di PHP:


Si noti inoltre che probabilmente non avete bisogno di questa linea nel vostro __construct metodo:

global $foo; 

Utilizzando la global keyword farà la variabile $foo, dichiarata al di fuori di tutte le funzioni e le classi, visibile da all'interno di quel metodo ... E probabilmente non hai una variabile così $foo.

Per accedere a $fooclass-property, è sufficiente utilizzare $this->foo, come hai fatto tu.

0

$foobar = new foobar; messo classe foobar a $ foobar, non l'oggetto. Per ottenere l'oggetto, è necessario aggiungere parentesi: $foobar = new foobar();

Il tuo errore è semplicemente che si chiama un metodo su una classe, quindi non c'è $this dal $this esiste solo negli oggetti.

5

Per prima cosa è capire una cosa, $ this all'interno di una classe indica la corrente oggetto.
Questo è il motivo per cui si è creato fuori dalla classe per chiamare la funzione di classe o la variabile.

Quindi quando si chiama la funzione di classe come foobar :: foobarfunc(), l'oggetto non viene creato. Ma all'interno di quella funzione hai scritto return $ this-> foo(). Ora qui $ questo non è niente. Ecco perché la sua dicendo Usando $ this quando non in contesto oggetto in class.php

Solutions:

  1. Creare un oggetto e chiamare foobarfunc().

  2. Chiama foo() utilizzando il nome classe all'interno di foobarfunc().

+1

o usa solo self :: invece di $ this –

-1

basta usare il metodo della classe utilizzando questo foobar->foobarfunc();

+1

Per favore rispondi alle vecchie domande se hai qualcosa * * nuovo ** da aggiungere. – Ajean

4

metodo veloce: (new foobar()) -> foobarfunc();

è necessario caricare la classe sostituire:

foobar::foobarfunc(); 

da:

(new foobar())->foobarfunc(); 

o:

$Foobar = new foobar(); 
$Foobar->foobarfunc(); 

o fare statica funzione da usare foobar::.

class foobar { 
    //... 

    static function foobarfunc() { 
     return $this->foo(); 
    } 
} 
0

così semplice: ..!

inserire semplicemente static prima del property e function;