Современные новые функции PHP серии (три) - Тр Обзор

     Черта новая концепция введена в PHP 5.4, интерфейс выглядит как класс, как и, на самом деле не так, Черта может рассматриваться как часть реализации класса, могут быть смешаны с одним или более существующих PHP класса, его роль двояка: что показывает, что класс может сделать, обеспечить модульную реализацию. Тре является кодовым мультиплексированием, обеспечивает гибкий механизм для повторного использования кода одиночного наследования ограничения РНР.

Почему Тр

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

     Черта является решение этой проблемы на свет. Уточнение в состоянии привнести множество модульных реализации независимых классов, тем самым улучшая повторное использование кода, DRY соответствия (не повторяться) принцип. Например Laravel , лежащая в основе логики и аутентификацию пользователя , связанную с мягким удалением достижения других мест использовала Черту достичь. Laravel приходит AuthController, например, один из входа, регистрации и отказа Войти попытки достигаются с помощью Trait:

     

Как создать Черту

     Создание Черта проста, создать класс с несколько похожи, за исключением того, что ключевое слово используется traitвместо class, приведенном выше ThrottlesLoginпримере:

     

     Мы traitзаявляем , что определение Trait, то мы, как классы определяют свойства и методы , которые будут использоваться в этом Trait в.

     Далее Тре Уплотненный и комбинации, т.е. объединены в Тре Trait одним или несколькими (расположено множество разделов), например , как AuthenticatesAndRegistersUsersэто имеет место:

     

     使用多个Trait可能会引起命名冲突问题,上面的代码给出了解决方案:使用insteadof关键字,如果AuthenticatesUsersRegistersUsers中都定义了redirectPathgetGuard方法,那么将从AuthenticatesUsers中获取对应方法而不是RegistersUsers。另外还可以使用as关键字为方法起个别名,这样也可以避免命名冲突。

     此外,这里可能没有完整列出,Trait中还支持定义抽象方法和静态方法,其中抽象方法必须在使用它的类中实现。

     这里还需要声明的一点是调用方法的优先级:调用类>Trait>父类(如果有的话),方法可以覆盖,但属性不行,如果Trait中定义了一个属性,如果调用类中也定义这个属性则会报错。

如何使用Trait

     Trait的使用方法也很简单,上面已经显示的很清楚明了,即使用use关键字。

     可能你已经注意到,命名空间和Trait使用的都是use关键字,不同之处在于导入位置,命名空间在类的定义体外导入,而Trait在类的定义体内导入。

注:PHP解释器在编译时会把Trait复制到类的定义体中,但是不会处理这个操作引入的不兼容问题,如果Trait假定类中有特定的属性或方法,需要先确保类中确实有相应的属性或方法。

 

рекомендация

отwww.cnblogs.com/mzhaox/p/11222199.html