BG Development


  Reply to this topicStart new topicStart Poll

> Анонимни функции - аргументи
Flash
Публикувано на: 09-08-2017, 13:45
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 54
Регистриран на: 14.07.16



Здравейте,

опитвам се да разбера откъде идва аргумента на анонимните функции, но не стигам до проблясък icon_lol.gif


В кода долу се вижда, че отначало имаме анонимна функция с аргумент $model (който всъщност не ми е ясно откъде идва), а най-накрая
CODE
function ($event, $payload)
също не разбирам откъде взема тези аргументи. (кода е от ларавел)

Ще съм много благодарен, ако ми помогнете icon_smile.gif

CODE
static::$event(function($model) use ($event){
                        $model->recordActivity($event);
                  });


CODE
  public static function created($callback)
   {
       static::registerModelEvent('created', $callback);
   }


CODE
protected static function registerModelEvent($event, $callback)
   {
       if (isset(static::$dispatcher)) {
           $name = static::class;

           static::$dispatcher->listen("eloquent.{$event}: {$name}", $callback);
       }
   }


CODE
public function listen($events, $listener)
   {
       foreach ((array) $events as $event) {
           if (Str::contains($event, '*')) {
               $this->setupWildcardListen($event, $listener);

           } else {
               $this->listeners[$event][] = $this->makeListener($listener);

           }
       }
   }


CODE
public function makeListener($listener, $wildcard = false)
   {
       if (is_string($listener)) {

           return $this->createClassListener($listener, $wildcard);
       }

       return function ($event, $payload) use ($listener, $wildcard) {

           if ($wildcard) {
               return $listener($event, $payload);
           } else {
               return $listener(...array_values($payload));
           }
       };
   }
PMEmail Poster
Top
CPPlus
Публикувано на: 09-08-2017, 19:27
Quote Post



Име: Людмил Григоров
Група: Потребител
Ранг: Почетен член

Мнения: 1075
Регистриран на: 22.06.11



Не съм прочел какво конкретно питаш, но предполагам, че питаш какво е callback.

Идеята е, че функция №1, която очаква някакви аргументи, се запазва в променлива и се извиква по-късно от друга функция №2, която подава на функция №1 нужните аргументи.

call_user_func

В конкретния случай в документацията на Laravel трябва да е описано какво подава като аргументи на твоя callback icon_smile.gif .


--------------------
Нищо не е свършило, докато не е свършило! Не се предавай и ще постигнеш целта си!
PMEmail Poster
Top
Flash
Публикувано на: 09-08-2017, 22:05
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 54
Регистриран на: 14.07.16



CODE
      protected static function bootRecordsActivity()
      {
            if(auth()->guest()) return;
            foreach (static::getActivitiesToRecord() as $event){

                  static::$event(function($model) use ($event){
                        $model->recordActivity($event);
                  });
            }

            static::deleting(function($model){
                  $model->activity()->delete();
            });
      }


Откъде функцията, която се предава, чрез static::deleting() разбира какво да предаде към $model , като това никъде не се упоменава?

PMEmail Poster
Top
RoYaL
Публикувано на: 10-08-2017, 09:37
Quote Post



Име:
Група: Потребител
Ранг: Старо куче

Мнения: 852
Регистриран на: 21.08.05



Ти даваш референцията към функцията и чакаш някой да я извика.
В случая си казал - давам на deleting() указател към функция, която се нуждае от аргумент, който има метод activity().

Ако deleting() после я извика правилно и подаде обект, който има такъв метод, нещата ще проработят.

Предполагам, че deleting() е държавна функция на framework-а, така че най-вероятно той ще се погрижи да й даде правилните аргументи

Как разбира deleting() - подозирам, че всички обекти, които се подават на тази функция имат такъв метод activity, recordActivity и т.н., вероятно можеш само такива неща да използваш icon_smile.gif

Трябва да почнете да ползвате типизиране на аргументите на функциите, доста по-прозрачни ще станат нещата

Това мнение е било редактирано от RoYaL на 10-08-2017, 09:47
PMEmail Poster
Top
relax4o
Публикувано на: 10-08-2017, 15:56
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1277
Регистриран на: 04.04.07



За да позапълня горното мнение, deleting е нещо от рода.

CODE

... deleting($callback) {
     // ала-бала някакви си работи, за да се осигури обект

     // като $callback ти е анонимната функцията, която подаваш на deleting
     // а $object ти е де факто искания аргумент $model
     $callback($object);
}


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
Flash
Публикувано на: 11-08-2017, 18:32
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 54
Регистриран на: 14.07.16



RoYaL и relax4o мерси много !

Бира от мен icon_lol.gif
PMEmail Poster
Top
RoYaL
Публикувано на: 12-08-2017, 17:31
Quote Post



Име:
Група: Потребител
Ранг: Старо куче

Мнения: 852
Регистриран на: 21.08.05



Кога, къде icon_smile.gif
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2015 | BG Development | All Rights Reserved
RSS 2.0