Neden PHP statik özellikleri aşırı yüklemek için bir tesis yok?


13

giriş

PHP, sınıflardaki sihirli yöntemleri bildirerek yöntem çağrılarını ve özellik erişimlerini aşırı yüklemenize izin verir . Bu, aşağıdaki gibi kodları etkinleştirir:

class Foo {
    public function __get($name) { return 42; }
}

$foo = new Foo;
echo $foo->missingProperty; // prints "42"

PHP 5.3.0 sürümünden bu yana, özellik özelliklerini ve yöntemlerini aşırı yüklemenin yanı sıra static, sihirli yöntemi geçersiz kılarak yöntem çağrılarını da aşırı yükleyebiliriz __callStatic.

Eksik bir şey

Mevcut işlevsellikte dikkat çekici bir şekilde eksik olan şey, statik özellikleri aşırı yükleme yeteneğidir , örneğin:

echo Foo::$missingProperty; // fatal error: access to undeclared static property

Bu sınırlama açıkça belgelenmiştir :

Özellik aşırı yüklenmesi yalnızca nesne bağlamında çalışır. Bu sihirli yöntemler statik bağlamda tetiklenmeyecektir. Bu nedenle, bu yöntemler bildirilmemelidir static. PHP 5.3.0'dan itibaren, sihirli aşırı yükleme yöntemlerinden biri bildirilirse bir uyarı verilir static.

Ama neden?

Sorularım:

  1. Bu işlevin şu anda desteklenmemesinin teknik bir nedeni var mı? Ya da belki de (titrek) bir siyasi neden?
  2. Geçmişte bu işlevselliği eklemek için iptal edilmiş herhangi bir girişim var mı?

En önemlisi, soru "nasıl kullanıcı PHP PHP dinamik statik özelliklere sahip olabilir?" Değil . Bununla birlikte, __callStaticpaylaşmak istediğinize dayalı özellikle sevimli bir uygulama biliyorsanız, elbette bunu yapın.

Yanıtlar:


11

Alıntı yapma http://marc.info/?l=php-internals&m=121578194822276&w=2

PHP 5.3'te statik üye aşırı yüklemesi eklendi mi? Statik yöntem aşırı yüklenmesinin (__callStatic) olduğunu fark ettim. İkisi birbirini tamamlar ve bunları da eklemek doğaldır. "Statik-sınıf" RFC ve bir hata raporu dışında olduklarını fark ettim, ancak bunları 5.3'te görmek güzel olurdu. Bu ekleme ve LSB ile php sınıfları çok şey yapabilir! Ör:

__setStatic()
__getStatic()
__issetStatic()
__unsetStatic()

Alıntıdan alıntı http://marc.info/?l=php-internals&m=121578318524848&w=2

statik sınıflar için RFC kabul edilecekse, statik özellik önleyicileri bir sonraki PHP ana sürümünün bir parçası olacaktır (5.4 veya 6 olabilir). Bu yüzden bunu 5.3'e dönüştürmeyecek, ancak umarım gelecekte buna sahip olacağız.

Statik Sınıflar RFC bağlantısı:

RFC'nin durumu "işlerde" dir ancak 2008'den beri göz önüne alındığında php.internals posta listesinde veya EFNet IRC'de # php.pecl'de ne olduğunu öğrenmek isteyebilirsiniz.


Teşekkürler, Gordon, her zamanki gibi çok yararlı. ;-) Static Classes RFC , statik sınıflar için __getStatic()ve statik sınıflar için destek öneriyor gibi görünse de, bu işlevselliğin anlık sınıflar için olması yine de yararlı olacaktır. Bu yönde herhangi bir hamlenin farkında mısınız? __setStatic()
David Weinraub

@DavidWeinraub hayır, üzgünüm. Tbh, statik yöntemlerle ilgili şeyleri umursamıyorum. Neredeyse hiçbir zaman onlar için iyi bir kullanım bulamıyorum ve kötü bağlantı ve ağrılı testlere yol açıyorlar.
Gordon

Kesinlikle katılıyorum! ;-) Ama üzerime itilen bazı çerçeveler, model katmanları için statik kullanırlar. __getStatic()mevcut kodumun birçoğunu KURMAMI sağlar. Teşekkürler!
David Weinraub
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.