Запретить создание объектов вне класса

149
22 мая 2019, 14:10

структура директории:
libs - каталог
index.php - точка входа
В каталоге libs лежит файл test.php, содержимое которого:

class Test
{
    public function init()
    {
        echo 'init<br>';
    }
}

Содержимое файла index.php:

class Main
{
    public $prop;
    public function __construct()
    {
        include_once('libs/test.php');
        $this->prop = new Test();
    }
}

Проблема:

$m = new Main();
// Все обращения к объекту класса Test должны быть через свойство prop
// класса Main
$m->prop->init();
// Объект класса Test НЕ ДОЛЖЕН быть создан
$t = new Test();
$t->init();

Можно ли реализовать в php так, чтобы объект класса Test невозможно было создать вне конструктора класса Main?

Answer 1

В пхп нет групп классов ( нет аналога с пакетов из java) , поэтому все другие классы кроме родителей и детей класса Test будут для него внешними, в том числе Main. Поэтому если из Main можно создавать Test и они не наследуют друг друга, что очевидно по названию, то его можно создавать откуда угодно, так как в этом случае конструктор должен быть публичным. Поэтому ответ нет, нельзя. Тем не менее не ясна цель зачем так делать? Паттерн нужны не столько для ограничения программистов сколько для передачи им идей как оно все тут работает, поэтому если не следовать известному паттерну то конструкция будет непонятна следующему разработчику и он тут же её сломает. Если синглтон не ложится на твою цель (должно быть несколько классов Test в каждом Main свой) почитай про dependancy injection, там присутствует третий класс который решает какой именно Test положить в очередной Main.

READ ALSO
Как заполнить ассоциативный массив

Как заполнить ассоциативный массив

Подскажите как в PHP через foreach заполнить ассоциативный массив вида

169
Расстояние между всеми точками массива

Расстояние между всеми точками массива

Проинициализировать два массива, которые задают n точек координатами (X, Y) в двумерном пространствеОписать функцию, которая найдет расстояния...

123
QChartView, использование QChartView::RubberBand

QChartView, использование QChartView::RubberBand

В Qt, с помощью QChart реализуется простой графикВ ходе работы возникла необходимость масштабирования по оси X, было решено реализовывать с помощью...

145
Ошибка при работе алгоритма shuffle

Ошибка при работе алгоритма shuffle

Ошибка:error: no match for 'operator+' (operand types are 'std::_List_iterator<double>' and 'int')

152