2015-04-29 30 views
11

sınıfında statik ve statik bir işlev çağırma Bu sorunun dil meraklılarına daha fazla bağlı olduğunu düşünüyorum.Bir özet,

<?php 
abstract class ScopeFactory 
{ 
    public static function doStuff() 
    { 

    } 
} 

Şimdi, bu yüzden gibi bu işlevi çağırmak mümkün değilim: Ben şu sınıf var

ScopeFactory::doStuff()

Ve bu mutlu çalışır. Her zaman, abstract sınıflarının doğrudan kullanılamadığı izlenimi altında kodlanmıştım - ve bunların, kalibre edilebilmesi için somut bir sınıf tarafından uygulanması gerekiyor.

static ile ilgili izlenimlerim, örnek'un callable olmasını gerektirmez.

Birisi bana bunun neden yasal olduğunu açıklayabilir mi ve eğer olması gerekiyorsa? Daha ince detayları merak ediyorum.

+1

Evet, statik bir yöntem sınıf örneğiyle aynı yerde saklanmaz (örnek! = Bildirim). Bu size ipuçları verecektir: http://stackoverflow.com/questions/17407203/can-we-use-static-method-in-an-abstract-class –

cevap

6

OOP'taki statik yöntemler dahili durumu değiştirmez, bu nedenle soyut bir sınıftan statik yöntemleri çağırabilirsiniz.

+0

Ben (düşük düzeyde) bilmek isterim Bu PHP çalışma zamanında uygulanır - herhangi bir anlayış? Ve * iç devlet * ile mi demek istiyorsunuz? * Soyut sınıfın içsel durumu *? – infomaniac

+0

Dahili durumla, sadece dahili durumu kastediyorum. Statik yöntemler dahili bir şeyi kaydetmemeli, böylece dahili durumu değiştirmemelidir. Örneğin. Sadece bir giriş yapın, bir şeyler yapın ve aynı girişle aynı sonucu elde edin. Genel PHP fonksiyonları gibi statik yöntemleri tehdit edebilirsiniz. –

4

İzin verilmezse şaşırırım. Soyut sınıf, onu başaramayacağınızı varsayar. Statik yöntemler bir sınıf örneğine ihtiyaç duymadığından, bunları mutlu bir şekilde kullanabilirsiniz.

derin bakıyor, bir soyut statik yöntem oluşturmak ve olmayan soyut yönteminden diyebiliriz:

abstract class ScopeFactory 
{ 
    public static function doStuff() 
    { 
     static::otherStuff(); 
    } 

    abstract public static function otherStuff(); 
} 

PHP soyut bir yöntemini çağırın söyleyerek size önemli bir hatayla verecektir. Fakat aynı zamanda soyut statik yöntemler oluşturmamanız gerektiğini belirten bir E_STRICT uyarısı verecektir.