Sorun giderme "Bileşik olmayan ada sahip use deyiminin etkisi yok"


97

use Blog;En üste koyduğumda bu hatayı alıyorum .

Uyarı: Bileşik olmayan 'Blog' isimli use ifadesinin ...

Blog 3 sınıfa sahip olduğum ad alanım: Makale, Liste ve Kategori ve birkaç işlev.

Durumumu değiştirirsem use Blog\Article;işe yarıyor ...

Kullanmak istediğim ad alanlarını belirtemez miyim? Ders vermem gerekiyor mu?

Ya bu ad alanları içinde işlevlerim varsa? Onları ad alanının dışında aradığımda \Blog\, her birinin adının başına geçmek zorunda kalıyorum ...


hayır, herhangi bir çerçeve kullanmıyorum
thelolcat

1
namespace Sonra dosyamı açıkladığımda başıma geldiuse Blah; .
Derek Illchuk

Ayrıca, 'Blog'un zaten dahil edildiği ve ikinci kez kullanmaya çalıştığınız anlamına da gelebilir. Zincirin üst kısımlarına zaten dahil olan bir çerçeve kullanıyorsanız bu yaygındır.
Rhu

@DerekIllchuk, keşke bu oylayabileceğim bir cevap olsaydı. Beni çok fazla baş ağrısından kurtardı.
Çok deniyorum ama daha çok ağlıyorum

Yanıtlar:


90

PHP'ler useC ++ 'lar ile aynı değildir using namespace; bir ad alanını "içe aktarmanıza" değil, bir takma ad tanımlamanıza ve dolayısıyla ad alanı niteleyicisini tamamen çıkarmanıza izin verir .

Yani şunları yapabilirsiniz:

use Blog\Article as BA;

... kısaltmak için, ancak ondan tamamen kurtulamazsınız.


Sonuç olarak, use Blogişe yaramaz, ama yazabileceğine inanıyorum:

use \ReallyLongNSName as RLNN;

\Ayrıştırıcıyı ReallyLongNSNamebunun tam nitelikli olduğunu bilmeye zorlamak için burada bir satır aralığı kullanmanız gerektiğini unutmayın . Bu, Blog\Articleaçıkça bir ad alanları zinciri olduğu için doğru değildir :

O Not isimalanlı adları için (örneğin ad ayırıcı içeren tam alanı isimleri, Foo\Bar gibi değil küresel isimler, aksineFooBar ), baştaki ters gereksizdir ithalat isimleri tam olmalıdır ve işlenmez önerilmez değil mevcut ad alanına göre.


22
Ah bu berbat. Yani useaslında işe yaramaz bir şey, bunun bir kısaltması da olabilir :)
thelolcat

1
@thelolcat: Kullanımları var ... sadece istediğin değil. :) O mu o sinir bozucu bir sınırlama olabilir gibi görünüyor.
Orbit'te Hafiflik Yarışları

7
Bu cevap yalnızca isim alanlı olmayan dosyalar için doğrudur. 1) İsim alanlı bir dosyada, useifadede baştaki \ kullanılmasına gerek yoktur , çünkü argümanları her zaman mutlak olarak görülür (yani, global isim alanından başlayarak). 2) use Blog;mutlaka işe yaramaz değildir: örneğin, isim alanlı bir dosyadan Blog\Util\CLI, bunun Blog\Entry::method()yerine yazmanıza olanak sağlar \Blog\Entry::method(). Bu gerçekten gerekli olduğundan değil, ama bir etkisi var. Bu kullanımın bir örneği için Nette çerçevesine bakın.
Zilk

24

Bu soru Google'da bu hatanın ilk sonucu olarak göründüğü için nasıl düzelttiğimi belirteceğim.

Temel olarak, bir çerçeveniz varsa, örneğin Yii2 gibi, aşağıdaki gibi sınıfları bildirmek zorunda kalmaya alışacaksınız:

use Yii;
use yii\db\WhatEver;

class AwesomeNewClass extends WhatEver
{
}

Use YiiBu sınıfın isim alanı olmadığı için bu hatayı alacaksınız .

Bu sınıfın isim alanı olmadığından, otomatik olarak global sembol tablosunu miras alır ve bu nedenle bu tanımlama gibi şeylere ihtiyaç duymaz, sadece onu kaldırın.


EVET! Bu çok mantıklıydı! :)
Mārtiņš Briedis

1
Benim için sorun, küresel isim alanından bir sembolü kullanmaya use \Passwordçalışmamdı , örneğin, ancak php bunu bir takma ad olmadan yapmaya çalıştığınızda bundan hoşlanmıyor, bu yüzden bile use \Password as Passwordgayet iyi çalışıyor.
Kzqai

Moderatör ad alanlarının kullanımıyla ilgili daha genel bir cevap ararken OOD kullanımını önerdiği için olumsuz oy verildi.
Josh Habdas

1
@JoshH ne diyorsun? Son cevabını bile almadım. Bunu söyleyerek gitmiş bazı moderatör cepten trolling hakkında bazı adamın bağlantısını vermek için arıyordu değil ne
Sammaye

1
@JoshH (BTW, insanların bir soruyu yanıtlamak için böyle düşünceli bloglara yetkili materyal olarak atıfta bulunmasından nefret ediyorum)
Sammaye

6

usePHP'de ifadesi gerçekten takma adıma sadece bir kolaylık okumak için biraz daha kolay olabilir içine bir şey uzun bir ad alanıdır. Aslında, kolaylık sağlamanın yanı sıra gelişiminizi etkileyen herhangi bir dosya içermez veya başka bir şey yapmaz. Çünkü, Bloghiçbir kolaylık kazanmadığınız bir şey olarak isimlendirilmediğinden. Gibi bir şey yapabileceğini hayal edebiliyorum

use \Blog as B;

Ve bu bile işe yarayabilir. ( Örtünerek burada rahatlığınızı gerçekten kaybettiğiniz söylenebilir, ancak soru bununla ilgili değil ) Çünkü aslında Blogad alanını başka bir şeye değiştiriyorsunuz. Blog\ArticleÇalışmaları kullanmak , çünkü belgelere göre:

// this is the same as use My\Full\NSname as NSname
use My\Full\NSname;

Yani pasajınız şuna eşdeğer olacaktır:

use Blog\Article as Article;

1
BAktif olarak sürdürülemez bir kod yazmadığınız veya başkalarının baş ağrısına neden olmayı kesinlikle istemediğiniz sürece lütfen hiçbir şeyi aramayın .
Josh Habdas

2

Sınıf tanımından önce bir özelliği kullanmaya çalışırsanız, "use deyiminin ... etkisi yoktur ..." hatası da ortaya çıkar.

use My_trait; // should not be here

class My_class{
// use My_trait; should be here instead
}

2

gibi 'as' sözdizimini kullanmak istemiyorsanız

use \Blog as B;

dosya için bir ad alanı tanımlayın

namespace anyname;

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