За последние 24 часа нас посетил 34271 программист и 1709 роботов. Сейчас ищут 808 программистов ...

Как в классе выполнить анонимную функцию которая содержится в свойстве

Тема в разделе "PHP для новичков", создана пользователем Dedov_Evgeniy, 27 окт 2017.

  1. Dedov_Evgeniy

    Dedov_Evgeniy Активный пользователь

    С нами с:
    14 май 2015
    Сообщения:
    58
    Симпатии:
    1
    PHP:
    1. class MyClass(){
    2. // У данного класса имеется свойство, например Item которое является анонимной функцией
    3. // Как выполнить её в этом классе
    4. }
    Спасибо.
     
  2. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    PHP:
    1. class MyClass(){
    2. // У данного класса имеется свойство, например Item которое является анонимной функцией
    3. // И она выполняется в этом классе
    4. }
    На здоровье.
     
  3. Dedov_Evgeniy

    Dedov_Evgeniy Активный пользователь

    С нами с:
    14 май 2015
    Сообщения:
    58
    Симпатии:
    1
    Сам то знаешь решение)))
     
  4. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    мне кажется свойство не сделаешь анонимной функцией)
     
    TeslaFeo нравится это.
  5. gruth

    gruth Активный пользователь

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
  6. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    С чего бы?

    @Dedov_Evgeniy, также, как и из обычной переменной. Т.е. через call_user_func.
     
  7. Dedov_Evgeniy

    Dedov_Evgeniy Активный пользователь

    С нами с:
    14 май 2015
    Сообщения:
    58
    Симпатии:
    1
    Понял.
    Вообще сделал одно свойство - массив (private $config = array()). И уже в элемент массива загнал анонимную функцию.
    PHP:
    1. $this->config['item'](); // Так работает
     
  8. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    С массивом да, массив он с методом не перепутает. Тоже хорошая идея
     
  9. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    так не работает)
    PHP:
    1. class Test {
    2.     public $myVar = function($bla){return $bla;};
    3.    
    4.     public function myMet($bla) {      
    5.         return $bla;
    6.     }
    7. }
     
  10. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    @Алекс8 ну так php подразумевает константу справа от =
    присвой полю значение в конструкторе
     
    Алекс8 нравится это.
  11. Dedov_Evgeniy

    Dedov_Evgeniy Активный пользователь

    С нами с:
    14 май 2015
    Сообщения:
    58
    Симпатии:
    1
    Нет, пробовал(
     
  12. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Присвой в конструкторе, Карл!
     
    Алекс8 нравится это.
  13. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    @artoodetoo точно) протупил))
    PHP:
    1. class Test {
    2.     public $myVar;
    3.  
    4.     public function __constructor() {
    5.         $this->myVar = function($bla){return $bla;};
    6.     }
    7.    
    8.     public function myMet($bla) {    
    9.         return $bla;
    10.     }
    11. }
    12.    
    13. $obj = new Test;
    14.  
    15. echo $obj->myMet(5);
     
  14. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    какой вопрос, такой ответ.
    ты выложил класс, в котором ничего нет и написал, что в нём что-то есть.
    я выложил класс, в котором ничего нет и написал, что в нём есть решение.
    всё честно.
    --- Добавлено ---
    в свойство попадет то, что вернёт функция, а не сама функция.
    --- Добавлено ---
    али ошибаюсь?
     
    Алекс8 нравится это.
  15. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    PHP:
    1. class Test {
    2.     public $myVar;
    3.  
    4.     public function __construct() {
    5.         $this->myVar = function(){return 7;};
    6.     }
    7.    
    8.     public function myMet() {    
    9.         return $this->myVar;
    10.     }
    11. }
    12.    
    13. $obj = new Test;
    14.  
    15. var_dump($obj->myMet());
    вот что возвращает..
    Код (Text):
    1. object(Closure)[2]
    2.   public 'this' =>
    3.     object(Test)[1]
    4.       public 'myVar' =>
    5.         object(Closure)[2]
    6.           public 'this' =>
    7.             &object(Test)[1]
    что то я не понял как это работает))
    --- Добавлено ---
    логически должно да.. результат попадать.. хотя вот в таком случае работает как анонимная функция

    Код (Text):
    1. $anon = function($var){
    2.     return (5 * (int)$var);
    3. };
    4. echo $anon(5);
    5.  
    6. //25
     
  16. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Свойство - такая же переменная, если ты в переменную можешь записать анонимную функцию, почему не можешь в свойство? Запросто делается. Только вызвать, как с переменной, не получится
    PHP:
    1. $f = function () {/* ... */};
    2. $f(); // OK
    3.  
    4. class A {
    5.    public $f;
    6.    public function __construct() {
    7.        $this->f = function () {/*...*/}
    8.    }
    9. }
    10.  
    11. $a = new A;
    12. $a->f(); // Error: undefined method;
    13.  
    14. call_user_func($a->f); // OK
     
  17. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    PHP:
    1. <?php
    2. class Foo {
    3.   public $item;
    4.   public function __construct() {
    5.     $this->item = function($a) {
    6.       return $a ** 2;
    7.     };
    8.   }
    9.   public function someFunc($a) {
    10.     return $this->item->__invoke($a);
    11.   }
    12. }
    13. $foo = new Foo();
    14. echo $foo->someFunc(5);
    Код (Text):
    1. 25
     
  18. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Итого
    Никак
     
  19. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Почему?
    PHP:
    1. call_user_func($this->item);
    2. // или
    3. $this->item->__invoke();
     
  20. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    свойство же не может содержать функцию.
    в первом случае свойство содержит обычную строку, в которой хранится название функции.
    А второй случай я не знаю что такое :)
     
  21. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Анонимная функция это не функция,а экземпляр класса Closure, у которого есть свои методы,в число которых входит магический метод __invoke().Поэтому в моем примере в item находится непосредственно анонимная функция или же экземпляр класса Closure. Так как мы не можем непосредственно вызвать анонимную функцию через (), мы вызываем ее используя магический метод __invoke()

    https://secure.php.net/manual/ru/language.oop5.magic.php#object.invoke
    https://secure.php.net/manual/ru/class.closure.php
     
  22. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    ну там по идее хранится указатель.. раз это метод класса..
     
  23. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    кроме того, если есть имя функции, то функция перестает быть ананимной.