Memecahkan masalah "Pernyataan penggunaan dengan nama bukan gabungan ... tidak berpengaruh"


97

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 ...


tidak, saya tidak menggunakan framework apa pun
thelolcat

1
Terjadi pada saya ketika saya mendeklarasikan file saya namespace setelahnya use Blah; .
Derek Illchuk

Ini juga bisa berarti bahwa 'Blog' sudah dimasukkan dan Anda mencoba menggunakannya untuk kedua kalinya. Ini biasa terjadi jika Anda menggunakan kerangka kerja yang sudah menyertakannya di bagian atas rantai.
Rhu

@DerekIllchuk andai saja ini bisa menjadi jawaban yang bisa saya upvote. Menyelamatkan saya dari banyak sakit kepala.
Saya berusaha sangat keras tetapi saya menangis lebih keras

Jawaban:


90

PHP usetidak 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 Blogtidak berguna, tapi saya yakin Anda bisa menulis:

use \ReallyLongNSName as RLNN;

Perhatikan bahwa Anda harus menggunakan awalan di \sini untuk memaksa parser mengetahui bahwa ReallyLongNSNamesepenuhnya memenuhi syarat. Ini tidak benar untuk Blog\Article, yang jelas sudah menjadi rantai ruang nama:

Perhatikan bahwa untuk nama dengan spasi nama ( nama namespace yang memenuhi syarat yang berisi pemisah namespace, seperti Foo\Bar kebalikan dari nama global yang tidak, sepertiFooBar ), garis miring terbalik di depan tidak diperlukan dan tidak disarankan, karena nama impor harus sepenuhnya memenuhi syarat, dan tidak diproses relatif terhadap namespace saat ini.


22
Ah itu menyebalkan. Jadi usehal itu sebenarnya tidak berguna, mungkin juga merupakan akronim untuk itu :)
thelolcat

1
@thelolcat: Ada kegunaannya ... hanya saja bukan yang Anda inginkan. :) Ini tidak tampak seperti itu bisa menjadi batasan menjengkelkan.
Balapan Ringan di Orbit

7
Jawaban ini hanya benar untuk file yang tidak memiliki spasi nama. 1) Dalam file dengan namespace, tidak perlu menggunakan awalan \ dalam usepernyataan, karena argumennya selalu dilihat sebagai absolut (yaitu, mulai dari namespace global). 2) use Blog;tidak selalu tidak berguna: misalnya, dari file dengan namespace seperti Blog\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.
Zilk

24

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 Yiiini 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.


IYA! Ini semua masuk akal! :)
Mārtiņš Briedis

1
Bagi saya, masalahnya adalah saya mencoba menggunakan simbol dari namespace global, misalnya use \Passwordtetapi php tidak menyukainya ketika Anda mencoba melakukannya tanpa alias, jadi bahkan use \Password as Passwordberfungsi dengan baik.
Kzqai

Tidak disukai karena menyarankan penggunaan OOD saat moderator mencari jawaban yang lebih umum terkait penggunaan namespace.
Josh Habdas

1
@JoshH apa yang kamu tentang? Saya bahkan tidak mendapatkan balasan terakhir Anda. Anda telah beralih dari mengatakan bahwa bukan itu yang dicari oleh beberapa moderator menjadi memberikan tautan beberapa pria tentang OOP trolling
Sammaye

1
@JoshH (BTW, saya benci jika orang merujuk blog beropini seperti itu sebagai bahan otoritatif untuk menjawab pertanyaan)
Sammaye

6

The usepernyataan 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, Blogtidak alias sebagai apa pun yang Anda tidak mendapatkan kenyamanan apa pun. Saya bisa membayangkan Anda bisa melakukan sesuatu seperti

use \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 Blognamespace ke sesuatu yang lain. Menggunakan Blog\Articleberfungsi 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;

1
Tolong jangan pernah menelepon apa pun Bkecuali Anda secara aktif menulis kode yang tidak dapat dipertahankan atau sangat ingin membuat orang lain pusing.
Josh Habdas

2

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
}

2

jika Anda tidak ingin menggunakan 'sebagai' sintaks seperti

use \Blog as B;

tentukan namespace untuk file tersebut

namespace anyname;

use Blog
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.