user978122
user978122

Reputation: 5761

PHP Namespaces & Referencing Classes not contained within Namespaces

I have a simple question, which should hopefully have a quick answer. The code I have written makes heavy use of namespaces (I use fully qualified names everywhere); however, a piece of code (a calendar / date picker control, not written by myself) needs to be included. When I attempt to create the control, it assumes the current namespace (GUI), resulting in this error: "PHP Fatal error: Class 'GUI\tc_calendar' not found in C:\inetpub\wwwroot\Calico\calico_classes_v2.php on line 1852". Now, the calendar control itself (and it's underlying class file) does not make use of namespaces, and I am a little worried about attempting to modify it (an earlier attempt did not go well).

How can I import / include a control, that is not contained within a namespace, into the rest of my code, that does? Does PHP have something like "Import class calendar from file AS \Calendar\Calendar"?

Edit: For additional information: I have a class, called "tc_calendar", contained in a file called "tc_calendar.php". It is not part of any namespace.

In a separate file, I have several classes (Bitmap, CompositeCalendar, EventEditor, TimeExtractor), all contained within their appropriate namespaces (GUI, Data, Extract, etc.).

In one of those classes, CompositeCalendar, contained within the GUI namespace, I am trying to create an instance of a tc_calendar. However, PHP is throwing an error (above). tc_calendar is not a part of any namspace (and definitely not a part of the GUI namespace, which PHP is just assuming, because it can't seem to find it), and I need help creating an instance of it.

tldr; $newcontrol = new tc_calendar() doesn't work; PHP tries to guess the namespace for it (because one isn't specified, because tc_calendar isn't a part of any namespace), comes up with \GUI\tc_calendar (obviously wrong). How do I access a class, not contained within a namespace, from inside a namespace?

Upvotes: 2

Views: 1095

Answers (2)

d_inevitable
d_inevitable

Reputation: 4451

Do you mean something like this:

namespace GUI;

use \tc_calendar as Calendar;

$myCalendar = new Calendar();

The as Calendar is optional. You could aswell keep it with the original name tc_calendar if you ommit the as Calendar.

Update

To put it in shape of the comment:

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

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

I wouldn't copy paste external libraries into he same file though. It bad practise. It is better to keep them in another file and then include them and have the following:

namespace GUI;

use \tc_calendar;

require_once 'tc_calendar.php';

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

Or combine my 3 snippets to have it any other form you like.

Also I would suggest to extend the calendar if you are just building calendar class based on the the tc_calendar:

namespace GUI;

use \tc_calendar;

require_once 'tc_calendar.php';

class CompositeCalendar extends tc_calendar { 
        private function blah() {  
             $this->stuff(); 
        } 
}

Upvotes: 3

deceze
deceze

Reputation: 522081

Any class not in a namespace is automatically in the global namespace.
To refer to anything in the global namespace from anywhere, use a single preceding \:

new \tc_calendar;

Upvotes: 3

Related Questions