Класс PHP ссылается на путаницу между несколькими файлами - PullRequest
0 голосов
/ 22 декабря 2010

У меня есть файл index.php, который имеет 3 включает

<?php
require_once('mod.php');
$mod = new Mod();

require_once('start.php');
require_once('tools.php');

....some code....
?>

Мне нужно иметь возможность ссылаться на объект $ mod внутри start.php и tools.php. Как передать этот объект, на который будут ссылаться эти 2 других файла с запросами?

По сути, mod.php - это класс, в котором список массивов сгенерирован в __construct (). Я хочу использовать эти данные списка массивов в файле startup.php и tools.php, но не уверен, как передать существующий, не вызывая «new» внутри обоих этих файлов по отдельности, что не делает то, что мне нужно, поскольку он сбрасывается все.

Спасибо!

Ответы [ 4 ]

3 голосов
/ 22 декабря 2010

Прежде всего используйте автозагрузчик. Десятки require в верхней части файла раздражают и не нужны.

Вам не нужно передавать какие-либо ссылки на другие файлы. require работает как "copy-paste-execute", поэтому $mod будет доступно в этом файле.

#index.php
$mod = new Mod();
include 'file.php';

#file.php
$mod->doSth(); // works file!

Ваша проблема, вероятно, переменная область действия . Если вам нужно использовать $mod внутри другого объекта (тот факт, что его источник (класс) находится в другом файле не имеет значения) передайте ссылку на $mod в качестве аргумента конструктора, передайте его с помощью специального установщика ($obj->setMod($mod); $obj->doSth(); ) или используйте более сложное, но лучшее решение, такое как Dependency Injection Container ( пример реализации ).

3 голосов
/ 22 декабря 2010

Похоже, вы используете вызовы require () не для загрузки динамической функциональности (получить определение класса), а для вызова функции. Не. Избегайте глобальных переменных, таких как чума.

Примечание: вместо того, чтобы беспокоиться о выполнении вызовов require () в правильном порядке для определения ваших классов, я бы посоветовал вам взглянуть на функциональность автозагрузки в PHP 5. Она позволяет вам определять, какие классы определены в какой файл, и загружать эти файлы по требованию, когда классы запрашиваются.

1 голос
/ 22 декабря 2010

Doing require (или require_once, include или include_once) просто включает и оценивает код. Область видимости переменной наследуется от точки, в которой импортируется код.

Например, используя ваш код:

<?php // index.php

require_once('mod.php');
$mod = new Mod();

require_once('start.php');

И включают:

<?php // start.php

$mod->arrayList(); // $mod is the object created in index.php
0 голосов
/ 22 декабря 2010

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

    function test() {
        global $mod;

        print $mod->list;
    }
...