การแก้ไขปัญหา“ คำสั่งการใช้งานที่ไม่มีชื่อผสม…ไม่มีผล”


97

ได้รับข้อผิดพลาดนี้เมื่อฉันวางไว้use Blog;ที่ด้านบน

คำเตือน: คำสั่งใช้ที่ไม่มีชื่อผสม 'Blog' ไม่มีผลใน ...

Blog คือเนมสเปซของฉันซึ่งฉันมี 3 คลาส: บทความรายการและหมวดหมู่และฟังก์ชันบางอย่าง

ถ้าฉันเปลี่ยนสถานะเป็นuse Blog\Article;มันก็ใช้ได้ ...

ฉันระบุเนมสเปซที่ต้องการใช้ไม่ได้หรือ ฉันต้องจัดชั้นเรียนหรือไม่?

จะเกิดอะไรขึ้นถ้าฉันมีฟังก์ชันภายในเนมสเปซนั้น เมื่อฉันเรียกพวกเขานอกเนมสเปซฉันถูกบังคับให้นำหน้า\Blog\ชื่อแต่ละคน ...


ไม่ฉันไม่ได้ใช้กรอบใด ๆ
thelolcat

1
เกิดขึ้นกับฉันเมื่อฉันประกาศไฟล์ของฉันnamespace หลังจาก use Blah; .
Derek Illchuk

นอกจากนี้ยังสามารถหมายความว่ามีการรวม "บล็อก" ไว้แล้วและคุณกำลังพยายามใช้เป็นครั้งที่สอง นี่เป็นเรื่องปกติหากคุณใช้เฟรมเวิร์กที่รวมไว้แล้วให้สูงขึ้นในห่วงโซ่
Rhu

@DerekIllchuk ถ้าเพียงแค่นี้อาจเป็นคำตอบที่ฉันสามารถโหวตได้ ช่วยให้ฉันปวดหัวมาก
ฉันพยายามมาก แต่ฉันร้องไห้หนักขึ้น

คำตอบ:


90

ของ PHP useไม่ได้เป็นเช่นเดียวกับ C ++ 's using namespace; ช่วยให้คุณสามารถกำหนดนามแฝงไม่ใช่ "นำเข้า" เนมสเปซและต่อจากนี้ไปจึงละเว้นคุณสมบัติเนมสเปซโดยสิ้นเชิง

ดังนั้นคุณสามารถทำได้:

use Blog\Article as BA;

... เพื่อทำให้สั้นลง แต่คุณไม่สามารถกำจัดมันได้ทั้งหมด


ดังนั้นuse Blogไม่มีประโยชน์ แต่ฉันเชื่อว่าคุณสามารถเขียน:

use \ReallyLongNSName as RLNN;

โปรดทราบว่าคุณต้องใช้เครื่องหมายนำหน้า\เพื่อบังคับให้ตัวแยกวิเคราะห์ทราบว่าReallyLongNSNameมีคุณสมบัติครบถ้วน สิ่งนี้ไม่เป็นความจริงBlog\Articleซึ่งเห็นได้ชัดว่าเป็นเครือข่ายของเนมสเปซ:

โปรดสังเกตว่าสำหรับชื่อเนมสเปซ ( ชื่อเนมสเปซแบบเต็มที่มีตัวคั่นเนมสเปซเช่นเมื่อFoo\Bar เทียบกับชื่อโกลบอลที่ไม่มีเช่นFooBar ) แบ็กสแลชนำหน้าไม่จำเป็นและไม่แนะนำเนื่องจากชื่ออิมพอร์ตต้องมีคุณสมบัติครบถ้วนและไม่ถูกประมวลผล สัมพันธ์กับเนมสเปซปัจจุบัน


22
อาที่ดูด ดังนั้นuseสิ่งนี้จึงไร้ประโยชน์จริง ๆ อาจเป็นตัวย่อของสิ่งนั้นก็ได้ :)
thelolcat

1
@thelolcat: มันมีประโยชน์ ... ไม่ใช่แค่ที่คุณต้องการ :) มันไม่ดูเหมือนมันอาจจะเป็นข้อ จำกัด ที่น่ารำคาญ
Lightness Races ใน Orbit

7
คำตอบนี้ถูกต้องสำหรับไฟล์ที่ไม่มีเนมสเปซเท่านั้น 1) ในไฟล์เนมสเปซไม่จำเป็นต้องใช้ \ นำหน้าในuseคำสั่งเนื่องจากอาร์กิวเมนต์จะถูกมองว่าเป็นค่าสัมบูรณ์เสมอ (กล่าวคือเริ่มจากเนมสเปซส่วนกลาง) 2) use Blog;ไม่จำเป็นต้องไร้ประโยชน์: ตัวอย่างเช่นจากไฟล์เนมสเปซBlog\Util\CLIมันจะช่วยให้คุณสามารถเขียนBlog\Entry::method()แทน\Blog\Entry::method()ไฟล์. ไม่ใช่ว่าสิ่งนี้จำเป็นจริงๆ แต่มันมีผล สำหรับตัวอย่างการใช้งานนี้โปรดดู Nette framework
Zilk

24

เนื่องจากคำถามนี้ปรากฏเป็นผลลัพธ์แรกใน Google สำหรับข้อผิดพลาดนี้ฉันจะระบุวิธีแก้ไข

โดยทั่วไปถ้าคุณมีกรอบงานให้พูดเหมือน Yii2 คุณจะคุ้นเคยกับการต้องประกาศคลาสเช่น

use Yii;
use yii\db\WhatEver;

class AwesomeNewClass extends WhatEver
{
}

คุณจะได้รับข้อผิดพลาดUse Yiiนี้เนื่องจากคลาสนี้ไม่มีเนมสเปซ

เนื่องจากคลาสนี้ไม่มีเนมสเปซจึงสืบทอดตารางสัญลักษณ์ส่วนกลางโดยอัตโนมัติดังนั้นจึงไม่ต้องการสิ่งต่างๆเช่นการกำหนดนี้เพียงแค่ลบออก


ใช่! สิ่งนี้ทำให้รู้สึกทั้งหมด! :)
Mārtiņš Briedis

1
สำหรับฉันปัญหาคือฉันพยายามใช้สัญลักษณ์จากเนมสเปซส่วนกลางเช่นuse \Passwordแต่ php ไม่ชอบเมื่อคุณพยายามทำสิ่งนั้นโดยไม่มีนามแฝงดังนั้นแม้จะใช้use \Password as Passwordงานได้ดี
Kzqai

ลดลงสำหรับการแนะนำการใช้ OOD เมื่อโมเดอเรเตอร์กำลังมองหาคำตอบทั่วไปเกี่ยวกับการใช้เนมสเปซ
Josh Habdas

1
@ Josh คุณเกี่ยวกับอะไร? ฉันไม่ได้รับคำตอบล่าสุดจากคุณ คุณไม่ได้บอกว่ามันไม่ใช่สิ่งที่ผู้ดูแลบางคนมองหาเพื่อให้ลิงค์ของผู้ชายบางคนเกี่ยวกับการ
หลอกล่อ

1
@JoshH (BTW ฉันเกลียดเวลาที่มีคนอ้างอิงบล็อกที่แสดงความคิดเห็นแบบนั้นว่าเป็นเนื้อหาที่มีสิทธิ์ในการตอบคำถาม)
Sammaye

6

useคำสั่งใน PHPเป็นจริงเพียงความสะดวกสบายให้นามแฝง namespace ที่ยาวเป็นบางสิ่งบางอย่างที่อาจจะน้อยง่ายต่อการอ่าน มันไม่ได้รวมไฟล์ใด ๆ หรือทำอย่างอื่นซึ่งส่งผลต่อการพัฒนาของคุณนอกจากให้ความสะดวก เนื่องจากBlogไม่ได้ใช้นามแฝงเป็นสิ่งที่คุณไม่ได้รับความสะดวกสบายใด ๆ ฉันนึกภาพออกว่าคุณทำอะไรได้บ้างเช่น

use \Blog as B;

และนั่นอาจได้ผล ( อาจเป็นที่ถกเถียงกันอยู่ว่าคุณสูญเสียความสะดวกสบายที่นี่โดยการปิดบัง แต่นั่นไม่ใช่สิ่งที่เป็นคำถาม ) เพราะคุณกำลังเปลี่ยนชื่อBlogเนมสเปซเป็นอย่างอื่น การใช้Blog\Articleงานเนื่องจากตามเอกสาร:

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

ดังนั้นข้อมูลโค้ดของคุณจะเทียบเท่ากับ:

use Blog\Article as Article;

1
โปรดอย่าโทรหาอะไรเลยBเว้นแต่คุณจะเขียนโค้ดที่ไม่สามารถเข้าถึงได้อย่างกระตือรือร้นหรือปรารถนาที่จะทำให้คนอื่นปวดหัว
Josh Habdas

2

ข้อผิดพลาด "คำสั่งใช้ ... ไม่มีผล ... " จะปรากฏขึ้นเช่นกันหากคุณพยายามใช้ลักษณะก่อนกำหนดคลาส

use My_trait; // should not be here

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

2

หากคุณไม่ต้องการใช้ไวยากรณ์ "เป็น" เช่น

use \Blog as B;

กำหนดเนมสเปซสำหรับไฟล์

namespace anyname;

use Blog
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.