|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
Не получается у меня решить несколько вопросов. Не подскажите решение? Если это зависит от версии, то мне актуальна версия 5.4. 1. Допустим мне нужна функция, которая может принимать как byref, так и byval аргументы. То есть эту функцию я могу вызывать как func1($arr), так и func1([]) — в первом варианте в $arr после вызова функции могут быть внесены изменения. Я не могу в ее декларации написать function func1(&$arg), потому что тогда второй синтаксис станет недоступен. Если же использовать декларацию function func1($arg), то по всей видимости добраться до ссылки на $arg будет невозможно. В интернете я нагуглил такой пример (способы с перехватом вывода и парсингом debug_zval_dump я вообще не рассматриваю): Код: php 1. 2. 3. 4. 5. 6. 7.
Однако я не пойму, как этот код работает (если он вообще работает), такая проверка: Код: php 1. 2. 3. 4. 5.
дает false для всех трех примеров. 2. Допустим у меня есть функция с произвольным числом аргументов. И в один из аргументов я хочу возвращать значения, если это потребуется. Внутри этой функции я использую func_get_args, то в этом случае до ссылок я добраться не могу. Тут я придумал два способа, но первый способ начиная с 5.4 не работает (да и в любом случае такой способ мне не нравится), а второй способ имеет те же ограничения, что и первый вопрос (я не могу вызвать эту функцию и передать не ссылку): Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2019, 21:39 |
|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
Сочинил такой способ, максимально близкий к тому, что мне бы хотелось (за исключением дуального byval/byref аргумента функции, похоже это ограничение архитектуры): Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43.
Здесь методы bind и exec эмулируют методы внешней библиотеки oci8, а разбивка на методы query и proc обусловлена уже моими предпочтениями. К внутреннему свойству params в методе proc я вынужден обращаться напрямую ($params = &$this->param;), потому что если получать его через функцию ($params = $this->param();), то я получаю не ссылку, а копию, и соответственно к методу bind я привязываю не исходные переменные, а копии. Из-за этого в реальном коде это свойство я вынужден делать protected, а не private. Не посоветуете, что тут улучшить или переделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2019, 00:28 |
|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
Вот финальный вариант: Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68.
Он работает, но я бы хотел в методе proc() работать не через приватную переменную $param, а через приватный метод param(). Указать $params = &$this->param() я не могу — получаю сообщение о том, что получить ссылку можно только у переменной. Если же указать $params = $this->param(), а в декларации метода задать возврат ссылки private function ¶m — то получаю Segmentation fault. Что я делаю не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2019, 08:39 |
|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
Alibek B.задать возврат ссылки private function & param — то получаю Segmentation fault ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2019, 08:53 |
|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
Правильней будет так: Код: php 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2019, 16:08 |
|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
Немного ошибся Код: php 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2019, 16:15 |
|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
Это как-бы невалидный код. Я все эти варианты пробовал. $params = &$this->param(); — неверный синтаксис, & может быть только у переменных, не у функций/методов. return $this->param[$param]; — в моем варианте именно так и указано private function ¶m — сразу же segfault ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2019, 19:30 |
|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
а задлянафига оно тебе надо? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2019, 12:31 |
|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
Alibek B.мне нужна функция, которая может принимать как byref, так и byval аргументы. То есть эту функцию я могу вызывать как func1($arr), так и func1([]) — в первом варианте в $arr после вызова функции могут быть внесены изменения. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2019, 12:42 |
|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
Или речь про function ¶m() ? Чтобы использовать protected-метод, а не protected-свойство. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2019, 12:52 |
|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
автормне нужна функция, которая может принимать как byref, так и byval аргументы зачем? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2019, 13:14 |
|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
Это удобно в использовании. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2019, 13:26 |
|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
Наркомания какая-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2019, 15:03 |
|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
ScareCrowArrayAccess тебе в помощь. А в чем удобство? Удобно — это когда я могу просто написать $db->query($sql, [':p1'=>111]) — в тех случаях когда мне не нужны возвращаемые параметры. А если нужны — тогда вначале создаю массив $p=[':p1'=>111], а затем указываю его при вызове метода. Отсутствие возможности call-time pass-byref означает, что первый синтаксис мне недоступен и мне всегда нужно создавать массив, прежде чем вызвать метод. Это некоторое неудобство, хотя и терпимое. А использование ArrayAccess означает, что мне все равно нужно будет создавать параметры отдельно от вызова метода, только их создание станет еще более многословным. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2019, 16:39 |
|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
Alibek B.Удобно — это когда я могу просто написать $db->query($sql, [':p1'=>111]) — в тех случаях когда мне не нужны возвращаемые параметры. А если нужны — тогда вначале создаю массив $p=[':p1'=>111], а затем указываю его при вызове метода. это делается так: Код: php 1. 2.
а вот ту всю ересь наверху - сжечь. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2019, 16:47 |
|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
А как я получу измененные значения, вызвав f1? Или мне нужно вызывать f1 или f2 в зависимости от того, требуется ли мне передать в них переменную или выражение? Два варианта одного и того же метода с вариациями byval/byref — это еще более криво, чем использовать только byref и всегда создавать переменную для метода. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2019, 16:57 |
|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
это вы так шутите да кривее вот этого ничего уже не может быть во всей Галактике: Alibek B.Сочинил такой способ, максимально близкий к тому, что мне бы хотелось (за исключением дуального byval/byref аргумента функции, похоже это ограничение архитектуры): если у вас острая необходимость иметь возможность передать переменную без ссылки: Код: php 1.
то прямее этого ничего нет в принципе. Alibek B.Или мне нужно вызывать f1 или f2 в зависимости от того, требуется ли мне передать в них переменную или выражение? это ещё и не очевидно для вас ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2019, 19:32 |
|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
Про такое говорят - ничего слаще моркови не ел. Возможность передать аргумент по ссылке или по значению на выбор - это нормально, такое доступно во многих языках. А считать невозможность этого нормальной, как и использование двух функций - это деформация. Например мне нужно использовать магический метод __call и передать в него аргумент по ссылке, чтобы в него можно было вернуть значение. Но у магического метода нет декларируемых аргументов и способ передачи по ссылке ему объявить нельзя, только получить массив аргументов по значению. Ну или передавать в него объект с реализацией ArrayAccess, например. Это иначе, как кривой подход, не назвать. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2019, 20:01 |
|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
если чтото надо получить из функции, это надо возвращать из функции через ключевое слово return. или переходите на новую версию php там есть штатная возможность отличить передачу по ссылку от передачи по значению. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2019, 10:26 |
|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
ScareCrowесли чтото надо получить из функции, это надо возвращать из функции через ключевое слово return. Действительно: https://www.php.net/manual/ru/function.oci-bind-by-name.php https://www.php.net/manual/ru/mysqli-stmt.bind-param.php https://www.php.net/manual/ru/function.sort.php ScareCrowили переходите на новую версию php там есть штатная возможность отличить передачу по ссылку от передачи по значению. Возможно потом так и сделаю, но пока нужно использовать 5.4. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2019, 11:06 |
|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
Alibek B.Я все эти варианты пробовал. Я не вижу, где ты пробовал. В твоих примерах нет метода с корректным возвратом по ссылке. А я указал корректный метод. Ты его пробовал? Код: php 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2019, 17:03 |
|
PHP - вопросы по ссылкам
|
|||
---|---|---|---|
#18+
Снова подниму тему, но уже по синтаксису. У меня есть класс с таким методом: Код: php 1.
Метод я могу вызывать например так: Код: php 1.
А вот так не могу: Код: php 1. 2. 3.
Приходится использовать так: Код: php 1.
А хотелось бы без использования переменных. Можно ли это как-то решить на уровне деклараций? Например в некоторых ЯП перезагрузка функций определяется количеством аргументов и их типов. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 11:10 |
|
|
start [/forum/topic.php?fid=23&msg=39876737&tid=1459598]: |
0ms |
get settings: |
10ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 148ms |
0 / 0 |