PHP Ölümcül hata: $ bu zaman kullanma değil nesne bağlamında

5 Cevap class

Ben bir sorun var:

Ben bir Framework olmadan yeni WebApp yazıyorum.

In my index.php im using: require_once('load.php'); and in * load.php* I'm using require_once('class.php'); to load my class.php.

Benim in class.php Ben bu hatayı var:

Ölümcül hata: $ bu zaman kullanma değil on line class.php nesne bağlamında ... (bu örnekte 11 olurdu)

Bir örnek nasıl benim class.php yazılır:

class foobar {

    public $foo;

    public function __construct() {
        global $foo;

        $this->foo = $foo;
    }

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

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

Benim index.php I foobarfunc() Bunun gibi belki yükleme ediyorum:

foobar::foobarfunc();

ama aynı zamanda olabilir,

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

Neden hata geliyor?

5 Cevap

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

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

ama aynı zamanda olabilir,

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

Statik bir yöntem değildir çünkü yöntemini bu şekilde çağırmak olamaz.

foobar::foobarfunc();

Bunun yerine kullanmak gerekir:

foobar->foobarfunc();

: Ancak statik bir metod gibi bir şey oluşturduk varsa

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

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

o zaman bu kullanabilirsiniz:

foobar::foobarfunc();

Eğer statik olmayan bir yöntem çağırıyor:

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

Statik çağrısı kullanarak:

foobar::foobarfunc();

Statik çağrısı kullanırken, işlev çağrılır (even if not declared as static) , but, as there is no instance of an object, there is no $this.

Yani:

  • Sen statik olmayan yöntemler için statik çağrıları kullanmamalıdır
  • Statik-çağrılarını kullanarak bittiğinde hiçbir sınıf örneği olduğu gibi statik yöntemleri (veya statik olarak adlandırılan yöntemler), normalde sınıfın geçerli örneğine işaret $ olan bu kullanamazsınız.


Here, the methods of your class are using the current instance of the class, as they need to access the $foo property of the class.

Bu yöntemleri sınıfının bir örneğini gerekiyor demektir - statik olamaz anlamına gelir.

Eğer kod son bölümünde yaptığımız gibi, sınıf instanciate ve yöntemlerini çağırmak için nesne kullanmanız gerekir: Bu statik aramaları kullanmak gerektiği anlamına gelir:

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


For more informations, don't hesitate to read, in the PHP manual :


Also note that you probably don't need this line in your __construct method :

global $foo;

Visibile bu yöntemle içeriden global anahtar will make the $foo değişkeni, tüm fonksiyonları ve sınıfları dışında ilan, kullanma ... Ve muhtemelen yok böyle bir {[(2)] } değişken.

Erişmek için $foo class-property, sadece yaptığın gibi, $this->foo kullanmanız gerekir.

Eğer resolution scope operator (::), daha sonra statically, örneğin çağırıyoruz ile foobarfunc çağrılırken ise sınıf düzeyinde yerine örneği düzeyinde, böylece using $this zaman nesne bağlamında . $this sınıf bağlamında yok değildir.

Eğer E_STRICT etkinleştirmek, PHP bu konuda bir Bildirimi çıkaracağız:

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

Yerine bunu

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

Bir dipnot düşmek, ben senin sınıfları içinde global kullanmak için değil öneririz. Eğer dışında sınıf içinde bir şey gerekiyorsa, kurucusuna geçirin. Bu Dependency Injection denir ve bu kod çok daha rahat ve dış şeyler daha az bağımlı hale getirecek.

Eğer statik bir bağlamda işlevini çağırdığınızda, $this sadece yok.

Yerine this::xyz() kullanmak gerekir.

Eğer bir fonksiyon hem statik ve bir nesne örneği denebilecek zaman konum ne bağlam öğrenmek için iyi bir yaklaşım, bu soruya özetlenmiştir: How to tell whether I’m static or an object?

$foobar = new foobar; $ Foobar'ın put in the class foobar, not the object. Nesneyi almak için, parantez eklemeniz gerekir: $foobar = new foobar();

Sizin hata bir sınıf üzerinde bir yöntem dediğimiz basitçe, böylece hiçbir $this $this yalnızca nesnelerin var beri var.