Хобрук: Ваш путь к мастерству в программировании

Как мне указать на другую функцию? Это возможно?

Цель состоит в том, чтобы сделать имя функции короче.

У меня есть функция под названием somedescriptivefunctionName.

function somedescriptivefunctionName($a) {
   echo $a;
}

Хочу назначить его на $this->f, чтобы не засорять код длинными именами.

$this->f('Yahoo!!'); // will echo 'Yahoo!!'

например Я представляю что-то вроде этого:

$this->f = $this->somedescriptivefunctionName; // wrong way

Это возможно?

Конечно, я мог бы создать новую функцию f и возвращать функцию somedescriptivefunctionName(). Но дело не в этом.

05.07.2020

  • Является ли f здесь функцией или переменной? 05.07.2020
  • f должно быть новым именем, которое я хочу дать своей функции (somedescriptivefunctionName), которая уже существует. Но вы правы, что это тоже переменная. Если хотите, можете выбрать $f вместо $this-›f 05.07.2020
  • находятся ли они в одном классе, наследовании или любом другом сценарии? 05.07.2020
  • @Chilarai, давайте пока не будем усложнять. скажем, они в одном классе 05.07.2020

Ответы:


1

Вы будете хранить где-то строку

$f = "somedescriptivefunctionName";

а затем вызвать функцию, указав ее имя в фигурных скобках:

$this->{$f}('Yahoo!!');

РЕДАКТИРОВАТЬ

Согласно разделу комментариев, цель состоит в том, чтобы вызвать метод экземпляра другого класса с тем же именем. Вы можете расширить класс конфигурации, чтобы добиться похожего поведения, но я думаю, что это неприемлемо в качестве решения в данном случае. Вы можете преобразовать свой класс в декоратор, например

class SomeClassDecorator
{
    protected $_instance;

    public function myMethod() {
        return strtoupper( $this->_instance->someMethod() );
    }

    public function __construct(SomeClass $instance) {
        $this->_instance = $instance;
    }

    public function __call($method, $args) {
        return call_user_func_array(array($this->_instance, $method), $args);
    }

    public function __get($key) {
        return $this->_instance->$key;
    }

    public function __set($key, $val) {
        return $this->_instance->$key = $val;
    }

    // can implement additional (magic) methods here ...
}

Приведенный выше код был скопирован из удивительного ответа Гордона здесь: Как добавить метод в существующий класс в PHP?

Эволюция этой идеи может состоять в том, чтобы создать декоратор для вашего класса конфигурации в качестве базового класса и расширить этот базовый класс для ваших классов, настроенных этим, поэтому вы реализуете один декоратор и (повторно) используете его.

05.07.2020
  • Я могу подтвердить, что это несколько полезно, но мне нужно что-то получше. Используя ваш метод, я делаю это, и он работает: $ref = new ReflectionClass($this-›config_class); $this-›plcfg=$ref-›newInstanceWithoutConstructor(); $errorTitle='errorTitle'; echo $this-›plcfg-›${errorTitle}('fatal','asdf'); Моя цель состоит в том, чтобы сделать это: echo $this-›errorTitle('fatal','asdf'); Если мы сможем это сделать, то вызов будет одинаковым в обоих классах (текущем классе и удаленном классе, который находится в $this->plcfg) Спасибо!!! 06.07.2020

  • 2

    Вы можете привязать свойство к замыканию и вызвать свойство как метод:

    class T{
        private $f;
        function abcdefghijklmnopqrstuvwxyz($param){
            echo $param;
        }
        function __construct(){
            $this->f = fn() => $this->abcdefghijklmnopqrstuvwxyz(...func_get_args());
        }
        function doWork() {
            ($this->f)('hello');
            $g = $this->f;
            $g('world');
        }
    }
    
    (new T())->doWork();
    

    В этом коде свойство класса f привязано к замыканию через стрелочную функцию, которая стала доступна в PHP 7.4, и мы можем динамически получать аргументы, передаваемые через func_get_args. Если вы используете версию ниже 7.4, вы также можете использовать обычную анонимную функцию.

    К сожалению, из-за проблем с разрешением имен свойства нельзя вызывать как методы без использования дополнительного набора скобок, что означает, что вам нужно сделать ($this->f)('hello'). Если вы хотите пропустить это, вы можете дополнительно присвоить свойство класса локальной переменной, которая затем может вызываться обычным образом по мере выполнения $g.

    изменить

    Вот версия конструктора, в которой не используются стрелочные функции, он вызывается точно так же.

        function __construct()
        {
            $this->f = function () {
                return $this->abcdefghijklmnopqrstuvwxyz(...func_get_args());
            };
        }
    
    05.07.2020
  • Это очень хорошо. Почти идеально, если бы не тот факт, что это php7.4+ и следующее: $this-›f = fn() =› $this-›plcfg-›errorTitle(...func_get_args()); $this-›errorTitle=$this-›f; echo ($this-›errorTitle)('fatal','hello'); Можно ли перейти к этому этапу, когда нам не нужны скобки, например: echo $this-›errorTitle('fatal','hello'); Если мы сможем это сделать, то вызов будет одинаковым в обоих классах (текущем классе и удаленном классе, который находится в $this->plcfg) Спасибо!!! 06.07.2020
  • Новые материалы

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

    Да, но я чувствую необходимость указать, что это или не единственные два.
    Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.

    Получение стоковых обновлений с помощью Python
    Для начинающего финансового аналитика Введение Описание: Этот проект Python создает скрипт для получения текущих обновлений акций с финансового веб-сайта Yahoo. Для этого проекта мы..