2

我有一个简单的问题,希望有一个快速的答案。我编写的代码大量使用了命名空间(我在任何地方都使用完全限定名称);但是,需要包含一段代码(日历/日期选择器控件,不是我自己编写的)。当我尝试创建控件时,它假定当前命名空间(GUI),导致此错误:“PHP 致命错误:在 C:\inetpub\wwwroot\Calico\calico_classes_v2.php 中找不到类 'GUI\tc_calendar' 在线1852”。现在,日历控件本身(以及它的底层类文件)不使用名称空间,我有点担心尝试修改它(早期的尝试并不顺利)。

如何将不包含在命名空间中的控件导入/包含到我的其余代码中,这样做呢?PHP 是否有类似“从文件 AS \Calendar\Calendar 导入类日历”的内容?

编辑: 有关其他信息:我有一个名为“tc_calendar”的类,包含在一个名为“tc_calendar.php”的文件中。它不是任何命名空间的一部分。

在一个单独的文件中,我有几个类(Bitmap、CompositeCalendar、EventEditor、TimeExtractor),它们都包含在它们相应的命名空间(GUI、Data、Extract 等)中。

在 GUI 命名空间中包含的其中一个类 CompositeCalendar 中,我试图创建一个 tc_calendar 的实例。然而,PHP 抛出了一个错误(上图)。tc_calendar 不是任何 namspace 的一部分(绝对不是 GUI 命名空间的一部分,PHP 只是假设,因为它似乎找不到它),我需要帮助来创建它的实例。

tldr; $newcontrol = new tc_calendar() 不起作用;PHP 试图猜测它的命名空间(因为没有指定,因为 tc_calendar 不是任何命名空间的一部分),然后给出了 \GUI\tc_calendar (显然是错误的)。如何从命名空间内访问不包含在命名空间内的类?

4

2 回答 2

3

你的意思是这样的:

namespace GUI;

use \tc_calendar as Calendar;

$myCalendar = new Calendar();

as Calendar是可选的。tc_calendar如果您省略as Calendar.

更新

把它放在评论的形式:

namespace {
    class tc_calendar {} 
}
namespace GUI {
    use \tc_calendar;

    class CompositeCalendar { 
        private function blah() { 
             $control = new tc_calendar();   
             $control->stuff(); 
        } 
    }
}

不过,我不会将粘贴外部库复制到同一个文件中。这是不好的做法。最好将它们保存在另一个文件中,然后包含它们并具有以下内容:

namespace GUI;

use \tc_calendar;

require_once 'tc_calendar.php';

class CompositeCalendar { 
        private function blah() { 
             $control = new tc_calendar();   
             $control->stuff(); 
        } 
}

或者结合我的 3 个片段,让它拥有你喜欢的任何其他形式。

如果您只是基于以下内容构建日历类,我还建议您扩展日历tc_calendar

namespace GUI;

use \tc_calendar;

require_once 'tc_calendar.php';

class CompositeCalendar extends tc_calendar { 
        private function blah() {  
             $this->stuff(); 
        } 
}
于 2012-04-09T19:58:30.167 回答
3

不在命名空间中的任何类都会自动在全局命名空间中。
要从任何地方引用全局命名空间中的任何内容,请使用单个前置\

new \tc_calendar;
于 2012-04-10T01:13:59.883 回答