class Api {
function dependency(callable $dependency) {
if ($dependency instanceof Closure) {
$dependency = Closure::bind($dependency, null, null);
$dependency(new NodeA());
}
}
}
Но стат-анализаторы вроде Psalm и PHPStan на такое будут ругаться и не пропустят.не все им пользуются :)
abstract class Node
{
protected function onInit(ApiInit $api): void
{
// тут делаем что-то полезное
}
}
class NodeA extends Node
{
public function FUNC2() { }
protected function onInit(ApiInit $api): void
{
parent::onInit($api);
// тут делаем что-то полезное
}
}
class NodeB extends Node
{
// Функция инициализации
protected function onInit(ApiInit $api): void
{
parent::onInit($api);
// Добавить зависимость
$api->dependency(function (?NodeA $a) {
$a->FUNC2(); // Метод успешно вызывется так как он public
$a->onInit($api)(); // Метод также успешно вызывается хотя он и protected
});
}
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();
Node::onInit
NodeB::onInit
NodeA::FUNC2
Node::onInit
NodeA::onInit
Но можно сделать так, чтобы хотя бы на тестах оно упало и показало, что нельзя так делать.
You can not use Private Network IP addresses.
See details: https://en.wikipedia.org/wiki/Private_network
Для расцветки текста в консоли другого и не надо