Dier_Sergio_Great
@Dier_Sergio_Great
Увлеченный человек

Как в PHP присвоить объекту функцию?

Имеется объект созданный на основе класса MyClass или stdClass, нужно к имеющимся свойствам и методам добавить еще одну функцию. Если есть возможность, то можно ли добавить функцию к неинециализированному классу?
$std = new stdClass();
$std->GetPrint = function () { echo "Урра !!!";};
$std->GetPrint();

или
class MyClass{
 function GetOther(){ echo "другой метод";}
}
MyClass::GetPrint = function () { echo "Урра !!!";};
$my = new MyClass();
$my->GetPrint();

Я понимаю что последний пример вообще не логичен, лямда функции почему то ведет себя как ссылка объекта в скрипте а при присваивании ее свойству объекта не присваивается.
Уважаемые Гуру подскажите что можно сделать?.
.
Мне нужно расширить функционал CMS с установленным модулем. Задача та чтобы модуль и сама CMS могли свободно обновляться регулярно, а мой расширенный функционал висел расширящим модулем не затрагивающий код основной программы.
PS -> метод Call для анонимной функции отлично переопределяет методы объектов
  • Вопрос задан
  • 579 просмотров
Решения вопроса 1
Пригласить эксперта
Ответы на вопрос 4
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
Интерфейсы?
extends?
Ответ написан
Комментировать
orlov0562
@orlov0562 Куратор тега PHP
I'm cool!
Единственный, более менее адекватный вариант, это переопределить точку входа, и перехватывать автозагрузку классов CMS, подключая свои классы-модуля, которые наследуются от базовых классов CMS.

Я имею ввиду, когда вызывается CMS\Route, ты перехватываешь эту загрузку, объявив раньше свой загрузчик и подключаешь MyModule\Route который унаследован от CMS\Route и изменяет его поведение.

Это плохо, и за такое отрывают руки, но это лучше чем расстрел, за то, что хочешь сделать ты :)
Ответ написан
Ivanq
@Ivanq
Знаю php, js, html, css
class my extends yours {
    // Ваш код
}

Теперь при создании класса my будет доступен функционал yours.
Ответ написан
Комментировать
@damirkaru
Я не знаю, есть ли доступ к исходному классу, но всегда можно задействовать трейт, если PHP >= 5.4.

Плюс тот подход, который в примере, возможен в таком кейсе (понятно, что есть и другие варианты):
class MyClass {
 public $GetPrint;
 public function GetPrint()
 {
   if (!empty($this->GetPrint)) {
     call_user_func($this->GetPrint, $this);
   }
 }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы