【问题标题】:PHP Namespaces & Referencing Classes not contained within Namespaces未包含在命名空间中的 PHP 命名空间和引用类
【发布时间】:2012-04-09 19:50:17
【问题描述】:

我有一个简单的问题,希望有一个快速的答案。我编写的代码大量使用了命名空间(我在任何地方都使用完全限定名称);但是,需要包含一段代码(日历/日期选择器控件,不是我自己编写的)。当我尝试创建控件时,它假定当前命名空间(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(显然是错误的)。如何从命名空间内访问不包含在命名空间内的类?

【问题讨论】:

    标签: php


    【解决方案1】:

    你的意思是这样的:

    namespace GUI;
    
    use \tc_calendar as Calendar;
    
    $myCalendar = new Calendar();
    

    as Calendar 是可选的。如果省略 as Calendar,也可以保留原名称 tc_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 个 sn-ps 组合成你喜欢的任何其他形式。

    如果您只是基于tc_calendar 构建日历类,我还建议您扩展日历:

    namespace GUI;
    
    use \tc_calendar;
    
    require_once 'tc_calendar.php';
    
    class CompositeCalendar extends tc_calendar { 
            private function blah() {  
                 $this->stuff(); 
            } 
    }
    

    【讨论】:

    • 更像:class tc_calendar {} namespace GUI { class CompositeCalendar { private function blah() { $control = new tc_calendar(); $控制->东西(); } }},PHP 抱怨它找不到 tc_calendar,猜测我的意思是 \GUI\tc_calendar。我只想使用 tc_calendar 对象。
    • 最好不要修改 tc_calendar 代码本身,因为它是别人的代码。
    • 我的回答让您可以使用tc_calendar,而无需以您喜欢的任何名称修改其代码。问题出在哪里?
    • @user978122 仍然缺少什么?
    • 一点也不。因睡眠不足而昏倒。 ;-)
    【解决方案2】:

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

    new \tc_calendar;
    

    【讨论】:

      猜你喜欢
      • 2014-09-06
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多