У меня есть строка PHP, которая вызывает новый класс как таковой:
$habits = new \Order\VO\Habits();
Для меня это выглядит как статический вызов метода, но я не могу сказать, что именно происходит. Я знаю, что у меня есть класс, который следует за этим пространством имен, и это просто класс, который содержит кучу переменных. Я могу сказать, что этот класс создается, но я не могу понять, какова цель сделать это таким образом. Я никогда не видел в PHP класса, названного таким образом, поэтому любая документация относительно того, что это на самом деле и почему класс вызывается таким образом, была бы очень полезна.
Проект, в котором я работаю, использует Zend-Framework, поэтому я не уверен, является ли это чем-то уникальным для самой платформы?
РЕДАКТИРОВАТЬ:
То, как вызывается класс, не является проблемой, я просто хочу больше узнать о том, что делает вызывающий класс, и ПОЧЕМУ было бы лучше называть этот конкретный класс таким способом, а не просто использовать
$habits = new habits();
Простой полный пример может помочь. Здесь я использую синтаксис ограниченных пространств имен, чтобы ограничить код тремя пространствами имен в одном файле, \Order\VO
, \Lifehacks
и глобальное пространство имен.
<?php
namespace Order\VO {
class Habits {
function __construct() {
echo "New VO Habits\n";
}
}
}
namespace Lifehacks {
class Habits {
function __construct() {
echo "New Lifehack Habits\n";
}
}
}
namespace {
// PHP Fatal error: Class 'Habits' not found
// $foo = new Habits();
// Prints "New VO Habits"$foo = new \Order\VO\Habits();
// Prints "New Lifehack Habits"$bar = new \Lifehacks\Habits();
}
Обратите внимание, что в глобальном пространстве имен вы не можете просто создать Habits с new Habits()
, поскольку никто не существует в вашем пространстве имен. Вы должны выбрать один или другой из Habits
классы, добавив к ним префикс пространства имен.
Это потому, что вы создаете экземпляр класса с пространством имен, также вы можете сделать это следующим образом:
<?php
use Order\VO\Habits;
$habits = new Habits();
Когда вы создаете экземпляр класса, который он вызывает (по крайней мере, 99% времени в PHP 5) __construct()
функция.
class Foo {
public $bar;
public function __construct($arg) {
$this->bar = $arg;
}
}
$class = new Foo('test');
echo $class->bar; // Ouput: test
В пространстве имен ваш класс живет внутри того, что в основном является каталогом. принимать Foo
, У меня не может быть двух классов с одинаковыми именами, но я мог бы поставить другой Foo
под пространством имен.
namespace Example;
class Foo {
public static function dump($arg) {
echo $arg;
}
}
Итак, теперь нам нужно обратиться к какой Foo
мы хотим. Мы можем сделать это либо передав полное пространство имен
$class = new \Foo('test'); // The original Foo is in root namespace
\Example\Foo::dump('test');
Или с помощью use
use Example\Foo;
Foo::dump('test'); // alias here so we don't need to redeclare the path
Теперь PHP не «автоматически» загружает классы. Вместо этого обычно используют автопогрузчик и затем помещает файлы в каталог, соответствующий пространству имен. Так \Example\Foo
будет жить в example/foo.php
и ваш автозагрузчик просто включит файл при вызове класса.
Попытка более краткого объяснения. $habits = new Habits();
не будет работать, потому что имя класса Order\VO\Habits
не Habits
, Для удобства вы можете импортировать пространство имен, как в ответе byoigres, который сообщает PHP, что класс Habits
на самом деле означает Order\VO\Habits
, После этого, $habits = new Habits();
буду работать.