在学说实体中使用特征
钥匙要点
-
自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>
请允许我警告您这样一个事实,即许多人倾向于看不到特质和界面之间的区别。这是一个务实的解释:
>接口是一份合同,上面写着“此对象能够做这件事”,而特征使对象具有做事的能力。
要进行更深入的解释,请随时查看菲利普·布朗(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中文网其他相关文章!

热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

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。1)password_hash生成包含盐值的哈希,增强安全性。2)password_verify验证密码,通过比较哈希值确保安全。3)MD5和SHA1易受攻击且缺乏盐值,不适合现代密码安全。

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

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

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

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

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

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