Bagaimana saya menambahkan sebagian namespacing PHP ke perpustakaan tanpa melanggar kode yang ada?


10

Perusahaan saya telah menciptakan kerangka kerja PHP modular selama bertahun-tahun, dimulai jauh sebelum PHP 5.3 menambahkan ruang nama. Baru-baru ini, kami memutuskan untuk mulai menggunakan namespace dalam kode baru perpustakaan kami, dan kami berniat untuk akhirnya mengganti kode lama. Namun, kami memiliki beberapa masalah yang kami coba selesaikan untuk menentukan apakah menambahkan ruang nama ke basis kode pre-v5.3 bukan ide yang bagus:

  1. Bisakah saya namespace kelas tetapi juga mengimpor (menggunakan) namespace global sehingga semua kelas global tidak perlu \awalan?
  2. Jika kita menamai kelas yang ada di pustaka kita, bagaimana kita bisa mencegah semua proyek yang ada dari kerusakan segera setelah kerangka kerja ditingkatkan? Sebagai contoh, bisa perubahan perpustakaan nama kelas ThemeEngineuntuk \module\theme\ThemeEngine, tetapi website yang ada memanggil ThemeEnginetanpa setiap modifikasi kode? Jika demikian, seperti apa kode itu?

Jawaban:


2
  1. Anda tidak dapat 'menggunakan' ruang nama sama sekali, sayangnya, hanya kelas: http://www.php.net/manual/en/language.namespaces.importing.php . Sunting: Anda dapat mengimpor kelas dari namespace global, seperti yang mereka lakukan dengan ArrayObject di salah satu contoh.

  2. Anda bisa memiliki bagian global dari pernyataan penggunaan sehingga semua kelas yang sudah ada, yang berada di namespace global juga, secara teoritis harus menemukan kelas-kelas itu saja. Secara teoretis...

Kami berada di kapal yang sama dengan Anda, semacam. Kami memiliki beberapa kode lama yang tidak menggunakan namespaces, tetapi menggunakan _ namespace faker (seperti Zend_Db_Table ...) dan kami memiliki beberapa kode lama yang bahkan tidak memalsukan ruang nama. Kita mungkin akan mengambil rute yang sama, tetapi kita masih perlu menguji apakah itu mungkin sama sekali. Semoga berhasil!


1

Ya apa yang saya lakukan pada akhirnya adalah menggunakan - 'gunakan' untuk mengimpor masing-masing kelas yang saya butuhkan

misalnya alih-alih menambahkan '/' di depan semuanya seperti:

\DateTime()

Saya menambahkan di bawah namespace saya

namespace MyProject;
use DateTime;

...
DateTime();     //without \
...
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.