PHP « Взаимодействие классов

Разбираюсь в взаимодействии классов.
И столкнулся с такой проблемой , что классы не видят переданные им глобальные объекты.
Значит ли это что я не правильно создаю приложение в плане его структуры?
Или я просто использую не тот метод передачи?
Прочитал про паттерн "одиночка" но так и не понял , решит ли он мою проблему с передачей объектов из класса в класс. То что он один экземпляр создает как раз мне и нужно.


И еще такой вопрос:
Хочу сделать компонент. Есть 3 файла . Параметры, логика и шаблон.
Есть метод который делает include всех этих файлов что конечно работает, но что-то подсказывает что это не по феншую))
Как правильней это реализовать?

1 ответов


> И столкнулся с такой проблемой , что классы не видят переданные им глобальные объекты.
В каком виде переданы? Просто вызываются внутри методов класса? Если да, то неправильно.
В пхп обособленная суперглобальная область, чтоб указать, что переменная внутри функции является глобальной (используется глобальная), нужно объявить её таковой:


$value = 5;
function f ()
{
   global $value;
   $value++;
   ...
}
 
> Значит ли это что я не правильно создаю приложение в плане его структуры?
Да, вообще говоря, не следует так пользоваться глобальными объектами. Например, захотите вы использовать функцию f в другом месте, а она привязана к некоторому глобальному имени. Придётся его создать, даже если оно вам не нужно.
Поэтому для функций следует всё, с чем они работают передавать через входные параметры:

$global_value = 5;
function f ($value)
{
   $value++;
   ...
}
f ($global_value);
 
Теперь, если функция вам понадобится в другом месте, то вы просто вызовите её с другим параметром.
Кстати, это касается и ООП, так как $this это тоже входной параметр функции, который, однако, передаётся неявно.

> проблему с передачей объектов из класса в класс.
При конструировании, или через специальные методы следует указывать объекту, с какими объектами он работает. Например, так работает паттерн Стратегия. Одиночка (в большинстве случаев) является анти-паттерном. Избегайте его чрезмерного использования.

> Есть 3 файла . Параметры, логика и шаблон.
> Как правильней это реализовать?
Как можно проще. Если параметры, это набор "ключ-значение", то использовать для них ассоциативный массив, не тулить вокруг них класс. Шаблон это текстовый файл. Самый простой шаблонизатор заключается в инклуде такого файла, со включённым Output Buffering. Читайте про ob_start();, ob_get_contents();. Для этого можно написать небольшой класс, а можно использовать отлаженные существующие.
Инклуд может возвращать значение, поэтому можно заинклудить конфиг прямо в переменную.