Mendapatkan kesalahan ini ketika saya meletakkan use Blog;
di atas.
Peringatan: Pernyataan penggunaan dengan nama bukan gabungan 'Blog' tidak berpengaruh pada ...
Blog
adalah namespace saya di mana saya memiliki 3 kelas: Artikel, Daftar dan Kategori dan beberapa fungsi.
Jika saya mengubah status saya menjadi use Blog\Article;
maka itu berhasil ...
Tidak bisakah saya menentukan namespace yang ingin saya gunakan? Apakah saya perlu memberikan kelas?
Bagaimana jika saya memiliki fungsi dalam ruang nama itu? Ketika saya memanggil mereka di luar namespace, saya terpaksa menambahkan \Blog\
nama masing-masing ...
php
namespaces
thelolcat
sumber
sumber
namespace
setelahnyause Blah;
.Jawaban:
PHP
use
tidak sama dengan C ++using namespace
; ini memungkinkan Anda untuk mendefinisikan sebuah alias , bukan untuk "mengimpor" sebuah namespace dan karena itu menghilangkan qualifier namespace sama sekali.Jadi, Anda bisa melakukan:
use Blog\Article as BA;
... untuk mempersingkatnya, tetapi Anda tidak dapat menghilangkannya sepenuhnya.
Akibatnya,
use Blog
tidak berguna, tapi saya yakin Anda bisa menulis:use \ReallyLongNSName as RLNN;
Perhatikan bahwa Anda harus menggunakan awalan di
\
sini untuk memaksa parser mengetahui bahwaReallyLongNSName
sepenuhnya memenuhi syarat. Ini tidak benar untukBlog\Article
, yang jelas sudah menjadi rantai ruang nama:sumber
use
hal itu sebenarnya tidak berguna, mungkin juga merupakan akronim untuk itu :)use
pernyataan, karena argumennya selalu dilihat sebagai absolut (yaitu, mulai dari namespace global). 2)use Blog;
tidak selalu tidak berguna: misalnya, dari file dengan namespace sepertiBlog\Util\CLI
, ini akan memungkinkan Anda untuk menulis,Blog\Entry::method()
bukan\Blog\Entry::method()
. Bukan berarti ini benar-benar perlu, tetapi ada efeknya. Untuk contoh penggunaan ini, lihat framework Nette.Karena pertanyaan ini muncul sebagai hasil pertama di Google untuk kesalahan ini, saya akan menyatakan cara saya memperbaikinya.
Pada dasarnya jika Anda memiliki kerangka kerja, katakanlah seperti Yii2 Anda akan terbiasa melakukan deklarasi kelas seperti:
use Yii; use yii\db\WhatEver; class AwesomeNewClass extends WhatEver { }
Anda akan mendapatkan kesalahan
Use Yii
ini karena kelas ini tidak memiliki namespace.Karena kelas ini tidak memiliki namespace, maka secara otomatis akan mewarisi tabel simbol global sehingga tidak perlu hal-hal seperti ini yang menentukan, hapus saja.
sumber
use \Password
tetapi php tidak menyukainya ketika Anda mencoba melakukannya tanpa alias, jadi bahkanuse \Password as Password
berfungsi dengan baik.The
use
pernyataan dalam PHP adalah benar-benar hanya untuk kenyamanan alias namespace panjang menjadi sesuatu yang mungkin sedikit lebih mudah dibaca. Itu tidak benar-benar menyertakan file apa pun atau melakukan hal lain, yang memengaruhi perkembangan Anda, selain memberikan kemudahan. Karena,Blog
tidak alias sebagai apa pun yang Anda tidak mendapatkan kenyamanan apa pun. Saya bisa membayangkan Anda bisa melakukan sesuatu sepertiuse \Blog as B;
Dan itu bahkan mungkin berhasil. ( Dapat dikatakan bahwa Anda benar-benar kehilangan kenyamanan di sini dengan mengaburkan tetapi bukan itu pertanyaannya ) Karena Anda sebenarnya menyamakan
Blog
namespace ke sesuatu yang lain. MenggunakanBlog\Article
berfungsi karena, menurut dokumen:// this is the same as use My\Full\NSname as NSname use My\Full\NSname;
Jadi cuplikan Anda akan sama dengan:
use Blog\Article as Article;
sumber
B
kecuali Anda secara aktif menulis kode yang tidak dapat dipertahankan atau sangat ingin membuat orang lain pusing.Kesalahan "Pernyataan penggunaan ... tidak berpengaruh ..." juga muncul jika Anda mencoba menggunakan sifat sebelum definisi kelas.
use My_trait; // should not be here class My_class{ // use My_trait; should be here instead }
sumber
jika Anda tidak ingin menggunakan 'sebagai' sintaks seperti
use \Blog as B;
tentukan namespace untuk file tersebut
namespace anyname; use Blog
sumber