search
HomeBackend DevelopmentPHP Tutorial[Modern PHP] Chapter 2 New Features Three Traits

Traits

Many of my PHP developer friends don’t know much about traits, which is a new concept introduced in PHP 5.4.0. Traits look like interfaces but work like classes, so what exactly are they? It's neither.

A trait has partial implementation (such as constants, properties and methods) that can be embedded into one or more actual PHP classes. Traits have two responsibilities: indicating what a class can do (similar to an interface); and providing a modular implementation (similar to a class).

You may already have some understanding of traits in other languages. For example, the functions of Ruby's modules and mixins are very similar to PHP's traits.

Why should we use traits

PHP language uses the classic inheritance model. This means that you start with a common root class that provides the basic implementation. From the root class, more specific classes are created that directly inherit the various implementations of the parent class. This is called an inheritance hierarchy, and many programming languages ​​use this common pattern.

To make it easier to understand, imagine that you travel back in time to high school to study biology. Do you still remember the phylum, order, family, genus and species of the organisms you studied? There are six major realms in total. The realm is derived from the door, the phylum is derived from the class, the class is derived from the order, the order is derived from the family, the family is derived from the genus, and the genus is followed by the species. Each descent down the species hierarchy represents a specific characteristic.

The classic inheritance model works well in most cases. But what if there are two unrelated classes that need to implement similar behavior? For example, one PHP class is called RetailStore, and another PHP class is called Car. They can be said to be two completely unrelated classes, and they cannot share a common parent class in terms of inheritance relationship. However, both classes require the longitude and latitude from the geographic location to display map coordinates.

We created traits to solve this problem. They can inject partial implementation into unrelated classes. Traits also facilitate code reuse.

When I encounter this problem, my first solution (and the worst) is to create a public parent class Geocodable for the RetailStore and Car classes to inherit. This solution is really bad, because forcing two unrelated classes to share a common ancestor looks very awkward in their respective inheritance hierarchies.

My second solution (slightly better) is to create a Geocodable interface that defines what methods are needed to implement geolocation. Both RetialStore and Car classes can implement this Geocodable interface. It is indeed a good solution to allow each class to retain its natural inheritance relationship. But we still need to repeat the definition in the interface in each class, which is not a DRY solution.

DRY is the abbreviation of Do not repeat yourself. As a good programming practice, we should never repeat the same code in multiple places. There cannot be a situation where you have to passively modify the same code in other places because you have changed one piece of code.

My third solution (the best solution) is to construct a Geocodable trait and define and implement related methods in it. I can add Geocodable traits to the RetailStore class and Car class without disrupting the class inheritance hierarchy.

How to construct a trait

The following shows how to define a PHP trait:

<?php trait MyTrait {
    // 此处是trait的具体实现
}

As a good habit, we should do one trait per file, just like the definition of classes and interfaces .

Let’s go back to our Geocodable example to better demonstrate the use of traits. We all know that the RetailStore class and the Car class need to support the geographical positioning function, and we can all agree that inheritance and interfaces are not the best solution. Instead, we construct a Geocodable trait that returns a longitude and latitude coordinate that can be marked on the map. Example 2-12 shows our complete Geocodable trait.

Example 2-12 Definition of Geocodable trait

<span style="font-size:14px;"><?php trait Geocodable {
    /** @var string */
    protected $address;

    /** @var \Geocoder\Geocoder */
    protected $geocoder;

    /** @var \Geocoder\Result\Geocoded */
    protected $geocoderResult;

    public function setGeocoder(\Geocoder\GeocoderInterface $geocoder)
    {
        $this->geocoder = $geocoder;
    }

    public function setAddress($address)
    {
        $this->address = $address;
    }

    public function getLatitude()
    {
        if (isset($this->geocoderResult) === false) {
            $this->geocodeAddress();
        }

        return $this->geocoderResult->getLatitude();
    }

    public function getLongitude()
    {
        if (isset($this->geocoderResult) === false) {
            $this->geocodeAddress();
        }

        return $this->geocoderResult->getLongitude();
    }

    protected function geocodeAddress()
    {
        $this->geocoderResult = $this->geocoder->geocode($this->address);

        return true;
    }
}</span>

Geocodable trait only defines the properties and methods required to implement the geographical location function without any additional functions.

Our Geocodable trait defines properties of three classes:

To be continued...

The above introduces [Modern PHP] Chapter 2 New Features Three Traits, including aspects of the content. I hope it will be helpful to friends who are interested in PHP tutorials.

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
PHP trait DTO:简化数据传输对象的开发PHP trait DTO:简化数据传输对象的开发Oct 12, 2023 am 09:04 AM

PHPtraitDTO:简化数据传输对象的开发引言:在现代的软件开发中,数据传输对象(DataTransferObject,简称DTO)起到了重要的作用。DTO是一种纯粹的数据容器,用于在层与层之间传递数据。然而,在开发过程中,开发人员需要编写大量的相似的代码来定义和操作DTO。为了简化这一过程,PHP中引入了trait特性,我们可以利用trait特

深入了解PHP trait DTO的设计模式与实践深入了解PHP trait DTO的设计模式与实践Oct 12, 2023 am 08:48 AM

深入了解PHPtraitDTO的设计模式与实践Introduction:在PHP开发中,设计模式是必不可少的一部分。其中,DTO(DataTransferObject)是一种常用的设计模式,用于封装数据传输的对象。而在实现DTO的过程中,使用trait(特征)可以有效地提高代码的复用性和灵活性。本文将深入探讨PHP中traitDTO的设计模式与实践

PHP trait DTO:实现数据传输对象的简洁性与灵活性PHP trait DTO:实现数据传输对象的简洁性与灵活性Oct 12, 2023 am 10:21 AM

PHPtraitDTO:实现数据传输对象的简洁性与灵活性引言:在PHP开发过程中,经常会涉及到数据的传输与处理。而传输对象模式(DataTransferObject,简称DTO)是一种设计模式,它用于将数据在不同层之间传输。在传输过程中,DTO通过封装数据、提供公共访问方法来简化数据的操作。本文将介绍如何使用PHPtrait来实现DT

PHP trait DTO:优化数据传输过程的关键利器PHP trait DTO:优化数据传输过程的关键利器Oct 12, 2023 pm 03:10 PM

PHPtraitDTO:优化数据传输过程的关键利器,需要具体代码示例简介:在开发过程中,数据传输是一个非常常见的需求,尤其是在不同层级之间传递数据时。在传输这些数据过程中,我们常常需要对数据进行处理、验证或者转换,以满足不同的业务需求。为了提高代码的可读性和可维护性,我们可以使用PHPtraitDTO(DataTransferObject)来优化

使用PHP trait DTO实现高度可定制的数据传输框架使用PHP trait DTO实现高度可定制的数据传输框架Oct 12, 2023 pm 12:46 PM

使用PHPtraitDTO实现高度可定制的数据传输框架随着网站和应用程序变得越来越复杂,数据传输变得越来越重要。在PHP中,通过使用数据传输对象(DataTransferObject,简称DTO)来处理数据传输可以大大简化代码,并提高可维护性和扩展性。本文将介绍如何使用PHPtrait和DTO实现一个高度可定制的数据传输框架,并提供相应的代码示例。

PHP trait DTO:优化数据传输流程的关键工具PHP trait DTO:优化数据传输流程的关键工具Oct 12, 2023 am 09:27 AM

PHPtraitDTO:优化数据传输流程的关键工具,需要具体代码示例在开发过程中,数据的传输是一个十分关键的环节。如何高效地传输数据,成为了开发者们需要解决的难题之一。PHP语言中,使用traitDTO(DataTransferObject)可以优化数据传输流程,提高数据传输的效率。本文将介绍什么是traitDTO,以及如何使用它来优化数据传输流

利用PHP trait DTO构建可测试的数据传输层利用PHP trait DTO构建可测试的数据传输层Oct 12, 2023 am 11:16 AM

标题:利用PHPtraitDTO构建可测试的数据传输层在开发过程中,数据传输对象(DataTransferObject,DTO)是一个常见的设计模式,它可以在不同层之间传输数据。利用PHPtraitDTO可以更方便地构建可测试的数据传输层。本文将介绍DTO的概念以及如何使用PHPtrait构建可测试的数据传输层,并提供代码示例。一、什么是数据传

如何使用 trait 扩展自定义 PHP 函数?如何使用 trait 扩展自定义 PHP 函数?Apr 23, 2024 am 09:27 AM

如何使用trait扩展自定义PHP函数?定义一个包含扩展方法的trait。使用use关键字将trait包含到自定义函数中。在自定义函数中通过$this访问trait方法。

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

EditPlus Chinese cracked version

EditPlus Chinese cracked version

Small size, syntax highlighting, does not support code prompt function

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),