Создание функции с использованием другой функции

KolyaA

Новичок
Имеются классы отдельных моделей, которые наследуют от общего класса Model.

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

PHP:
  public function getZapis(Набор аргументов функции getZapisi)
  {
    $res = $this->getZapisi(Набор аргументов функции getZapisi);
    return $res[0];
  }
Вопрос в том: Можно ли как-то средствами ПХП задать функцию getZapis один раз в классе Model? Чтобы не повторять по сути один и тот же код в каждом из классов моделей?
 

Adelf

Administrator
Команда форума
Можно.

за getZapis отстранял бы от компа и заставлял бы по 500 раз на доске писать "Я не буду использовать транслит для именования сущностей программного кода".

getRecord и getRecords - так плохо выглядит чтоли??
 

rotoZOOM

ACM maniac
А может лучше функция getZapis не будет пользоваться getZapisi, зачем надо получать весь массив записей и потом из него извлекать первую, может легче сразу первую получить?
 

KolyaA

Новичок
А может лучше функция getZapis не будет пользоваться getZapisi, зачем надо получать весь массив записей и потом из него извлекать первую, может легче сразу первую получить?
Смысл в том, что мне нужна по сути одна функция, но в зависимости от обстоятельств возвращающая результат в разном виде. Либо в виде набора строк, либо в виде одной строки. Пытаюсь сделать это таким образом, как описал.
 

Adelf

Administrator
Команда форума
KolyaA
есть два некрасивых решения.
первое __call .
Второе Наборы аргументов заменить на ассоциативные массивы.
 

Духовность™

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

grigori

( ͡° ͜ʖ ͡°)
Команда форума
ПАДСТАЛОМ со всех этих ваших комментариев :) Все такие гениальные архитекторы, шописец. Главное - окунуть новичка в грязь, а что у самих говно(код) из всех дыр лезет - так это вроде никто не видит :)

и никто же не напишет простую фразу: http://php.net/func_get_args, http://php.net/func_num_args, http://php.net/call_user_func, http://php.net/__call

подход у ТСа правильный, динамические вызовы - мощное средство, пока не попробует разные подходы - не найдет свой стиль
 

Adelf

Administrator
Команда форума
grigori
Не все так прозрачно.
Мне показалось, в частности из-за названия функции, что у ТС нечто похожее на паттерн Репозиторий.
В таком случае в функцию нужно передавать некий объект Criteria. В некоторых простых случаях вполне можно заменить ассоциативном массивом.

а на транслит в коде у меня страшная аллергия после работы с некоторыми образцами финского кода.
 

A1x

Новичок
KolyaA
а почему не назвал polu4itZapisi? представь что тебе надо работать с кодом который писал индус
у которого родной язык суахили и такой же подход к именованию как у тебя :D
 
  • Like
Реакции: Dovg

jrip

Новичок
Мне по началу упорно казалось что метод называется getZaipis :D

По-моему в данной ситуации, лучше тогда уж не создавать еще один метод, а после вызова юзать $res[0]
 

KolyaA

Новичок
grigori
Спасибо за ценные сведения.

В родительском классе Model создал такой метод:

PHP:
  public function getZapis()
  {
    $args = func_get_args();
    $res = call_user_func_array(array($this,'getZapisi'),$args);
    return $res[0];
  }
Вроде он работает правильно.

Насчёт использования _call - не дошло, как его можно использовать. Никогда им не пользовался, поэтому не смог схватить на лету.
 

KolyaA

Новичок
По-моему в данной ситуации, лучше тогда уж не создавать еще один метод, а после вызова юзать $res[0]
Раньше так и делал, но подумал, что всё таки удобней и правильней будет сделать две разные функции. Хотя может в этом и не прав.
 

jrip

Новичок
А не проще ли тогда было передавать в метод не набор параметров, а сразу массив с параметрами?
Тогда бы просто получилось вот так:

PHP:
public function getZapis( $args )
  {
    $res = $this->getZapisi( $args );
    return $res[0];
  }
 

KolyaA

Новичок
jrip

Тогда потом будет постоянная возня с созданием этого массива. В общем, весь выигрыш в удобстве потеряется :)
 

jrip

Новичок
Если под удобством подразумевается написать как можно меньше кода, то
getZapisi( array( 10, 'где-то', 'зачем-то') )
не особо отличается от
getZapisi( 10, 'где-то', 'зачем-то' )

а вот
getZapisi( array( 'count'=>10, 'where'=>'где-то', 'ещекакоенибудьосмыссленоеслово'=>'зачем-то' ) )
даст возможность не запоминать порядок параметров, возможность сделать любой параметр по умолчанию и не указывать его в вызове и всякое другое.
 

Adelf

Administrator
Команда форума
jrip
Более того этот код более читаем.
Просто список параметров мало о чем говорит. Именованные параметры могут рассказать почти все.
У него там наверняка критерии отбора.. про патттерн я уже тут говорил.
 

KolyaA

Новичок
а вот
getZapisi( array( 'count'=>10, 'where'=>'где-то', 'ещекакоенибудьосмыссленоеслово'=>'зачем-то' ) )
даст возможность не запоминать порядок параметров, возможность сделать любой параметр по умолчанию и не указывать его в вызове и всякое другое.
Возможно, ты прав.

Я бывает использую такую конструкцию: getZapisi($id = NULL, $whereArray = NULL). Чтобы можно было когда надо как можно проще получить по id, либо когда нужно иметь возможность подробно всё расписать. Но тоже не знаю, насколько правилен такой подход.
 

jrip

Новичок
Этот подход не очень.
Лучше с массивом.
А еще лучше да, почитать про паттерны, жизнь станет намного проще и приятнее.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
grigori
Не все так прозрачно.
Мне показалось, в частности из-за названия функции, что у ТС нечто похожее на паттерн Репозиторий.
В таком случае в функцию нужно передавать некий объект Criteria. В некоторых простых случаях вполне можно заменить ассоциативном массивом.
Ежу понятно, что через пару месяцев ТС откроет для себя Active Record, Table data gateway, Criteria и выкинет этот код.
Но умение писать динамические вызовы ему надо получить на его родном коде.

ТС учится, сам пишет свой код, правильно описал вопрос.
Нельзя освоить Registry или AR, не изучив магию и динамические вызовы, на которых построены все реализации этих ваших шаблонов на php.
У него нет ошибки в генах, ему надо дать ссылку, а не по рукам бить. Мы тут для этого.

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