Mengapa tidak ada fasilitas untuk membebani properti statis di PHP?

13

Intro

PHP memungkinkan Anda untuk membebani panggilan metode dan akses properti dengan mendeklarasikan metode ajaib di kelas. Ini memungkinkan kode seperti:

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

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

Terlepas dari kelebihan instance properti dan metode, karena PHP 5.3.0 kita juga bisa membebani staticpanggilan metode dengan mengganti metode ajaib __callStatic.

Sesuatu yang hilang

Apa yang jelas hilang dari fungsionalitas yang tersedia adalah kemampuan untuk membebani properti statis , misalnya:

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

Batasan ini jelas didokumentasikan :

Properti overloading hanya berfungsi dalam konteks objek. Metode ajaib ini tidak akan dipicu dalam konteks statis. Oleh karena itu metode ini tidak boleh dinyatakan static. Pada PHP 5.3.0, peringatan dikeluarkan jika salah satu metode overloading ajaib dinyatakan static.

Tapi kenapa?

Pertanyaan saya adalah:

  1. Apakah ada alasan teknis bahwa fungsi ini saat ini tidak didukung? Atau mungkin alasan politik (ngeri)?
  2. Pernahkah ada upaya yang dibatalkan untuk menambahkan fungsi ini di masa lalu?

Yang paling penting, pertanyaannya bukan "bagaimana saya bisa memiliki properti statis dinamis di userland PHP?". Yang mengatakan, jika Anda mengetahui implementasi yang sangat lucu berdasarkan pada __callStaticyang ingin Anda bagikan maka tentu saja melakukannya.

Jon
sumber

Jawaban:

11

Mengutip http://marc.info/?l=php-internals&m=121578194822276&w=2

Apakah kelebihan anggota statis ditambahkan dalam PHP 5.3? Saya perhatikan bahwa metode statis overloading adalah (__callStatic). Keduanya akan saling melengkapi dan sepertinya wajar untuk menambahkan ini juga. Saya memang memperhatikan bahwa mereka terpisah dari "kelas statis" RFC dan laporan bug, tetapi akan menyenangkan untuk melihatnya di 5.3. Dengan tambahan ini dan LSB, kelas php dapat melakukan banyak hal! Ex:

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

Mengutip tindak lanjut http://marc.info/?l=php-internals&m=121578318524848&w=2

jika RFC untuk kelas statis akan diterima, pencegat properti statis akan menjadi bagian dari versi utama PHP berikutnya (mungkin versi 5.4 atau 6). Jadi itu tidak akan menjadi 5.3, tapi kami akan berharap di masa depan.

Tautan ke Kelas Statis RFC:

Status RFC adalah "dalam karya" tetapi mengingat bahwa ini berasal dari 2008 Anda mungkin ingin bertanya di milis php.internals atau di # php.pecl di EFNet IRC untuk mengetahui apa yang terjadi.

Gordon
sumber
Terima kasih, Gordon, sangat membantu, seperti biasa. ;-) Sementara Kelas Statis RFC tampaknya mengusulkan dukungan untuk __getStatic()dan __setStatic()pada kelas-kelas statis , masih berguna untuk memiliki fungsi ini untuk kelas-kelas instantiable. Apakah Anda mengetahui adanya gerakan ke arah ini?
David Weinraub
@ Davidvid, tidak, maaf. Tbh, saya tidak peduli tentang hal-hal yang berkaitan dengan metode statis. Saya hampir tidak pernah menemukan penggunaan yang baik untuk mereka dan mereka menyebabkan pengujian yang buruk dan menyakitkan.
Gordon
Sangat setuju! ;-) Tetapi beberapa kerangka kerja yang didorong pada saya menggunakan statika untuk lapisan model mereka. __getStatic()akan memungkinkan saya untuk KERING banyak kode saya yang ada. Terima kasih!
David Weinraub