目录
钥匙要点
>正如我们所看到的,基本方法sayhello()在通过使用语句的A和B类实现的性状中声明。容易,对吧?这个示例确实很短,但是它应该为您提供基本知识来使用特质。
>步骤1:创建实体
文章实体
>注释实体
步骤2:创建特质
>步骤3:重构实体
当前,在Symfony Sphere中,许多捆绑包和扩展往往会坚持这种做事的方式。来自Knplabs的教义Behaviors库为实体和存储库提供了很多特征。在同一心态下,我建议您深入了解众所周知的教义延期捆绑包,尤其是有关时间通知行为扩展的所有内容。
特征并不难吸收。它们是生产更轻,更灵活的代码的绝佳方法。注意不要滥用它们:有时候,最好构建独特的班级实现。我不能足够强调花费足够的时间才能正确设计您的应用是多么重要。如果您认为他们可以帮助您,请试一试。创建您的,测试它们,并告诉我们您如何使用它们!
我可以在单个学说实体中使用多个特征吗?实体。这是通过在类定义中添加多重用法语句来完成的,每个语句随后添加了不同特征的名称。所有特征的方法和属性将在同类中可用。如果不同性状中的方法或属性之间存在命名冲突,则可以使用代替和运算符来解决它。
>
我如何测试使用特征的学说实体?
>我可以在具有Symfony的学说实体中使用特征吗? Symfony的学说整合支持在实体中使用特征。您可以定义自己的特征,在您的实体中使用它们,并在与您的实体合作时会识别并使用它们。
首页 后端开发 php教程 在学说实体中使用特征

在学说实体中使用特征

Feb 19, 2025 am 09:20 AM

在学说实体中使用特征

钥匙要点

    自PHP 5.4.0以来可用的特征,提供了一种通过在另一类中包含一组方法,从而减少代码重复来提供重复使用代码的方法。它们可以与Symfony环境中的学说ORM结合使用。
  • >
  • 特征不应与接口相混淆。界面是说明对象可以做什么的合同,但特征使对象具有执行功能。
  • >
  • 特征在组织数据库体系结构和避免代码重复方面特别有用。例如,当创建需要“ create_at”和“ updated_at”字段的文章和评论实体时,这些常见属性可以包含在特征中以避免重复。
  • >
  • >特征是生产更轻,更灵活的代码的绝佳工具,但不应过度使用它们。有时,构建独特的类实现可能会更好。花费足够的时间正确设计您的应用程序至关重要。
  • 自PHP 5.4.0以来,PHP支持一种精美的方法来重用称为“特征”的代码 - 您可以在另一类中包含的一组方法,以免重复自己。您可以在先前发布的SitePoint帖子中阅读有关特征的更多信息:此处,此处和此处。

今天,我将向您展示如何在符号环境中与学说ORM一起使用。

在学说实体中使用特征特征基础

>正如我们所看到的,基本方法sayhello()在通过使用语句的A和B类实现的性状中声明。容易,对吧?这个示例确实很短,但是它应该为您提供基本知识来使用特质。

>
<span><span><?php
</span></span><span><span>trait ExampleTrait {
</span></span><span>    <span>public function sayHello() {
</span></span><span>        <span>echo "Hello";
</span></span><span>    <span>}
</span></span><span><span>}
</span></span><span>
</span><span><span>class A {
</span></span><span>    <span>use ExampleTrait;
</span></span><span><span>}
</span></span><span>
</span><span><span>class B {
</span></span><span>    <span>use ExampleTrait;
</span></span><span><span>}
</span></span><span>
</span><span><span>$one = new A();
</span></span><span><span>$one->sayHello();    /* return `Hello` */
</span></span><span>
</span><span><span>$two = new B();
</span></span><span><span>$two->sayHello();    /* return `Hello`, too */</span></span>
登录后复制
登录后复制
如果您对特征感兴趣,我建议您在此处和此处阅读官方文档和先前发布的SitePoint帖子,以充分掌握该概念。

请允许我警告您这样一个事实,即许多人倾向于看不到特质和界面之间的区别。这是一个务实的解释:


>接口是一份合同,上面写着“此对象能够做这件事”,而特征使对象具有做事的能力。>

要进行更深入的解释,请随时查看菲利普·布朗(Philip Brown)的这一有见地的帖子,以前的报价来自。

在组织数据库体系结构方面,面对代码重复并不少见。例如,假设我们必须开发通常的博客应用程序。在某个时候,我们可能会创建一个基本文章实体,也可能是一个评论实体。
>两个实体将受益于创建的_at和updated_at字段(因此,我们可以在稍后对这些列进行排序)。但是,在挖掘特征之前,让我们看看我们如何在没有它们的情况下在学说中构建这些实体。

>步骤1:创建实体

文章实体

<span><span><?php
</span></span><span><span>trait ExampleTrait {
</span></span><span>    <span>public function sayHello() {
</span></span><span>        <span>echo "Hello";
</span></span><span>    <span>}
</span></span><span><span>}
</span></span><span>
</span><span><span>class A {
</span></span><span>    <span>use ExampleTrait;
</span></span><span><span>}
</span></span><span>
</span><span><span>class B {
</span></span><span>    <span>use ExampleTrait;
</span></span><span><span>}
</span></span><span>
</span><span><span>$one = new A();
</span></span><span><span>$one->sayHello();    /* return `Hello` */
</span></span><span>
</span><span><span>$two = new B();
</span></span><span><span>$two->sayHello();    /* return `Hello`, too */</span></span>
登录后复制
登录后复制

>注释实体

<span><span><?php
</span></span><span><span>namespace Blog<span>\AppBundle\Entity</span>;
</span></span><span>
</span><span><span>use Doctrine<span>\ORM\Mapping</span> as ORM;
</span></span><span>
</span><span><span>/**
</span></span><span><span> * @ORM\Table(name="article")
</span></span><span><span> * @ORM\Entity(repositoryClass="Blog\AppBundle\Entity\ArticleRepository")
</span></span><span><span> */
</span></span><span><span>class Article
</span></span><span><span>{
</span></span><span>    <span>/**
</span></span><span><span>     * @ORM\Column(name="idArticle" type="integer")
</span></span><span><span>     * @ORM\Id()
</span></span><span><span>     * @ORM\GeneratedValue(strategy="AUTO")
</span></span><span><span>     */
</span></span><span>    <span>private $id;
</span></span><span>
</span><span>    <span>/* Other properties you need in your entity: $title, $content, $author...  */
</span></span><span>
</span><span>    <span>/** @ORM\Column(name="created_at" type="datetime") */
</span></span><span>    <span>private $createdAt;
</span></span><span>
</span><span>    <span>/** @ORM\Column(name="updated_at" type="datetime") */
</span></span><span>    <span>private $updatedAt;
</span></span><span>
</span><span>   <span>/* Getters & Setters */
</span></span><span><span>}</span></span>
登录后复制

>在两个类中都包含相同的属性$创建和$ UPDATAT。这远非干燥。特征可以帮助我们清理此代码吗?

步骤2:创建特质

<span><span><?php
</span></span><span><span>namespace Blog<span>\AppBundle\Entity</span>;
</span></span><span>
</span><span><span>use Doctrine<span>\ORM\Mapping</span> as ORM;
</span></span><span>
</span><span><span>/**
</span></span><span><span> * @ORM\Table(name="comment")
</span></span><span><span> * @ORM\Entity(repositoryClass="Blog\AppBundle\Entity\CommentRepository")
</span></span><span><span> */
</span></span><span><span>class Comment
</span></span><span><span>{
</span></span><span>    <span>/**
</span></span><span><span>     * @ORM\Column(name="idComment" type="integer")
</span></span><span><span>     * @ORM\Id()
</span></span><span><span>     * @ORM\GeneratedValue(strategy="AUTO")
</span></span><span><span>     */
</span></span><span>    <span>private $id;
</span></span><span>
</span><span>    <span>/* Other properties you need in your entity */
</span></span><span>
</span><span>    <span>/** @ORM\Column(name="created_at" type="datetime") */
</span></span><span>    <span>private $createdAt;
</span></span><span>
</span><span>    <span>/** @ORM\Column(name="updated_at" type="datetime") */
</span></span><span>    <span>private $updatedAt;
</span></span><span>
</span><span>    <span>/* Getters & Setters */
</span></span><span><span>}</span></span>
登录后复制

这是一个漂亮的特征文件,我们已经移动了初始重复的代码。 $ CREATTAT和$ UPDATAT以及所有相关方法现在都与实体分开。结果,在其他地方使用它们会更容易。请记住带有关键字使用的介绍部分。

>步骤3:重构实体

文章实体

<span><span><?php
</span></span><span><span>// src/Blog/AppBundle/Entity/Traits/TimestampableTrait.php
</span></span><span>
</span><span><span>namespace Blog<span>\AppBundle\Entity\Traits</span>;
</span></span><span>
</span><span><span>use Doctrine<span>\ORM\Mapping</span> as ORM;
</span></span><span>
</span><span><span>trait TimestampableTrait
</span></span><span><span>{
</span></span><span>    <span>/**
</span></span><span><span>     * <span>@var datetime $createdAt
</span></span></span><span><span>     *
</span></span><span><span>     * @ORM\Column(name="created_at", type="datetime")
</span></span><span><span>     */
</span></span><span>    <span>private $createdAt;
</span></span><span>
</span><span>    <span>/**
</span></span><span><span>     * <span>@var datetime $updatedAt
</span></span></span><span><span>     *
</span></span><span><span>     * @ORM\Column(name="updated_at", type="datetime")
</span></span><span><span>     */
</span></span><span>    <span>private $updatedAt;
</span></span><span>
</span><span>
</span><span>    <span>/**
</span></span><span><span>     * Get createdAt
</span></span><span><span>     *
</span></span><span><span>     * <span>@return datetime
</span></span></span><span><span>     */
</span></span><span>    <span>public function getCreatedAt()
</span></span><span>    <span>{
</span></span><span>        <span>return $this->createdAt;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>/**
</span></span><span><span>     * Set createdAt
</span></span><span><span>     *
</span></span><span><span>     * <span>@param datetime $createdAt
</span></span></span><span><span>     */
</span></span><span>    <span>public function setCreatedAt($createdAt)
</span></span><span>    <span>{
</span></span><span>        <span>$this->createdAt = $createdAt;
</span></span><span>
</span><span>        <span>return $this;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>/**
</span></span><span><span>     * Get updatedAt
</span></span><span><span>     *
</span></span><span><span>     * <span>@return datetime
</span></span></span><span><span>     */
</span></span><span>    <span>public function getUpdatedAt()
</span></span><span>    <span>{
</span></span><span>        <span>return $this->updatedAt;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>/**
</span></span><span><span>     * Set updatedAt
</span></span><span><span>     *
</span></span><span><span>     * <span>@param datetime $updatedAt
</span></span></span><span><span>     */
</span></span><span>    <span>public function setUpdatedAt($updatedAt)
</span></span><span>    <span>{
</span></span><span>        <span>$this->updatedAt = $updatedAt;
</span></span><span>
</span><span>        <span>return $this;
</span></span><span>    <span>}
</span></span><span><span>}</span></span>
登录后复制

>注释实体

<span><span><?php
</span></span><span><span>// src/Blog/AppBundle/Entity/Article.php
</span></span><span>
</span><span><span>namespace Blog<span>\AppBundle\Entity</span>;
</span></span><span>
</span><span><span>use Doctrine<span>\ORM\Mapping</span> as ORM;
</span></span><span><span>use Blog<span>\AppBundle\Entity\Traits\TimestampableTrait</span>;
</span></span><span>
</span><span><span>class Article
</span></span><span><span>{
</span></span><span>    <span>use TimestampableTrait;
</span></span><span>
</span><span>    <span>/**
</span></span><span><span>     * @ORM\Column(name="idArticle" type="integer")
</span></span><span><span>     * @ORM\Id()
</span></span><span><span>     * @ORM\GeneratedValue(strategy="AUTO")
</span></span><span><span>     */
</span></span><span>    <span>private $id;
</span></span><span>
</span><span>    <span>/* Other properties you need in your entity */
</span></span><span>
</span><span>    <span>/* Getters & Setters */
</span></span><span><span>}</span></span>
登录后复制

完成!让我们玩命令行。首先,让我们在数据库中创建实体:

<span><span><?php
</span></span><span><span>// src/Blog/AppBundle/Entity/Comment.php
</span></span><span>
</span><span><span>namespace Blog<span>\AppBundle\Entity</span>;
</span></span><span>
</span><span><span>use Doctrine<span>\ORM\Mapping</span> as ORM;
</span></span><span><span>use Blog<span>\AppBundle\Entity\Traits\TimestampableTrait</span>;
</span></span><span>
</span><span><span>/**
</span></span><span><span> * @ORM\Table(name="comment")
</span></span><span><span> * @ORM\Entity(repositoryClass="Blog\AppBundle\Entity\CommentRepository")
</span></span><span><span> */
</span></span><span><span>class Comment
</span></span><span><span>{
</span></span><span>    <span>use TimestampableTrait;
</span></span><span>
</span><span>    <span>/**
</span></span><span><span>     * @ORM\Column(name="idComment" type="integer")
</span></span><span><span>     * @ORM\Id()
</span></span><span><span>     * @ORM\GeneratedValue(strategy="AUTO")
</span></span><span><span>     */
</span></span><span>    <span>private $id;
</span></span><span>
</span><span>    <span>/* Other properties you need in your entity */
</span></span><span>
</span><span>    <span>/* Getters & Setters */
</span></span><span><span>}</span></span>
登录后复制

此命令将产生:

php app/console doctrine:schema:create
登录后复制

现在,如果要从这些类创建新对象,您会发现它们俩都有可用的常见方法:>

`Article Entity`
	
	| idArticle | *All our other fields...* | created_at | updated_at |
	|-----------|---------------------------|------------|------------|
	
	`Comment Entity`
	
	| idComment | *All our other fields...* | created_at | updated_at |
	|-----------|---------------------------|------------|------------|
登录后复制
显然,我们现在准备持久数据。>

进一步

当前,在Symfony Sphere中,许多捆绑包和扩展往往会坚持这种做事的方式。来自Knplabs的教义Behaviors库为实体和存储库提供了很多特征。在同一心态下,我建议您深入了解众所周知的教义延期捆绑包,尤其是有关时间通知行为扩展的所有内容。

>

最终想法

特征并不难吸收。它们是生产更轻,更灵活的代码的绝佳方法。注意不要滥用它们:有时候,最好构建独特的班级实现。我不能足够强调花费足够的时间才能正确设计您的应用是多么重要。如果您认为他们可以帮助您,请试一试。创建您的,测试它们,并告诉我们您如何使用它们!

>关于在学说实体中使用特征的常见问题(常见问题解答)

>在学说实体中使用特质的好处是什么?>

>我如何在学说实体中使用特征?

在学说实体中使用特质,您首先需要定义特征。这是使用特征关键字完成的,其次是特征的名称和一个包含特征提供的方法和属性的代码块。定义性状后,您可以在类中添加使用语句,然后在特征的名称中添加使用语句来使用它。这将使课程中可用的特征的所有方法和属性。

我可以在单个学说实体中使用多个特征吗?实体。这是通过在类定义中添加多重用法语句来完成的,每个语句随后添加了不同特征的名称。所有特征的方法和属性将在同类中可用。如果不同性状中的方法或属性之间存在命名冲突,则可以使用代替和运算符来解决它。

>

>特征可以注入服务吗?

特征本身不能直接注入服务,因为它们不是类,也不支持构造函数注入。但是,您可以将服务注入使用特征的类。特征的方法然后可以通过课程访问这些服务。

>特征可以覆盖学说实体中的方法吗?通过定义特征中的方法,其名称与类中的方法相同。当在类的对象上调用该方法时,特征中的版本将被代替类中的版本。

>

我可以将特质与继承结合使用吗? ,您可以将特征与继承结合使用。类可以从父班继承,也可以使用一个或多个特征。父类的方法和属性和特质都将在类中可用。如果父母类中的方法或属性之间存在命名冲突,则特征中的版本将被使用。特征为代码重用和灵活性提供了强大的工具,它们也有一些局限性和潜在的缺点。一个限制是,不能自行实例化特征 - 它们只能在班级中使用。同样,如果多个特征定义了具有相同名称的方法,则可能需要手动解决命名冲突。过度使用性状也可能导致难以理解和维护的代码,因此应明智地使用它们。

我如何测试使用特征的学说实体?

>测试使用特征的学说实体类似于测试常规学说实体。您可以创建实例化实体并调用其方法的单元测试,以检查其表现是否如预期。如果特征提供其他方法,则可以以相同的方式测试这些方法。如果特征覆盖了实体中的方法,则应同时测试该方法的原始版本(通过在不使用特征的实体上测试它)和覆盖版本(通过在使用特征的实体上测试它) 。

>我可以在具有Symfony的学说实体中使用特征吗? Symfony的学说整合支持在实体中使用特征。您可以定义自己的特征,在您的实体中使用它们,并在与您的实体合作时会识别并使用它们。

>

我如何调试学说实体中特征的问题?学说实体中的特征类似于调试常规学说实体的问题。您可以使用Xdebug和var_dump()之类的工具来检查实体的状态,并查看它们的方法和属性。如果方法不按预期的方式行事,则可以检查该方法是在实体本身,性状还是在父级中定义的,并相应地调试。

以上是在学说实体中使用特征的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1669
14
CakePHP 教程
1428
52
Laravel 教程
1329
25
PHP教程
1273
29
C# 教程
1256
24
PHP:网络开发的关键语言 PHP:网络开发的关键语言 Apr 13, 2025 am 12:08 AM

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

说明PHP中的安全密码散列(例如,password_hash,password_verify)。为什么不使用MD5或SHA1? 说明PHP中的安全密码散列(例如,password_hash,password_verify)。为什么不使用MD5或SHA1? Apr 17, 2025 am 12:06 AM

在PHP中,应使用password_hash和password_verify函数实现安全的密码哈希处理,不应使用MD5或SHA1。1)password_hash生成包含盐值的哈希,增强安全性。2)password_verify验证密码,通过比较哈希值确保安全。3)MD5和SHA1易受攻击且缺乏盐值,不适合现代密码安全。

PHP和Python:比较两种流行的编程语言 PHP和Python:比较两种流行的编程语言 Apr 14, 2025 am 12:13 AM

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

PHP行动:现实世界中的示例和应用程序 PHP行动:现实世界中的示例和应用程序 Apr 14, 2025 am 12:19 AM

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。

PHP类型提示如何起作用,包括标量类型,返回类型,联合类型和无效类型? PHP类型提示如何起作用,包括标量类型,返回类型,联合类型和无效类型? Apr 17, 2025 am 12:25 AM

PHP类型提示提升代码质量和可读性。1)标量类型提示:自PHP7.0起,允许在函数参数中指定基本数据类型,如int、float等。2)返回类型提示:确保函数返回值类型的一致性。3)联合类型提示:自PHP8.0起,允许在函数参数或返回值中指定多个类型。4)可空类型提示:允许包含null值,处理可能返回空值的函数。

PHP的持久相关性:它还活着吗? PHP的持久相关性:它还活着吗? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在现代编程领域中依然占据重要地位。1)PHP的简单易学和强大社区支持使其在Web开发中广泛应用;2)其灵活性和稳定性使其在处理Web表单、数据库操作和文件处理等方面表现出色;3)PHP不断进化和优化,适用于初学者和经验丰富的开发者。

PHP和Python:解释了不同的范例 PHP和Python:解释了不同的范例 Apr 18, 2025 am 12:26 AM

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

PHP与其他语言:比较 PHP与其他语言:比较 Apr 13, 2025 am 12:19 AM

PHP适合web开发,特别是在快速开发和处理动态内容方面表现出色,但不擅长数据科学和企业级应用。与Python相比,PHP在web开发中更具优势,但在数据科学领域不如Python;与Java相比,PHP在企业级应用中表现较差,但在web开发中更灵活;与JavaScript相比,PHP在后端开发中更简洁,但在前端开发中不如JavaScript。

See all articles