Olmayan statik yöntemi içinde statik örnekleri arasında paylaşılır

4 Cevap

Ben örnekleri arasında paylaşılan nesne yöntemleri içinde tanımlanmış statik değişkenler ile bazı beklenmeyen davranış geldim. Bu muhtemelen bilinen davranıştır, ama ben PHP belgelerine göz gibi nesne yöntemleri içinde statik olarak tanımlanan değişkenler örneklerini bulamıyorum.

İşte ben geldim davranış bir azalma olduğunu:

<?php

class Foo {
  public function dofoo() {
    static $i = 0;
    echo $i++ . '<br>';
  }
}

$f = new Foo;
$g = new Foo;

$f->dofoo(); // expected 0, got 0
$f->dofoo(); // expected 1, got 1
$f->dofoo(); // expected 2, got 2

$g->dofoo(); // expected 0, got 3
$g->dofoo(); // expected 1, got 4
$g->dofoo(); // expected 2, got 5

Şimdi, $i statik olması per instance umuyordum, ama gerçekte $i örnekleri arasında paylaşılır. Kendi merakım için, kimse bu durumda neden ayrıntılı olabilir ve nerede php.net belgelenmiştir oluyor?

4 Cevap

Bu very definition statik değildir.

Eğer üye bir nesnenin örneğine özgü olmak istiyorsanız, o zaman kullanabilirsiniz class properties

örneğin

<?php

class Foo
{
    protected $_count = 0;
    public function doFoo()
    {
        echo $this->_count++, '<br>';
    }
}

Edit: Tamam, ben OOP statik özellikleri belgelerine bağlı. Kavram da aynıdır. Eğer variable scope dokümanlar okursanız görürsünüz:

Note: Statik bildirimler derleme sırasında çözümlenir.

(Yürütür önce) script derlenmiş Böylece statik "setup" (kullandığınızdan emin değil ne terim) 'dir. Bu işlev "inşa" ne zaman olursa olsun örneğini kaç nesneleri, statik değişken herkes gibi aynı kopyasını başvuruyor.

Yani sınıfın tüm örnekleri arasında aynı değişken var, statik budur.

Değişken sınıfın örneğinin özel bir üyesi olduğunu bu yüzden bu yazmak istiyorum.

class Foo {
  private $i = 0;
  public function dofoo() {
    echo $this->i++ . '<br>';
  }
}

Static anahtar sözcüğü with variables kullanılan veya kullanılabilecek with class methods and properties. Statik değişkenler (Ben, daha önce olmuş olabileceğini düşünüyorum) PHP 4 tanıtıldı. Statik sınıf üyeleri / yöntem PHP 5 tanıtıldı.

Yani, kılavuzda başı, statik bir değişken

Another important feature of variable scoping is the static variable. A static variable exists only in a local function scope, but it does not lose its value when program execution leaves this scope.

Bu açıklanan davranışı ile uyuşmaktadır. Eğer bir örneği başına değişken istiyorsanız, normal bir sınıf üyesi kullanılır.

Ben PHP'nin dokümantasyon "kapsam" a statik olmayan yöntem içinde bir statik değişken için anlamı tam olarak ne yeterince açık olmadığını kabul ediyorsunuz.

(Hobodave gösterir gibi) "statik" generally "sınıf başına" anlamına gelir, fakat statik sınıf özellikleri (non içinde not tam olarak aynı şey gibi statik değişkenler olduğu doğrudur tabii ki statik) yöntemi olup, bu ikincisi) (bir sınıfta her yöntem kendi statik $ foo değişkeni olabilir yöntemiyle "kapsamlı", ama $ foo adında çok statik bir sınıf üyesi de olabilir vardır.

Ve ben PHP 5 davranış is tutarlı ("statik" her zaman "sınıf başına bir ortak örneği" anlamına gelir) rağmen, not tek yol olduğunu iddia ediyorum PHP {[( 2)]} davranırlar.

Örneğin, çoğu insan işlev çağrıları arasında durumunu devam statik işlev değişkenleri kullanmak, ve küresel işlevler için PHP davranışı çoğu herkes beklediğiniz tam olarak ne olduğunu. Yani yöntem çağırma karşısında belirli yöntem değişkenlerin durumunu korur ve "örneği başına" bunu yapar ve ben de yerel bir yöntem değişken static olarak tanımlanan ilk defa gerçekleşmesi beklediğim aslında bir PHP yorumlayıcı hayal etmek kesinlikle mümkün .