За последние 24 часа нас посетили 16687 программистов и 1621 робот. Сейчас ищут 1447 программистов ...

Вагон функций - куда его деть?

Тема в разделе "Прочие вопросы по PHP", создана пользователем SeApps, 4 сен 2018.

  1. SeApps

    SeApps Новичок

    С нами с:
    3 апр 2018
    Сообщения:
    27
    Симпатии:
    1
    Суть проблемы
    Я пишу движок на PHP в ООП стиле.
    У меня есть файл с функциями.
    Но когда я пытаюсь написать функции для уже созданных объектов, начинаются проблемы.(Невозможность употребить $this и т.д)
    Можно сделать файл с функциями классом и наследовать от него, но это как-то не в стиле ооп...

    Возникает вопрос:

    Есть в php какое-то решение этого вопроса?
    Или придётся все-таки наследовать класс с функциями?
     
  2. villiwalla

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

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Ну вообще никак не ООП и полиморфизм и инкупсуляция тоже не разу не в ООП
     
    yanuzay нравится это.
  3. SeApps

    SeApps Новичок

    С нами с:
    3 апр 2018
    Сообщения:
    27
    Симпатии:
    1
    А что, очень по-объектовски делать один огромный класс и нагружать его функциями?)
    Я серьезно. Это правильный вариант или есть лучше? Потому что я пока что придумал разделить функционал - функции для моделей - в main модель, функции для контроллеров - в main контроллер...

    И тут еще одна проблемка, не по теме
    Как сделать так:
    callFunction(arg1, $this -> func2(arg1, arg2)); ?
     
    #3 SeApps, 4 сен 2018
    Последнее редактирование: 4 сен 2018
  4. villiwalla

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

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Наследование просто так включили?
    call_user_func_array()
     
  5. SeApps

    SeApps Новичок

    С нами с:
    3 апр 2018
    Сообщения:
    27
    Симпатии:
    1
    call_user_func_array() требует название объекта, а мне нужно чтоб функция вызывалась по $this, и при этом в неё передавались 2 параметра(call_user_func() не подходит)
    --- Добавлено ---
    А, проблема не в этом
     
  6. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    проблема в том, что у вас нет ООП, а просто функции завёрнутые в классы.
     
  7. villiwalla

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

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Ты контекст его понимаешь?
     
  8. SeApps

    SeApps Новичок

    С нами с:
    3 апр 2018
    Сообщения:
    27
    Симпатии:
    1
    Указать внутри класса на сущность класса. Так?

    Если у меня будет нагруженный функциями контроллер, я смогу наследовать его функции в дочерних контроллерах. Но имени объекта класса я знать не хочу и не буду, это неправильно, мне кажется - обращаться изнутри по имени.
    Но проблема не в этом - можно сделать, скажем, так - call_user_func_array($this -> func()), проблема в том, что кроме этого массива, у меня большая функция принимает на вход еще несколько параметров. Через array не получается.
     
  9. villiwalla

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

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    А к объекту ты как собираешься обращаться?
    Документацию мы читать не ходит или не можем?

    Покажи свой код, а то функции в классе это что-то новое.
     
  10. SeApps

    SeApps Новичок

    С нами с:
    3 апр 2018
    Сообщения:
    27
    Симпатии:
    1
    Там он большой, вкратце:
    Есть одна точка входа(index). В зависимости от url первого порядка(/here), она подключает нужный контроллер, который наследуется от базового контроллера, и вызывает его функцию route.
    Функция route смотрит на url второго порядка(/some/here) и вызывает определённую функцию, которая, в свою очередь, вызывает вьюху и обрабатывает пользовательские данные.
    Не надо гневно писать про моё видение MVC, я прекрасно понимаю, что я начинающий студент.

    Не получается как там.
    Кстати, там есть более логичный, на мой взгляд, метод.
    $func = function(){
    //code
    }
     
  11. villiwalla

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

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Ладно, функция это () а значит:
    PHP:
    1. $str = 'showPage';
    2. echo $this ->{$str}(); //call
    Тут дело не в том как ты видишь его, а в том что роутинг у тебя разбит, часть на точке входа лежит где должна быть инициализация, а часть на контроллере.
     
    #11 villiwalla, 5 сен 2018
    Последнее редактирование: 5 сен 2018
  12. SeApps

    SeApps Новичок

    С нами с:
    3 апр 2018
    Сообщения:
    27
    Симпатии:
    1
    Ну, я понимаю, а чем плохо то, что у меня контроллер выполняет много обязанностей?
    Каждый контроллер - это новый функционал.
    И в целях модульности я не вижу смысла хранить все роуты дальше первого порядка в index. Если я не прав, критикуйте) я всегда за.
    --- Добавлено ---
     
  13. villiwalla

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

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Главное слово модуль. Его не размазывают по всему коду. Решение такого подхода это декомпозиция. Каждый класс, медот в классе, функция в процедурке должна выполнять равно одну конкретную задачу.

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

    {} Читать удобней, литералы они вообще ничто по сути дела.