Zend Framework — Как PHP создает экземпляры этого класса?

У меня есть строка PHP, которая вызывает новый класс как таковой:

$habits = new \Order\VO\Habits();

Для меня это выглядит как статический вызов метода, но я не могу сказать, что именно происходит. Я знаю, что у меня есть класс, который следует за этим пространством имен, и это просто класс, который содержит кучу переменных. Я могу сказать, что этот класс создается, но я не могу понять, какова цель сделать это таким образом. Я никогда не видел в PHP класса, названного таким образом, поэтому любая документация относительно того, что это на самом деле и почему класс вызывается таким образом, была бы очень полезна.

Проект, в котором я работаю, использует Zend-Framework, поэтому я не уверен, является ли это чем-то уникальным для самой платформы?

РЕДАКТИРОВАТЬ:

То, как вызывается класс, не является проблемой, я просто хочу больше узнать о том, что делает вызывающий класс, и ПОЧЕМУ было бы лучше называть этот конкретный класс таким способом, а не просто использовать

$habits = new habits();

1

Решение

Простой полный пример может помочь. Здесь я использую синтаксис ограниченных пространств имен, чтобы ограничить код тремя пространствами имен в одном файле, \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 классы, добавив к ним префикс пространства имен.

3

Другие решения

Это потому, что вы создаете экземпляр класса с пространством имен, также вы можете сделать это следующим образом:

<?php

use Order\VO\Habits;

$habits = new Habits();
2

Когда вы создаете экземпляр класса, который он вызывает (по крайней мере, 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 и ваш автозагрузчик просто включит файл при вызове класса.

2

Попытка более краткого объяснения. $habits = new Habits(); не будет работать, потому что имя класса Order\VO\Habitsне Habits, Для удобства вы можете импортировать пространство имен, как в ответе byoigres, который сообщает PHP, что класс Habits на самом деле означает Order\VO\Habits, После этого, $habits = new Habits(); буду работать.

0
По вопросам рекламы [email protected]