За последние 24 часа нас посетили 62077 программистов и 1599 роботов. Сейчас ищут 960 программистов ...

Функция в аргументе метода класса.

Тема в разделе "PHP для новичков", создана пользователем askanim, 4 июл 2016.

  1. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    PHP:
    1. $result = $this->db->table($nameTable)
    2.                         ->where(function () use($tableCheckParameters){
    3.                             $whereArray = [];
    4.                             foreach($tableCheckParameters as $key => $value) {
    5.                                 $arr[] = $key.'='.'"'.$_POST[$value].'"';
    6.                             }
    7.                             echo '<pre>';
    8.                             print_r($whereArray);
    9.                             echo '</pre>';
    10.                             return $whereArray;
    11.                         })
    12.                         ->get();
    Попытался сделать так, но почему то не отрабатывает он так.... По логике вещей функция должна вернуть массив, который передастся в аргумент метода... Но почему то не хочет так делать...
     
  2. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Подозреваю всё потому же , что обычные функции, не имеют магической силы в классах....
     
  3. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Можно так:
    PHP:
    1. $test = function() {
    2.     return 'привет';
    3. };
    4.  
    5. function view($test) {
    6.     echo $test();
    7. }
    8.  
    9. view($test);
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @askanim так что возвращает магическая функция?

    Какой код в функции where?

    PHP:
    1. <?php
    2. class test
    3. {
    4.   public $result = array();
    5.  
    6.   function anon($f) {
    7.     if (is_callable($f)) {
    8.       $this->result = $f();
    9.     }
    10.     return $this;
    11.   }
    12.  
    13.   function get_result() {
    14.     return $this->result;
    15.   }
    16. }
    17.  
    18. $arr = ['one', 'two'];
    19. var_export((new test)->anon(function() use ($arr) {
    20.   return $arr;
    21. })->get_result());
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Нет, по логике вещей ты просто передал в метод where callable-ссылку на анонимную функцию, и больше ничего :) А вызывать её должна уже where. В PHP по-моему, нельзя как в javascript в рамках одной операции определить и вызвать анонимную функцию
     
  6. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    PHP:
    1. class Foo
    2. {
    3.     public function run($arguments)
    4.     {
    5.         var_dump($arguments);
    6.     }
    7. }
    8.  
    9. $foo = new Foo;
    10. $data = [0, 1, 2, 3, 4];
    11. $foo->run(
    12.     (function() use ($data) {
    13.         $response = array_map(function($item) {
    14.             return ++$item;
    15.         }, $data);
    16.         return $response;
    17.     })()
    18. );
    Так?
    --- Добавлено ---
    хех... это работает только в PHP7 )
     
    askanim, mahmuzar и mkramer нравится это.
  7. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Ёпт над на php 7 перебераться, удобненько.
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    А нахрена оно в таком контексте нужно? Нагляднее сделать так, и строчек меньше:
    PHP:
    1. class Foo
    2. {
    3.     public function run($arguments)
    4.     {
    5.         var_dump($arguments);
    6.     }
    7. }
    8. $foo = new Foo;
    9. $data = [0, 1, 2, 3, 4];
    10. $data = array_map(function($item) {
    11.             return ++$item;
    12. }, $data);
    13. $foo->run($data);
    Другое дело, когда так:
    PHP:
    1. function f()
    2. {  
    3.    $data = [0, 1, 2, 3, 4];
    4.    $a = 5;
    5.    $data = array_map(function($item) use ($a) {
    6.             return $a + $item;
    7.    }, $data);
    8.   return $data;
    9. }
    В этом и есть смысл замыкания, что функция, вызываемая из array_map имеет доступ к локальной переменной другой функции
     
    denis01 нравится это.
  9. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    т.е. ты учишь php не на семёрке?
     
  10. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    я на работе пишу не на семёрке. У меня тут 5,6. Просто поставил её, но в принципе там всё войдёт и на семёрку, так как не пишу вообще старые вариации.
     
  11. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Это пока локально проект, но рабочий вариант в свет буду запускать на семёрке.