Не очень удобно. Придется писать интерфейс для каждого класса. При этом всё равно при желании можно дернуть защищенный метод. Т.е. это просто в подсказках не будет этих методов, но реально они будут.
Тогда уж проще написать универсальный метод который будет детектить такую ситуацию и падать в дамп. И вызывать этот метод в каждом защищенном методе который нельзя вызывать из другого объекта.
На всякий случай проверил ваше предложение:
abstract class Node
{
protected function onInit(): void
{
echo __METHOD__ . PHP_EOL;
}
}
interface INodeA
{
public function FUNC2();
}
class NodeA extends Node implements INodeA
{
public function FUNC2()
{
echo __METHOD__ . PHP_EOL;
}
protected function onInit(): void
{
parent::onInit();
echo __METHOD__ . PHP_EOL;
}
}
class NodeB extends Node
{
// Функция инициализации
protected function onInit(): void
{
parent::onInit();
echo __METHOD__ . PHP_EOL;
// Добавить зависимость
(function (INodeA $a) {
$a->FUNC2(); // Метод успешно вызывается так как он public
$a->onInit(); // Метод также успешно вызывается хотя он и protected
})(new NodeA);
}
public function run()
{
$this->onInit();
}
}
(new NodeB)->run();
Т.е. в IDE в подсказках методов не видно, но они есть и их можно вызвать.
Как вариант, можно "на лету" создавать класс Wrapper который будет поддерживать указанный интерфейс и котором будут только публичные методы. В этом случае будет как раз реализовано то, чего я хочу добиться.
MyraJKee, я решаю задачу внедрения зависимости. NodeB зависит от NodeA. Они оба наследуются от общего предка. Но при этом нельзя вызывать защищенные методы NodeA из объекта NodeB, так как уронит систему.
Но можно сделать так, чтобы хотя бы на тестах оно упало и показало, что нельзя так делать.
Можно сделать более универсальный метод. Пишем метод проверки, который читает весь стек вызовов и проверяет что если встречается случай что происходит переключение из защищенного метода объекта A в защищенный метод объекта B, то кидать исключение. И сделать вызов в каждом таком "рисковом" методе.
ThunderCat, судя по всему причина не в коде, а в том, что я перепривязываю папку домена. Т.е. у меня на одном домене один сайт, а потом я папку меняю чтобы она указывала на другой сайт. А OSPanel не понимает что папка сменилась и поэтому ошибка.
Так и сделал. Файл существует. Файл читается. При этом ошибка появляется и пропадает каки-то случайным образом. И в .htaccess есть правила что если файла нет,то выдавать страницу 404. Но тут эта страница не выдаётся.
Запускаю пару раз, нет ошибки. Жду минуту, запускаю - ошибка. При этом там столько всего накручено в этом запуске, что не ясно какое звено может косячить
Drno, раньше я работал из удаленного офиса и через инет со своего NAS смотрел фильмы. Теперь работаю из дома, так что смотрю локально. Решил настроить DDNS на случай если какой-то сервис на NAS подниму чтобы он был доступен "из вне".
На билайн у меня телефоны всей семьи + домашний интернет + ТВ. Поэтому отказался от дом.ру с их ТВ и интернетом. Скорости меня мало интересуют, что надо за ночь в любом случае скачается через торренты )
Kentavr16, попробовал определить функцию и её экспортировать - не помогает.
При вводе значение в поле изменяется, но не отображается почему то. При этмо если сделать два поля (с обоими видами функций), то значение в проблемном поле появляется если в другом поле начать вводить значение.
Чего то я не понимаю в логике работы :(
Dmitry Bay, в данном случае вопрос чисто теоретический: можно или нет такое сделать. Группировка вызовов позволит сделать 3 запроса вместо 4-х, но я думаю что Laravel такого не может. Но хотелось бы подтверждения от знающих людей.
Тогда уж проще написать универсальный метод который будет детектить такую ситуацию и падать в дамп. И вызывать этот метод в каждом защищенном методе который нельзя вызывать из другого объекта.
На всякий случай проверил ваше предложение:
Вывод
Т.е. в IDE в подсказках методов не видно, но они есть и их можно вызвать.
Как вариант, можно "на лету" создавать класс Wrapper который будет поддерживать указанный интерфейс и котором будут только публичные методы. В этом случае будет как раз реализовано то, чего я хочу добиться.