Добрый день! Опишите пожалуйста подробно зачем мы сюда еще добавили интерфейс, думаю у многих есть вопрос "Зачем тут интерфейс?)) И так же все работает!". Было бы чудесно добавить пример где этот добавленный интерфейс используется и без него никак. Спасибо!
ну ладно вопрос зачем тут добавили, у меня вообще возник вопрос, нафига нужен тот интерфейс?! по факту на сегодняшний урок я вижу большие плюсы в трейтах, а именно написание кучу методов и потом что б все классы черпали их. А вот нафига интерфейс, не знаю. Какой-то дополнительный файл с дублированием методов, пару лишних килобайт добавляет проекту )))
сейчас пообщался со знакомыми и слегка иначе начал думать, не знаю правильно ли, но я так понимаю что когда большой проект, изначально пишется интерфейс ( набор инструкций(методов)), а потом уже при создании классов что б что-то не провтыкать то имплементится интерфейс, правильно я понял?))
Может кому пригодится: класс - машина. ситуация: застряла. методы: "отъехать назад", "ехать вперед". Метод "отъехать назад" реализован через интерфейс. Естественно оба метода находятся в трейтах, так как доступны для всех объектов и других классов похожих на "машину".
И тут как раз включается вся эта логика: если объект класса "машина" реализует интерфейс "отъехать назад", то через трейт используем метод "отъехать назад" и работаем дальше. А если не реализует и метод "ехать вперед" ничего не дает, то выводим сообщение "мы застряли".
Это скорей всего частный случай, и конечно это лично мое понимание этой логики. Возможно не прав. Прошу поправить.
Согласен с вами. В первом уроке вы тоже сравнили понятие класса с реальным миром. Я провел такую же аналогию только чтобы новичкам было проще понять суть связки трейта и интерфейса.
trait MyNewTrait
{
public function SayMeClass(){
return 'Это класс ' . self::class;
}
}
class DayMondey
{
use SayMeClass;
}
$momo1 = new DayMondey();
$momo1->SayMeClass;
get_class() правильнее использовать к переменной, когда вы не знаете класса. Если же класс вам известен, и вам нужно получить в коде его полное имя, используйте ClassName::class
В PHP можно получить имя класса с помощью конструкции ИмяКласса::class
Если используются пространства имен, то нужно же будет еще вычленять имя класса из пространства имен..
2.
$man = new Man();
Вместо этого корректно было бы использовать?:
$man = Man $man;
К переменной $man теперь можно обратиться как к объекту класса Man
3.
Трейт же может кроме методов иметь свойства? Если два трейта используют общие свойства это корректно? Т.е. оба трейта используются в одном и том же классе и используют одни и те же свойства этого класса. Трейты разделены с логической точки зрения.
4.
Если в классе используется композиция, содержащая два объекта: один - экземпляр другого класса с конструктором, свойствами, методами, а другой "объект" - класс без свойств, конструктора, только единственный метод. Логично ли этот второй класс сделать трейтом?
Используя композицию, не обязательно же использовать именно объекты? Можно например передать в свойства просто класс или трейт?
Не нужно ничего вычленять, либо добавляете класс через use, либо пишите с неймспейсом
Я не про то, как добавить "класс в класс", а как получить чистое имя класса, без путей в файловой структуре.
Во всяком случае, у меня например тот же get_class() возвращает весь неймспейс с именем класса в конце.
Откуда такую конструкцию вообще взяли?
Просто так записал изначально в виде "балванки", т.к. объект получать было не из чего. Более того, оно работает без создания объекта и к методам такого внешнего класса можно обращаться через эту переменную.
Или все таки композиция предполагает именно наличие объекта?
Попробуйте, не знаю)
Я конечно ж пробовал - работает, но выглядит это не очень. Даже просто наличие свойств в трейте. Трейты и так ухудшают читаемость кода в принципе, а если туда еще и запихнуть свойства текущего класса - наверное это таки лучше не делать...
Если метод единственный и ни от чего не зависит, то лучше его статическим сделать.
Этот вопрос был к контектсе композиции: Класс, допустим нужно оставить неизменным чтобы не нарушать интерфейс и работать с классом, как и с его "коллегами" через однообразный интерфейс, т.е. добавлять какой-то статический метод в этот класс - не вариант. Тогда, что было бы корректнее использовать в качестве свойства где один единственный метод - Класс с единственным методом без свойств и конструктора или трейт(ведь класс с единственным методом без свойств и конструктора это по сути и есь трейт?)?
Я не про то, как добавить "класс в класс", а как получить чистое имя класса, без путей в файловой структуре.
Так и я вроде как не про добавить "класс в класс". В PHP нельзя определять один класс внутри другого.
$man = Man $man;
Не понимаю, что вы от меня хотите с этой конструкцией) Она бессмысленна на первый взгляд, а на второй взгляд так и есть. Она падает с ошибкой некорректного синтаксиса. Так для чего вы написали нерабочий код и пытаетесь что-то у меня выпытать по поводу того правильно так писать или нет?))
По поводу трейтов я не собираюсь спорить, уж извините. Не хотите - не используйте. Если хотите упороться по этой теме, могу вот этот видос посоветовать)
Класс с единственным методом без свойств и конструктора или трейт(ведь класс с единственным методом без свойств и конструктора это по сути и есь трейт?)?
Так для чего вы написали нерабочий код и пытаетесь что-то у меня выпытать по поводу того правильно так писать или нет?))
Неправильно сюда объявление переменной скопировал))
Хотя и оно таки не работает. Вернее объявить свойство таким образом можно:
public Man $man
Но обратиться к такому свойству не получится, т.к. оно не инициализировано, а инициализировать как раз пришлось бы новым объектом класса Man)
По поводу трейтов я не собираюсь спорить
Я и не спорил. Я спрашиваю, то что пока не знаю или не понимаю. Хотя трейты мне и не нравятся самому. Слишком много "магии", легко запутаться в трех соснах. Но врага нужно знаь в лицо))
Добрый день! Опишите пожалуйста подробно зачем мы сюда еще добавили интерфейс, думаю у многих есть вопрос "Зачем тут интерфейс?)) И так же все работает!". Было бы чудесно добавить пример где этот добавленный интерфейс используется и без него никак. Спасибо!
В дальнейших уроках это будет использоваться, пока просто рассказываю о возможностях языка =)
Понял, благодарю, просто хочется сразу все знать)
Да, ощущение, что нужно использовать или интерфейс или трейт. Пока непонятно зачем использовать оба сразу и какой в этом смысл.
ну ладно вопрос зачем тут добавили, у меня вообще возник вопрос, нафига нужен тот интерфейс?! по факту на сегодняшний урок я вижу большие плюсы в трейтах, а именно написание кучу методов и потом что б все классы черпали их. А вот нафига интерфейс, не знаю. Какой-то дополнительный файл с дублированием методов, пару лишних килобайт добавляет проекту )))
сейчас пообщался со знакомыми и слегка иначе начал думать, не знаю правильно ли, но я так понимаю что когда большой проект, изначально пишется интерфейс ( набор инструкций(методов)), а потом уже при создании классов что б что-то не провтыкать то имплементится интерфейс, правильно я понял?))
Урок про интерфейсы просмотри ещё разок. Если будет непонятно - напиши в личку
Может кому пригодится: класс - машина. ситуация: застряла. методы: "отъехать назад", "ехать вперед". Метод "отъехать назад" реализован через интерфейс. Естественно оба метода находятся в трейтах, так как доступны для всех объектов и других классов похожих на "машину".
И тут как раз включается вся эта логика: если объект класса "машина" реализует интерфейс "отъехать назад", то через трейт используем метод "отъехать назад" и работаем дальше. А если не реализует и метод "ехать вперед" ничего не дает, то выводим сообщение "мы застряли".
Это скорей всего частный случай, и конечно это лично мое понимание этой логики. Возможно не прав. Прошу поправить.
Не люблю абстракции программирования перекладывать на реальный мир. Трейт - это просто кусок кода, который можно использовать в нескольких местах.
Согласен с вами. В первом уроке вы тоже сравнили понятие класса с реальным миром. Я провел такую же аналогию только чтобы новичкам было проще понять суть связки трейта и интерфейса.
Опять получается некий компромис. Вроде создаем определенную зависимость и логику, и тут же трейты - долой ограничения! :)
Не понял, какие ограничения?
Цитирую:
Аа. Ну это не наследование всё же, но неиспользование кода.
Не понимаю, почему выводит ошибку, что упускаю?
В ошибке всё написано. Прочитайте внимательнее.
Ты не используешь трейт.
А трейт у тебя назван..
Чем в данном случае отличается от get_class() ?
get_class() правильнее использовать к переменной, когда вы не знаете класса. Если же класс вам известен, и вам нужно получить в коде его полное имя, используйте ClassName::class
1.
Если используются пространства имен, то нужно же будет еще вычленять имя класса из пространства имен..
2.
Вместо этого корректно было бы использовать?:
К переменной $man теперь можно обратиться как к объекту класса Man
3.
Трейт же может кроме методов иметь свойства? Если два трейта используют общие свойства это корректно? Т.е. оба трейта используются в одном и том же классе и используют одни и те же свойства этого класса. Трейты разделены с логической точки зрения.
4.
Если в классе используется композиция, содержащая два объекта: один - экземпляр другого класса с конструктором, свойствами, методами, а другой "объект" - класс без свойств, конструктора, только единственный метод. Логично ли этот второй класс сделать трейтом?
Используя композицию, не обязательно же использовать именно объекты? Можно например передать в свойства просто класс или трейт?
Я не про то, как добавить "класс в класс", а как получить чистое имя класса, без путей в файловой структуре.
Во всяком случае, у меня например тот же get_class() возвращает весь неймспейс с именем класса в конце.
Просто так записал изначально в виде "балванки", т.к. объект получать было не из чего. Более того, оно работает без создания объекта и к методам такого внешнего класса можно обращаться через эту переменную.
Или все таки композиция предполагает именно наличие объекта?
Я конечно ж пробовал - работает, но выглядит это не очень. Даже просто наличие свойств в трейте. Трейты и так ухудшают читаемость кода в принципе, а если туда еще и запихнуть свойства текущего класса - наверное это таки лучше не делать...
Этот вопрос был к контектсе композиции: Класс, допустим нужно оставить неизменным чтобы не нарушать интерфейс и работать с классом, как и с его "коллегами" через однообразный интерфейс, т.е. добавлять какой-то статический метод в этот класс - не вариант. Тогда, что было бы корректнее использовать в качестве свойства где один единственный метод - Класс с единственным методом без свойств и конструктора или трейт(ведь класс с единственным методом без свойств и конструктора это по сути и есь трейт?)?
Так и я вроде как не про добавить "класс в класс". В PHP нельзя определять один класс внутри другого.
Не понимаю, что вы от меня хотите с этой конструкцией) Она бессмысленна на первый взгляд, а на второй взгляд так и есть. Она падает с ошибкой некорректного синтаксиса. Так для чего вы написали нерабочий код и пытаетесь что-то у меня выпытать по поводу того правильно так писать или нет?))
По поводу трейтов я не собираюсь спорить, уж извините. Не хотите - не используйте. Если хотите упороться по этой теме, могу вот этот видос посоветовать)
Используйте класс
Неправильно сюда объявление переменной скопировал))
Хотя и оно таки не работает. Вернее объявить свойство таким образом можно:
Но обратиться к такому свойству не получится, т.к. оно не инициализировано, а инициализировать как раз пришлось бы новым объектом класса Man)
Я и не спорил. Я спрашиваю, то что пока не знаю или не понимаю. Хотя трейты мне и не нравятся самому. Слишком много "магии", легко запутаться в трех соснах. Но врага нужно знаь в лицо))