2013-03-16 1 views
4

Я пытаюсь воспитывать себя с функциями PHP 5.3/PHP 5.4 OOP.PHP Пространства имен, что использует и означает, и выполняют ли они автозагрузку классов?

Я пытался кодировать что-то вроде этого. Однако это не сработает.

index.php

namespace Website; 

use Website\Database as Database; 

class Website extends Database 
{ 
    function __construct() 
    { 
     echo "Test"; 
    } 
} 

$website = new Website(); 

./Website/Database.php

namespace Website\Database; 

class Database 
{ 
    function construct() 
    { 
     echo "Hello from Database"; 
    } 
} 

Я знаю, как сделать занятия, связать их друг друга и т.д., но всякий раз, когда я добавить пространство имен к вершине, все сломается.

Поэтому я хотел бы попросить несколько элементарных вещей;

Q1: use ClassName; означает, что он автоматически загружает/включает в себя класс?

Q2: Что делает \ означает без каких-либо изменений на левой стороне. (Например новый \ Database();)

Q3: Есть ли \ означает каталог, в PHP, или это только то, как разработчики рассматривать его как?

Q4: Какие изменения должны быть внесены в мой скрипт, чтобы заставить его работать? !

ответ

3

В ответ на ваш первые три вопроса:

== Пространство имен автозагрузки, Пространство имена представляет собой способ упрощения структуры ваших классов, и позволяет «перегружать» классы в разных пространствах имен; автозагрузка автоматически загружает файлы, когда они необходимы: они не одно и то же. Если вы используете пространства имен, вероятно, вы также захотите использовать автозагрузчик.

«ведущий» \ является глобальным охватом пространства имен; и последующие \ затем служат в качестве разделителя пространства имен

\ является разделителем пространства имен; разделители каталогов: / или \ в файлах в зависимости от платформы; но / все равно работает на всех платформах, поэтому он действительно должен использоваться для всех кросс-платформенных разработок. Существует также DIRECTORY_SEPARATOR постоянной

+0

Q1: Если я использую использование базы данных; в файле; мне нужно require_once ('Database.php')? Q2: достаточно ясно. Q3: Да, я знаю об этом, но когда я проверяю источники некоторых фреймворков, они используют что-то вроде: use ExceptionHandler \ FileHandler \ FileUploadException; и реальный путь к файлу подобен ./ExceptionHandler/FileHandler/FileUploadException.php - Это что-то, что разработчики рассматривают как каталоги, потому что легче найти то, что они ищут? –

+0

Q1 - вам нужно либо потребовать, либо включить автозагрузчик, который может обрабатывать классы пространств имен. –

+0

Структуры каталогов, сопоставленные структурам пространств имен, - это просто удобство ... это необязательно, но с ним проще работать - но эти два не должны считаются идентичными, так как это может привести к непониманию того, что на самом деле является пространством имен. –

2

A1: Если вы use класс, который еще не загружен, автозагрузчик будет удар дюйма Но вы должны написать свой собственный автозагрузчик, чтобы убедиться (с пространствами имен) классов будут загружены..

непроверенный пример:

function autoloader($className){ 
    $fileName = str_replace('\\', DIRCTORY_SEPARATOR, $className); 
    include __DIR__ . $fileName; 
} 
spl_autoload_register(autoloader); 

Это предполагает, что загрузчик находится в корневом каталоге приложения. И он не выполняет проверку ошибок, и может понадобиться другой разделитель каталога, добавленный где-нибудь.

A2: Ведущее \ означает глобальное пространство имен, указывающее, что имя класса не находится в текущем пространстве имен.

A3: пространство имен не должно соответствовать структуре каталогов, но большинство разработчиков предпочтут его. Это также упрощает автозагрузку.

+0

A1: Есть ли пример того, как такой автозагрузчик можно написать? В настоящее время я использую spl_autoload_register() для загрузки классов. A2 и A3: достаточно ясно! –

+1

Вы хотите посмотреть на некоторые автозагрузчики, совместимые с фигом; например https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md или (рекомендуемый вариант) https://gist.github.com/jwage/221634 –

+0

@LisaMiskovsky: См. Мой обновленный ответ – Arjan

Смежные вопросы