К этому посту больше нельзя оставлять новые комментарии
DmitryGavrilov 21.09.2018 в 13:58

Добрый день! Опишите пожалуйста подробно зачем мы сюда еще добавили интерфейс, думаю у многих есть вопрос "Зачем тут интерфейс?)) И так же все работает!". Было бы чудесно добавить пример где этот добавленный интерфейс используется и без него никак. Спасибо!

ivashkevich 22.09.2018 в 20:35

В дальнейших уроках это будет использоваться, пока просто рассказываю о возможностях языка =)

DmitryGavrilov 22.09.2018 в 22:50

Понял, благодарю, просто хочется сразу все знать)

Fornit 08.04.2020 в 23:11

Да, ощущение, что нужно использовать или интерфейс или трейт. Пока непонятно зачем использовать оба сразу и какой в этом смысл.

Bogdan 05.01.2019 в 13:28

ну ладно вопрос зачем тут добавили, у меня вообще возник вопрос, нафига нужен тот интерфейс?! по факту на сегодняшний урок я вижу большие плюсы в трейтах, а именно написание кучу методов и потом что б все классы черпали их. А вот нафига интерфейс, не знаю. Какой-то дополнительный файл с дублированием методов, пару лишних килобайт добавляет проекту )))

Bogdan 05.01.2019 в 13:55

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

ivashkevich 05.01.2019 в 21:12

Урок про интерфейсы просмотри ещё разок. Если будет непонятно - напиши в личку

vtolstov 16.09.2019 в 12:49

Может кому пригодится: класс - машина. ситуация: застряла. методы: "отъехать назад", "ехать вперед". Метод "отъехать назад" реализован через интерфейс. Естественно оба метода находятся в трейтах, так как доступны для всех объектов и других классов похожих на "машину".
И тут как раз включается вся эта логика: если объект класса "машина" реализует интерфейс "отъехать назад", то через трейт используем метод "отъехать назад" и работаем дальше. А если не реализует и метод "ехать вперед" ничего не дает, то выводим сообщение "мы застряли".
Это скорей всего частный случай, и конечно это лично мое понимание этой логики. Возможно не прав. Прошу поправить.

ivashkevich 16.09.2019 в 18:48

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

vtolstov 17.09.2019 в 05:39

Согласен с вами. В первом уроке вы тоже сравнили понятие класса с реальным миром. Я провел такую же аналогию только чтобы новичкам было проще понять суть связки трейта и интерфейса.

iluha22 18.10.2019 в 10:29

Опять получается некий компромис. Вроде создаем определенную зависимость и логику, и тут же трейты - долой ограничения! :)

ivashkevich 18.10.2019 в 10:46

Не понял, какие ограничения?

iluha22 18.10.2019 в 11:15

Цитирую:

В PHP класс может наследоваться только от одного класса, помните?
Так вот с помощью интерфейсов и трейтов мы можем это ограничение немного обойти.

ivashkevich 18.10.2019 в 12:31

Аа. Ну это не наследование всё же, но неиспользование кода.

[email protected] 20.01.2020 в 21:15

Не понимаю, почему выводит ошибку, что упускаю?


trait MyNewTrait
{
    public function SayMeClass(){
        return 'Это класс ' . self::class;
    }
}

class DayMondey
{
use SayMeClass;
}

$momo1 = new DayMondey();

$momo1->SayMeClass;
ivashkevich 21.01.2020 в 06:54

В ошибке всё написано. Прочитайте внимательнее.

XXX 22.01.2020 в 19:58

Ты не используешь трейт.

use SayMeClass;

А трейт у тебя назван..

trait MyNewTrait
XXX 22.01.2020 в 19:59
$momo1->SayMeClass;
$momo1->SayMeClass();
OneMoreTime 16.02.2020 в 14:25

В PHP можно получить имя класса с помощью конструкции ИмяКласса::class.

Чем в данном случае отличается от get_class() ?

ivashkevich 18.02.2020 в 18:17

get_class() правильнее использовать к переменной, когда вы не знаете класса. Если же класс вам известен, и вам нужно получить в коде его полное имя, используйте ClassName::class

OneMoreTime 28.12.2020 в 13:09

1.

В PHP можно получить имя класса с помощью конструкции ИмяКласса::class

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

2.

$man = new Man();

Вместо этого корректно было бы использовать?:

$man = Man $man;

К переменной $man теперь можно обратиться как к объекту класса Man

3.
Трейт же может кроме методов иметь свойства? Если два трейта используют общие свойства это корректно? Т.е. оба трейта используются в одном и том же классе и используют одни и те же свойства этого класса. Трейты разделены с логической точки зрения.

4.
Если в классе используется композиция, содержащая два объекта: один - экземпляр другого класса с конструктором, свойствами, методами, а другой "объект" - класс без свойств, конструктора, только единственный метод. Логично ли этот второй класс сделать трейтом?
Используя композицию, не обязательно же использовать именно объекты? Можно например передать в свойства просто класс или трейт?

ivashkevich 29.12.2020 в 19:31
  1. Не нужно ничего вычленять, либо добавляете класс через use, либо пишите с неймспейсом
  2. Нет. Откуда такую конструкцию вообще взяли?
  3. Да, может. Попробуйте, не знаю)
  4. Если метод единственный и ни от чего не зависит, то лучше его статическим сделать.
OneMoreTime 29.12.2020 в 22:55

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

Я не про то, как добавить "класс в класс", а как получить чистое имя класса, без путей в файловой структуре.
Во всяком случае, у меня например тот же get_class() возвращает весь неймспейс с именем класса в конце.

Откуда такую конструкцию вообще взяли?

Просто так записал изначально в виде "балванки", т.к. объект получать было не из чего. Более того, оно работает без создания объекта и к методам такого внешнего класса можно обращаться через эту переменную.
Или все таки композиция предполагает именно наличие объекта?

Попробуйте, не знаю)

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

Если метод единственный и ни от чего не зависит, то лучше его статическим сделать.

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

ivashkevich 04.01.2021 в 06:50

Я не про то, как добавить "класс в класс", а как получить чистое имя класса, без путей в файловой структуре.

Так и я вроде как не про добавить "класс в класс". В PHP нельзя определять один класс внутри другого.

$man = Man $man;

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

По поводу трейтов я не собираюсь спорить, уж извините. Не хотите - не используйте. Если хотите упороться по этой теме, могу вот этот видос посоветовать)

Класс с единственным методом без свойств и конструктора или трейт(ведь класс с единственным методом без свойств и конструктора это по сути и есь трейт?)?

Используйте класс

OneMoreTime 05.01.2021 в 01:45

Так для чего вы написали нерабочий код и пытаетесь что-то у меня выпытать по поводу того правильно так писать или нет?))

Неправильно сюда объявление переменной скопировал))
Хотя и оно таки не работает. Вернее объявить свойство таким образом можно:

public Man $man

Но обратиться к такому свойству не получится, т.к. оно не инициализировано, а инициализировать как раз пришлось бы новым объектом класса Man)

По поводу трейтов я не собираюсь спорить

Я и не спорил. Я спрашиваю, то что пока не знаю или не понимаю. Хотя трейты мне и не нравятся самому. Слишком много "магии", легко запутаться в трех соснах. Но врага нужно знаь в лицо))

Логические задачи с собеседований