170 похожих чатов

Кстати, гуру вы эдакие. ) Есть такой интерес: Имеется класс (назовем

его) GeneralFunctions с кучкой методов не подходящих ни под одну группу классов, которые дергаются из разных мест.
Какие есть способы доступа к сим методам, кроме:
singltone,
экземпляр класса сделать глобальным,
передавать ссылки на методы или экземпляр класса в виде аргумента в конструктор
?

6 ответов

14 просмотров

в разных языках типа c# или go это получило название "делегат" - ссылка на функцию. В php отдельно передавать ссылки на функции и методы нельзя, но можно немного схитрить - и передать замыкание на базовый объект с генератором (yield) до вызова, то есть вам потребуется объект, его метод (публичный) и функция-враппер с yield в качестве генератора...

𝕽𝖔𝖒𝖆𝖓 𝕯𝖊𝖗 𝕻𝖔𝖌𝖗𝖔𝖒𝖎𝖘𝖙
тогда уж проще экземпляр класса гонять. )

не совсем, в одном случае вы просто сохраните в памяти замыкание - фактически готовый стейт для вызова, в случае прямых вызовов - просто императивно вызовете метод и поменяете стейт объекта. То есть действия совершенно разные - хранить ссылку на обработчик который что-то сделает, и собсно просто этот обработчик вызывать

Alexey Shatunov
не совсем, в одном случае вы просто сохраните в па...

я понимаю это. но 100500 ссылок на объекты тоже как-то неправославно. Но спасибо за мысль.

Alexey Shatunov
не совсем, в одном случае вы просто сохраните в па...

вот что начиталось: " Начиная с PHP объектная переменная больше не содержит сам объект как значение. Такая переменная содержит только идентификатор объекта, который позволяет найти конкретный объект при обращении к нему. Когда объект передаётся как аргумент функции, возвращается или присваивается другой переменной, то эти разные переменные не являются псевдонимами (алиасами): они содержат копию идентификатора, который указывает на один и тот же объект. " и проверил объем съедаемой памяти. память изменяется только при вызове методов и изменении свойств экземпляра объекта. при любых передачах экземпляра объекта в качестве аргумента или return и присваивание выделяемая память не меняется (я подозреваю, что оно просто заранее выделяет под переменные/свойства какой-то объем с запасом, и если создать 100500 переменных, то что-то изменится) [при $a = $b - все статично, но на $a = &$b память дополнительно выделяется] походу оно реально передает только идентификатор объекта поэтому можно тупо кидаться экземпляром объекта. просто "замыкание на базовый объект с генератором" слегка оверкодингом попахивает.

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

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта