2013-09-12 3 views
0

У меня есть это:Путаница include_once в PHP

class/ 
    |-- A.Class.php 
    |-- FactoryA.php 
    |-- Database.php 
    |-- Log.php 
index.php 

посредством FactoryA.php является Factory класс, который создает OBJ A и может создать/чтение/обновление/удаление А из базы данных. Log.php - класс, который отправляет журналы в текстовый файл log.txt.

FactoryA потребует A.Class (для создания экземпляра) и Database. Для всех 3 классов требуется Log.php (для целей отладки). Все index.php делает это для создания экземпляра FactoryA.

Я не знаю, куда я должен указывать заявления. Do I include все файлы отindex.php? Или я делаю это в классе?

+2

3. Используйте автозагрузчик –

ответ

2

Если вы не используете автозагрузчик (see Autoloading CLasses), вам придется вручную включить все необходимые файлы во все зависимые файлы. Обычно рекомендуется, чтобы все файлы управляли всеми своими зависимостями.

Если я понимаю, ваша зависимость, это будет выглядеть так:

  • Index.php потребуется require_onceFactoryA.php
  • FactoryA.php будет require_onceA.class. php & Log.php
  • A.Class.php будет require_once database.php & Log.php
  • database.php будет require_once Log.php

Альтернативным методом было бы использовать __autoload и предоставить ему необходимые файлы, если необходимо, для вас. Таким образом, в вашем

function __autoload($class_name) { 
    include './class/' . $class_name . '.php'; 
} 
$a = new A(); 

Однако spl_autoload_register() обеспечивает более гибкую альтернативу для классов самозарядных. По этой причине использование __autoload() не рекомендуется и может быть устаревшим или удаленным в будущем. См. the PHP Ref.

Предлагаем вам ознакомиться с PSR-0 standard, и вы можете, возможно, просто use the SplClassLoader.php gist.

Вам нужно будет переименовать классы следовать пространства имен и путей стандартов, но тогда вы можете просто сделать что-то вроде:

//This is the only file you need to require 
require_once('/path/to/SplClassLoader.php'); 
$classLoader = new SplClassLoader('Class', './class'); 
$classLoader->register(); 
$a = new A(); 

Я написал небольшой ссылки CLI проект, чтобы продемонстрировать, проверку bubba-h57/AutoLoading и запустить его из командной строки. Вы должны увидеть результаты, как:

[cinamon-vm] AutoLoading> php index.php 
From the factory! 
From the AClass! 
From the Database! 
Pure win! 

См Why doesn't PHP's Autoload feature work in CLI mode? для обсуждения с помощью автозагрузчика из командной строки (CLI) скриптов.

+0

поэтому при использовании SplClassLoader мне не нужно беспокоиться о том, работает ли php в CLI или нет? – Josh

+0

Я написал 1-3 скрипта PHP CLI за рабочий день, используя его в течение последних трех лет, я не беспокоился об этом. Это достаточно просто, чтобы проверить, я призываю вас попробовать и изучить свободу. – bubba

+0

Я поставил образец скрипта CLI, используя его на github для вас, просто git clone и поиграйте с ним. Надеюсь, вам понравится и приятно! – bubba

3

Вы можете использовать автозагрузку.

Это означает, что php он сам загрузит класс, если вам это нужно. Вы можете определить это так:

function __autoload($class_name) { 
    include 'class/' . $class_name . '.php'; 
} 

Если теперь попытаться создать новый объект, например, А и А не загружен еще, автозагрузка будет называться и первый параметр будет класс искать.

$a = new A(); 

http://www.php.net/manual/language.oop5.autoload.php

+0

, но мне сказали, что автозагрузка недоступна, если PHP работает в CLI – Josh

+0

Да, это так. Вы не можете использовать автозагрузку, если вы используете php в CLI. – idmean

+0

Autoload работает отлично от CLI, мы делаем это все время. – bubba

0

Модульность, как правило, хорошо, но только тогда, когда все последовательны. Я не уверен, почему вы хотите иметь отдельный файл журнала?

Я думаю, что ваши файлы на самом деле не организованы банкоматом, вы считали, что используете фреймворк, например Laravel/CodeIgniter?

В противном случае, включив, я бы просто сказал, что включите соответствующие файлы друг в друга, например make FactoryA, включите файл класса, а затем просто включите FactoryA в ваш индексный файл и так далее.

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