PHP命名空间&引用未包含在命名空间中的类

时间:2012-04-09 19:50:17

标签: php

我有一个简单的问题,希望能快速回答。我编写的代码大量使用命名空间(我在任何地方都使用完全限定的名称);但是,需要包含一段代码(日历/日期选择器控件,不是我自己编写的)。当我尝试创建控件时,它假定当前命名空间(GUI),导致此错误:“PHP致命错误:类'GUI \ tc_calendar'未在C:\ inetpub \ wwwroot \ Calico \ calico_classes_v2.php中找到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(显然是错误的)。如何从名称空间内访问未包含在名称空间中的类?

2 个答案:

答案 0 :(得分: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(); 
        } 
}

答案 1 :(得分:3)

不在命名空间中的任何类都自动位于全局命名空间中 要从任何地方引用全局命名空间中的任何内容,请使用前面的\

new \tc_calendar;
相关问题