PHP 命名空间和引用类不包含在命名空间中


PHP Namespaces & Referencing Classes not contained within Namespaces

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

如何将不包含在命名空间中的控件导入/包含到我的代码的其余部分中?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(显然是错误的)。如何从命名空间内部访问不包含在命名空间中的类?

你的意思是这样的:

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(); 
        } 
}

任何不在命名空间中的类都自动位于全局命名空间中。
要从任何位置引用全局命名空间中的任何内容,请使用前面的单个'

new 'tc_calendar;