2010-07-18 2 views
0

У меня есть несколько файлов, как показано ниже:PHP сфера между двумя классами

index.php:

require_once("foo.php"); 
require_once("bar.php"); 

foo.php:

class foo { 

    function1() { 

    } 

} 

bar.php:

class bar { 

    ????? 

} 

Мой вопрос в том, есть ли способ доступа к функции1 из класса foo в классе bar, без необходимости включать файл foo.php в файл bar.php, поскольку он уже загружен в index.php?

Заранее спасибо

+1

Access как. Статически? Или получить доступ к объекту этого класса? –

ответ

1

При включении файла, в PHP, вы не включая ничего в текущего файла, но в текущее исполнение

Когда файл были включены, это контент известен интерпретатором PHP - и останется известным до конца выполнения текущего скрипта.

Это немного, как копировать-наклеивать: с текущего index.php файла, это как если бы вы взяли код из foo.php и bar.php и копировать-вставить в index.php.


Так что, да, один раз foo.php был загружен один раз, вы можете получить доступ, что определяется им из bar.php - даже если эти два включаются index.php.

(Что вы подразумеваете под доступом немного расплывчат, хотя: вам придется объявить некоторые методы как статические, или в foo создания экземпляра класса, ... Но все это будет возможно внутри тела на метод, объявленный в bar)


Как заметка на полях: вы должны быть осторожны с включениями файлов: если вы включите дважды файл, который объявляет класс, к примеру, вы получите фатальную ошибку, потому что это запрещено для определения двух классов с тем же именем.

Запомните идею копирования, которую я написал ранее? Включение файла дважды, даже из двух отдельных файлов, похоже на копирование в один и тот же код дважды ...

Чтобы избежать этой проблемы, мы часто используем include_once, который, как указывает его имя, гарантирует, что данный файл может только включается только один раз.

1

Если foo.php уже загружен, тогда возникает реальный вопрос: «Я получаю доступ к function1() в статическом или экземпляре?"

Если function1() статическая функция (которая в вашем примере, не является):

class bar{ 

    function function2(){ 
    return foo::function1(); 
    } 
} 

В противном случае вам придется создать экземпляр экземпляра foo, что делает его или класс информации локальной-Scope переменным , например

class bar{ 

    /* 
    * @var foo 
    */ 
    private $foo; 

    function __construct(){ 
    $this->foo = new foo(); 
    } 

    function function2(){ 
    return $this->foo->function1(); 
    } 

} 

Прочитайте это тоже: http://php.net/manual/en/language.oop5.static.php

Кстати, как то, что объяснил Pascal MARTIN, вы не п чтобы сделать еще один include(), но обычно для большого приложения, вы предпочтете auto-class-loading.

0

Вы можете сделать это статически, хотя есть ограничения, и это жестокая практика, поскольку эта функция не является фактически статической.

foo::function1(); 

Лучший подход заключается в том, чтобы класс bar принимал foo в качестве параметра. В зависимости от использования это может быть сделано в конструкторе или конкретном методе.

1

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

Автозагрузка позволит вам ленивую загрузку или загружать только файлы, которые вам нужны в каждом запросе, вместо того, чтобы создавать паутину включенных файлов.

Вы можете сделать это либо с __autoload или spl_autoload, читать больше на эту тему здесь: http://php.net/manual/en/language.oop5.autoload.php

Небольшой пример автозагрузку ниже:

function __autoload($class_name) { 
    require_once $class_name . '.php'; 
} 

$obj = new MyClass1(); 
$obj2 = new MyClass2(); 

Использование автозагрузку PHP может автоматически пытаться загрузить файлы, когда класс не найден, в этом примере нет причин включать файлы классов для MyClass1 или MyClass2, php возвращается к функции __autoload, если он не может найти определения для них.

Используя это будет означать, что вы не должны включать в себя либо Foo или бар в ваших примерах, не включать их в index.php

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