Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Заблокирован
1

Как можно сжать данный код, вызов функции?

05.03.2016, 13:39. Показов 1040. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
PHP
1
2
3
4
5
6
7
 if ( isset($get['q']) && $get['q'] == 2) { 
                 $data["result"] = $this->functions->question2();
            } else if ( isset($get['q']) && $get['q'] == 3) { 
                 $data["result"] = $this->functions->question3();
            } else if ( isset($get['q']) && $get['q'] == 4) { 
                 $data["result"] = $this->functions->question4();
            }
Можно ли вызов функции записать так:
PHP
1
question$$get[;q'();
или так:
PHP
1
question.$get['q']();]
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.03.2016, 13:39
Ответы с готовыми решениями:

Можно ли узнать имя функции, код которой исполняется в данный момент времени?
Ну собственно просто интересно, есть ли такая возможность. Нужно это для более гибкого дебага, ну...

Как можно сократить данный код?
1.Как можно упростить(сократить) этот код? 2.Почему я не могу объявить его в public partial class...

Как можно оптимизировать данный код?
И... Ещё один вопрос: Дан участок кода С++: #include <iostream> #include "Windows.h" ...

Как можно оптимизировать (уменьшить) данный код?
<script> $('#save').click(function () { // add loading image to div ...

13
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
05.03.2016, 13:42 2
Цитата Сообщение от poss Посмотреть сообщение
Можно ли вызов функции записать так:
почему бы не попробовать выполнить данный код?
0
Hello Kitty
690 / 562 / 402
Регистрация: 12.02.2016
Сообщений: 1,436
Записей в блоге: 1
05.03.2016, 13:42 3
Лучший ответ Сообщение было отмечено poss как решение

Решение

PHP
1
2
3
4
$funTable = [2 => 'question2' , 3 => 'question3' , 4 => 'question4'];
if ( @($funName = $funTable[ $get['q'] ] ) ) {
    $data["result"] = $this->functions->{$funName}();
}
1
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
05.03.2016, 13:44 4
PHP
1
2
3
if (!empty($get['q'])) {
    $data['result'] = $this->functions->{"question$get[q]"}();
}
1
Hello Kitty
690 / 562 / 402
Регистрация: 12.02.2016
Сообщений: 1,436
Записей в блоге: 1
05.03.2016, 13:46 5
PHP
1
2
3
if ( @( $i=$get['q'] ) && ($i >= 2 && $i<=4) ) {
    $data['result'] = $this->functions->{'question'.$i}();
}
0
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
05.03.2016, 14:05 6
poss, Я бы сделал так:
PHP
1
2
3
if (isset($get['q'])) {
    $data["result"] = (2 <= $get['q'] && $get['q'] <= 4) ? $this->functions->{'question'.$get['q']}() : '' ;
};
1
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
05.03.2016, 14:37 7
Что-то я сомневаюсь в правильности подхода. Что вообще делают те методы и почему их именно так именуете?
В любом случае, такие проверки лучше не делать:
PHP
1
(2 <= $get['q'] && $get['q'] <= 4)
А что, если методов поприбавится?
PHP
1
2
3
4
5
6
7
8
9
10
if (!empty($get['q'])) {
    # Формируем имя метода
    $method = 'question' . $get['q'];
    
    # Если метод не существует
    if(!method_exists($this->functions, $method))
        throw new Exception("Метод {$method} не найден");
    
    $data['result'] = $this->functions->$method();
}
1
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
05.03.2016, 15:02 8

Не по теме:

Цитата Сообщение от Para bellum Посмотреть сообщение
А что, если методов поприбавится?
Я всегда пытаюсь мыслить глобально, но нехватка знаний иногда мешает этому, а так отличное решение :good:



Добавлено через 5 минут
Para bellum, Но опять же, в нем не учитывается проверка:
$get['q'] == 2;
$get['q'] == 3;
$get['q'] == 4;
в частности может надо что то другое сделать когда $get['q'] выходит за рамки интервала, конечно это мало вероятно, но все же имеет быть место.
0
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
05.03.2016, 15:12 9
Цитата Сообщение от Gcom Посмотреть сообщение
Para bellum, Но опять же, в нем не учитывается проверка
Да, Вы правы. Только это
Цитата Сообщение от Gcom Посмотреть сообщение
в частности может надо что то другое сделать когда $get['q'] выходит за рамки интервала, конечно это мало вероятно, но все же имеет быть место.
действительно маловероятно, а вот если в объекте "$this->functions" содержатся ещё методы, к которым доступ через указание в "$get['q']" не предполагается — мой вариант действительно не подходит.
Поэтому я и спросил у автора темы:
Цитата Сообщение от Para bellum Посмотреть сообщение
Что вообще делают те методы и почему их именно так именуете?
Добавлено через 43 секунды
Чувствую, что не то что-то он творит.
0
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
05.03.2016, 15:27 10
Цитата Сообщение от Para bellum Посмотреть сообщение
мой вариант действительно не подходит.
Все подходит, что мешает сделать это:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
if (isset($get['q'])) {
    if (!empty($get['q'])) {
        # Формируем имя метода
        $method = 'question' . $get['q'];
    
        # Если метод не существует
        if(!method_exists($this->functions, $method))
            throw new Exception("Метод {$method} не найден");
    
    $data['result'] = (2 <= $get['q'] && $get['q'] <= 4) ? $this->functions->$method() : '' ;
    
    };
};
Вроде и правильно и проверки есть
0
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
05.03.2016, 15:36 11
Цитата Сообщение от Gcom Посмотреть сообщение
Вроде и правильно и проверки есть
Тогда там моя проверка вообще не нужна. В итоге приходим назад, к Вашему варианту.
Допустим, есть метод "questionFoo". Мою проверку $get['q'] равное "Foo" пройдёт. А вот Вашу — нет, ибо в диапазон не вписывается.
В таком случае не получится перехватить ошибку. Эти всякие "throw" и нужны, чтобы держать под контролем приложение. Чтобы можно было потом в отчёт записать, что метод неверный вызван и т.д. и т.п.
0
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
05.03.2016, 15:53 12
Цитата Сообщение от Para bellum Посмотреть сообщение
Допустим, есть метод "questionFoo". Мою проверку $get['q'] равное "Foo" пройдёт.
Дак у нас проверка идет на 2,3,4 если нужно Foo, то надо добавить и эту проверку, и тогда будет все гуд: как пример:
PHP
1
$data['result'] = (2 <= $get['q'] && $get['q'] <= 4 && $get['q'] == 'Foo') ? $this->functions->$method() : '' ;
но опять же, если число проверок увеличиться, то с этим:
PHP
1
(2 <= $get['q'] && $get['q'] <= 4 && $get['q'] == 'Foo')
явно что-то надо будет делать...

Добавлено через 1 минуту
даже скорее всего так:
PHP
1
((2 <= $get['q'] && $get['q'] <= 4) || $get['q'] == 'Foo')
Добавлено через 1 минуту
или отдельной строкой:
PHP
1
2
$data['result'] = (2 <= $get['q'] && $get['q'] <= 4) ? $this->functions->$method() : '' ;
$data['result'] = ($get['q'] == 'Foo') ? $this->functions->$method() : '' ;
0
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
05.03.2016, 16:03 13
Цитата Сообщение от Gcom Посмотреть сообщение
Дак у нас проверка идет на 2,3,4 если нужно Foo, то надо добавить и эту проверку, и тогда будет все гуд
Да нет, я не о том. Я про это:
Цитата Сообщение от Para bellum Посмотреть сообщение
а вот если в объекте "$this->functions" содержатся ещё методы, к которым доступ через указание в "$get['q']" не предполагается — мой вариант действительно не подходит
Доступ к Foo не нужен. Например, создатель кода не хочет, чтобы был доступ к Foo, но Ваш вариант ничего не выдаст пользователю (или составителю отчётов) — он просто оборвёт работу и всё.

А обрывать так не стоит. Лучше бросать исключения, как я показал. Типа такого:
PHP
1
2
if(!(2 <= $get['q'] && $get['q'] <= 4))
    throw new Exception('сообщение');
Добавлено через 2 минуты
P.S. Но мне подобная проверка не нравится.
0
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
05.03.2016, 19:04 14
Цитата Сообщение от Para bellum Посмотреть сообщение
P.S. Но мне подобная проверка не нравится.
Я подумал и увидел, что тут тоже есть "грешки", например что будет если $get['q'] = 3.5 понятное дело, что произойдет вызов метода question3.5(), что не есть гуд, это так то тоже желательно учесть, думаю это дело делать так придется:
PHP
1
($get['q'] == 2 || $get['q'] == 3 || $get['q'] == 4)
ну или через
PHP
1
case()
если параметров больше будет, при необходимости запихать в функцию, в которой как вариант сравнивать $get['q'] с массивом значений
PHP
1
array (2, 3, 4, ...)
0
05.03.2016, 19:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2016, 19:04
Помогаю со студенческими работами здесь

Как можно сократить и упростить данный код
Всем привет! Появилась отличная идея сделать консольную игру типа 2D головоломки. Создал дизайн...

Как данный код можно перенести в Silverlight приложение
Здравствуйте. В приложении WPF в коде есть следующие строки: private void...

Модернизировать данный код под вызов в интервале 1 мс
ребят помогите пожалуйста можно как нибудь улучшить данный код, стоит под таймером, таймер...

Можно ли оптимизировать данный код?
Есть задача: Прочитать шифр: Решил вот так: k = 0 aList = for s in &quot;g fmnc wms bgblr...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru