PHP statik yöntem statik olmayan yöntemi ile herhangi bir fark var mı?

5 Cevap php
class t {
    public function tt()
    {
        echo 1;
    }
}
t::tt();

Statik olmayan fonksiyonu da daha önce bir static anahtar kelimesini eklerseniz farklı ne level.So sınıfı denebilecek? Bak public?

5 Cevap

Bunun dışında, bu gibi, yönteminiz $this kullanmaya çalışırsanız:

class t {
    protected $a = 10;
    public function tt() {
        echo $this->a;
        echo 1;
    }
}
t::tt();

Statik statik olmayan yöntem çağırırken bir Ölümcül Hata alırsınız:

Fatal error: Using $this when not in object context in ...\temp.php on line 11

yani sizin örnek biraz too simple, ve gerçekten bir gerçek durum ile uyuşmuyor ;-)


Also note that your example should get you a strict warning (quoting) :

Calling non-static methods statically generates an E_STRICT level warning.

Ve aslında yapar (At least, with PHP 5.3):

Strict Standards: Non-static method t::tt() should not be called statically in ...\temp.php on line 12
1

Yani: ;-) iyi değil


Still, statically calling a non-static method doesnt't look like any kind of good practice (which is probably why it raises a Strict warning), as static methods don't have the same meaning than non-static ones : static methods do not reference any object, while non-static methods work on the instance of the class there're called on.


Once again : even if PHP allows you to do something (Maybe for historical reasons -- like compatibility with old versions), it doesn't mean you should do it !

Static Keyword

Statik yöntemler yaratılan nesnenin bir örneği olmadan çağrılabilir olduğundan, bu yöntem içinde mevcut değildir sözde değişken $ gibi statik ilan etti.

> - Statik özellikler ok operatörünü kullanarak nesnesi üzerinden erişilebilir olamaz.

Statik olmayan yöntemleri çağırmadan statik bir E_STRICT düzeyinde uyarı oluşturur.

Sadece statik statik olmayan yöntemleri çağırabilir çünkü gerektiği anlamına gelmez. Bu kötü formudur.

Bir statik olmayan yöntemi de object method ya da instance method denir iken Genel olarak, statik bir yöntem de class method adlandırılır.

Bir sınıf yöntemi ve bir nesne yöntemi arasındaki fark nesne yöntemleri nesne özelliklerini (aynı sınıf örneğinin özellikleri) erişmek için kullanılır ise bu sınıfın yöntemleri, yalnızca sınıf özellikleri (statik özellikleri) ulaşabiliyor.

Statik yöntemler ve özellikleri bu özel sınıfın tüm örnekleri üzerinde veya ortak verileri paylaşmak için kullanılır.

Siz, örneğin, örnek sayısına izlemek için statik bir özellik kullanabilirsiniz:

class A {
    private static $counter = 0;

    public function __construct() {
        self::counter = self::counter + 1;
    }

    public function __destruct() {
        self::counter = self::counter - 1;
    }

    public static function printCounter() {
        echo "There are currently ".self::counter." instances of ".__CLASS__;
    }
}

$a1 = new A();
$a2 = new A();
A::printCounter();
unset($a2);
A::printCounter();

Statik özelliği counter özel yani sadece sınıfın kendisi ve o sınıfın örnekleri değil, dışarıdan ulaşılabilir olduğunu unutmayın.

Söz edilmemiştir bir temel fark polymorphic behavior ile ilgilidir.

Sigara statik yöntemler, türetilmiş bir sınıfta redeclared zaman, temel sınıf yöntemi geçersiz kılmak ve onlar üzerinde denir örneğinin türüne göre polimorfik davranış sağlar. This is not the case for static methods.


PHP 5.3 late static binding, hangi statik miras bağlamında denilen sınıf başvurmak için kullanılır olabilir kavramını tanıttı.

Evet, kritik fark ilan yöntemleri static, $this nesne-bağlam değişkene erişim yok olmasıdır.

Ayrıca, statik olmayan yöntemle değil nesne bağlamında çağırma bir E_STRICT hata olayı tetikler. Etkinleştirildiğinde, bu olayın varsayılan davranışı çıkışı hata günlüğüne (veya STDERR) bir mesajdır, ama it will allow the program to continue running.

Ayrıca, bir nesne bağlamında bir E_ERROR olayı tetikleyecek değil zaman $this başvurmak için herhangi bir girişimi. Bu olayın davranış çıkışı hata günlüğüne (veya STDERR) için bir mesaj olduğunu ve durumu 255 ile programa çıkmak için.

Örneğin:

<?php
error_reporting(-1);
//error_reporting(E_ALL);

class DualNature {
  public static function fnStatic() {
    if ( isset( $this ) ) {
      // never ever gets here
      $myValue = $this->_instanceValue;
    } else {
      // always gets here
      $myValue = self::$_staticValue;
    }
    return $myValue;
  }

  public function fnInstance() {
    if ( isset( $this ) ) {
      // gets here on instance (->) reference only
      $myValue = $this->_instanceValue;
    } else {
      // gets here in all other situations
      $myValue = self::$_staticValue;
    }
    return $myValue;
  }

  public static function fnStaticDeath() {
    return $this->_instanceValue;
  }

  private static $_staticValue = 'no access to $this';
  private $_instanceValue = '$this is available';

}

$thing = new DualNature();
echo "==========\n";
printf("DualNature::fnStatic(): \"%s\"\n", DualNature::fnStatic() );
echo "==========\n";
printf("\$thing::fnStatic(): \"%s\"\n", $thing::fnStatic() );
echo "==========\n";
printf("\$thing->fnStatic(): \"%s\"\n", $thing->fnStatic() );
echo "==========\n";
printf("DualNature::fnInstance(): \"%s\"\n", DualNature::fnInstance() );
echo "==========\n";
printf("\$thing::fnInstance(): \"%s\"\n", $thing::fnInstance() );
echo "==========\n";
printf("\$thing->fnInstance(): \"%s\"\n", $thing->fnInstance() );
echo "==========\n";
printf("\$thing->fnStaticDeath(): \"%s\"\n", $thing->fnStaticDeath() );
echo "==========\n";
echo "I'M ALIVE!!!\n";

Yukarıdakilerin çıktı:

==========
PHP Strict Standards:  Non-static method DualNature::fnInstance() should not be called statically in example.php on line 45
DualNature::fnStatic(): "no access to $this"
==========
$thing::fnStatic(): "no access to $this"
==========
$thing->fnStatic(): "no access to $this"
PHP Strict Standards:  Non-static method DualNature::fnInstance() should not be called statically in example.php on line 47
==========
DualNature::fnInstance(): "no access to $this"
==========
$thing::fnInstance(): "no access to $this"
==========
$thing->fnInstance(): "$this is available"
==========
PHP Fatal error:  Using $this when not in object context in example.php on line 29

Için hata raporlama seviyesini değiştirme E_ALL varsayılan E_STRICT uyarı mesajları (olay hala yayılır olacak), ancak $this hala neden olacaktır için geçersiz başvuru bastırır önemli bir hata ve programdan çıkmak olacaktır.