Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
165 / 150 / 58
Регистрация: 15.06.2013
Сообщений: 1,107

Прохождение всех методов класса через определенную конструкцию

21.08.2016, 08:30. Показов 1528. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Предположим нужно чтобы все методы определенного класса проходили через какую-то конструкцию, например цикл. Насколько правильна данная конструкция и каким образом можно сделать по-другому?
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public function someMethod()
{
    $this->_prepareProc(__FUNCTION__);
}
 
protected function _prepareProc($mehodName)
{
    for(...){
        this->{'_'.$methodName}();
    }
}
 
protected function _someMethod{}
{
    return true;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.08.2016, 08:30
Ответы с готовыми решениями:

Вызов всех методов класса асинхронно
Есть класс в нем методы работы с апи, все они вызываются синхронно, встала задача вызывать их асинхронно. Класс изменять нельзя. Как лучше...

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

Написать программу для демонстрации всех методов класса
Описать класс по протоколу. Сохранить описание в отдельном модуле. Написать программу для демонстрации всех методов описанного класса. В...

26
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
21.08.2016, 08:57
Цитата Сообщение от MadHatter Посмотреть сообщение
все методы определенного класса проходили через какую-то конструкцию
Не особо понял, даже с примером. Попробуйте по-другому описать задачу.
0
165 / 150 / 58
Регистрация: 15.06.2013
Сообщений: 1,107
21.08.2016, 14:30  [ТС]
Предположим у меня есть класс. И я хочу чтобы все методы данного класса выполнялись по 3 раза. Чтобы не писать в каждом методе цикл я создал 1 метод с циклом и туда передаю имя метода, который нужно выполнить в цикле.
0
Software Engineer
 Аватар для Custos
332 / 335 / 55
Регистрация: 23.09.2014
Сообщений: 994
22.08.2016, 23:04
Цитата Сообщение от MadHatter Посмотреть сообщение
я хочу чтобы все методы данного класса выполнялись по 3 раза
У Вас явно проблемы с архитектурой. Приведите хоть один реальный кейс, где необходима такая наркомания.
1
165 / 150 / 58
Регистрация: 15.06.2013
Сообщений: 1,107
23.08.2016, 08:29  [ТС]
Я получаю данные по апи и регулярно бывает так что данные не приходят. И тогда появляются ошибки. Для этого я и пытаюсь сделать чтобы, если данные получены, то выходим из цикла, если нет - запрашиваем еще раз. Возможно конечно есть другой выход из данной ситуации. Буду признателен за подсказку.
0
165 / 150 / 58
Регистрация: 15.06.2013
Сообщений: 1,107
26.08.2016, 08:18  [ТС]
Есть какие-нибудь комментарии по этому вопросу? Плохая идея или нормальная? И есть ли ответ на мой изначальный вопрос?
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
26.08.2016, 08:34
Может за пределы класса вынести цикл?

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$class = new Class();
 
$i = 0;
while($i < 3)
{
    $i++;
    $result = $class->tryConnect();
 
    if($result)
        break;
}
 
if($result)
{
    // Обработка данных
}
else
{
    echo 'Не удалось подключиться.';
}
0
165 / 150 / 58
Регистрация: 15.06.2013
Сообщений: 1,107
26.08.2016, 08:51  [ТС]
Да, но тогда мне при каждом обращении нужно писать цикл, а их очень много.
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
26.08.2016, 08:58
MadHatter, тогда сложно что-то конкретное сказать, нужно видеть структуру класса, понимать как и какие задачи он решает.
1
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
26.08.2016, 09:06
Лучший ответ Сообщение было отмечено MadHatter как решение

Решение

Можно написать рекурсивную функцию вроде этой, чтобы запросы шли через неё:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
    class Test {
        /**
         * @var Максимальное количество попыток
         */
        private $max;
        
        /**
         * @var Количество текущих попыток
         */
        private $attempts;
        
        public function __construct($max){
            $this->max = $max;
        }
        
        public function connect(){
            $this->attempts++;
            
            # Подключаемся
            # ...
            
            if($this->attempts < $this->max && !$result)
                $this->connect();
        }
    }
 
    $test = new Test(3);
    $test->connect();
1
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
26.08.2016, 14:06
Лучший ответ Сообщение было отмечено Jewbacabra как решение

Решение

MadHatter, вариант в первом посте можно чуть упростить с помощью магического метода __call, т.е. вместо кучи someMethod сделать один универсальный __call. Правда, автокомплит пропадет, но это лучше чем подобное дублирование.
Цитата Сообщение от MadHatter Посмотреть сообщение
Я получаю данные по апи и регулярно бывает так что данные не приходят.
Вы правильно мыслите, только цикл надо писать на другом уровне, на том где делается сам запрос.
У вас наверняка есть класс делающий запросы по url. Делаете класс обертку и уже его дергайте из других классов. Соответственно эту обертку вы можете менять как угодно, хоть сто раз запросы делать, хоть логировать итп...

PHP
1
2
3
4
5
6
7
8
9
10
11
12
class CurlWrapper {
    protected $client;
 
    public function __construct() {
        $this->client = new Client();
    }
 
    public function send($requestType, $url, $params) {
        // здесь можно зациклить
        return $this->client->request($requestType, $url, $params);
    }
}
1
165 / 150 / 58
Регистрация: 15.06.2013
Сообщений: 1,107
26.08.2016, 21:44  [ТС]
Para bellum, спасибо, то что нужно. Все время забываю про возможность рекурсии.
tarasalk, понятно. Спасибо за ответ.
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
26.08.2016, 22:33
Цитата Сообщение от MadHatter Посмотреть сообщение
Все время забываю про возможность рекурсии
рекурсия зло
иногда цикл while помогает избавится от рекурсии
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
27.08.2016, 05:49
Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
рекурсия зло
Агрументируйте. К тому же, мы скрываем от с глаз пользователя реализацию. Иначе, ему придётся самому while запускать.
Можно и while инкапсулировать, но в чём тогда отличие от того примера, что я показал?
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
27.08.2016, 12:39
Цитата Сообщение от Para bellum Посмотреть сообщение
Агрументируйте
аргумент 1 память
Цитата Сообщение от Para bellum Посмотреть сообщение
в чём тогда отличие от того примера, что я показал
не будет рекурсии и все, код станет чище и понятливее (не к вашему примеру так как там пара строк)
читая код сверху вниз вы будете понимать что происходит в коде не особо думая какие аргументы будут в вашей функции в очередном вызове с использованием рекурсии
0
165 / 150 / 58
Регистрация: 15.06.2013
Сообщений: 1,107
27.08.2016, 21:12  [ТС]
Fedor Vlasenko, предположим у меня есть много методов для получения различной информации по апи. Тогда получается что мне нужен еще 1 метод с циклом и передавать туда имя метода, который нужно зацикливать. Как в моем первом посте. Но это ведь тоже зло. Или как по другому можно это реализовать?
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
28.08.2016, 13:09
Цитата Сообщение от Custos Посмотреть сообщение
У Вас явно проблемы с архитектурой
Это был правильный ответ. По ходу.
Цитата Сообщение от MadHatter Посмотреть сообщение
Но это ведь тоже зло
С каких времен циклы злом стали. Запускайте цикл, нет ответа делайте sleep и обратно цикл по кругу, есть ответ break или return
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
28.08.2016, 13:47
Цитата Сообщение от MadHatter Посмотреть сообщение
предположим у меня есть много методов для получения различной информации по апи. Тогда получается что мне нужен еще 1 метод с циклом и передавать туда имя метода, который нужно зацикливать
tarasalk уже ведь правильный ответ дал. 1 класс, который отвечает за запрос к апи. Все что должно общаться с апи делегирует отправку запроса этому классу, внутри которого уже делать запросы пока не будет получен ответ (установить максимальное число запросов желательно)
1
165 / 150 / 58
Регистрация: 15.06.2013
Сообщений: 1,107
29.08.2016, 12:55  [ТС]
Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
С каких времен циклы злом стали
Я не про циклы, а про передачу имени метода в качестве параметра.
Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
Это был правильный ответ. По ходу.
Наверное. Потому я и обратился сюда за помощью.
Jewbacabra, я же не спорю. Интересующий меня ответ я получил. Мне просто было интересно каким образом Fedor Vlasenko решил бы данную задачу.
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
29.08.2016, 13:09
Цитата Сообщение от MadHatter Посмотреть сообщение
Fedor Vlasenko решил бы данную задачу.
Цитата Сообщение от MadHatter Посмотреть сообщение
получаю данные по апи и регулярно бывает так что данные не приходят.
Так решайте проблему там где отдается Api, а не стройте костыль поверх.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.08.2016, 13:09
Помогаю со студенческими работами здесь

Как обеспечить видимость класса в пределах формы и всех ее методов
Здравствуйте! Подскажите новичку :) Такая проблема: недавно взялся изучать C#. Пытаюсь написать калькулятор доходности по депозиту,...

Написать меню, позволяющее осуществить проверку всех методов класса
Помогите пожалуйста написать меню, позволяющее осуществить проверку всех методов класса. Для программки import java.util.*; ...

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

Управляемый цикл через вызовы методов класса
Предположим есть такой класс: class A: def __init__(self, elem): self.elem = elem def push(self): ...

Описание всех свойств и методов класса следует вынести в отдельный модель Planet.cpp
source.cpp #include &lt;iostream&gt; #include &quot;Planet.h&quot; int main() { // Создание объекта класса Planet Planets planet; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru