> 백엔드 개발 > PHP 튜토리얼 > 교리 단체에서 특성을 사용합니다

교리 단체에서 특성을 사용합니다

Jennifer Aniston
풀어 주다: 2025-02-19 09:20:11
원래의
583명이 탐색했습니다.

교리 단체에서 특성을 사용합니다 키 테이크 아웃

PHP 5.4.0 이후에 사용할 수있는 특성은 다른 클래스 내에 메소드 세트를 포함하여 코드 반복을 줄여 코드를 재사용하는 방법을 제공합니다. 그들은 교체 환경에서 교리 orm과 함께 사용될 수 있습니다.

. 특성은 인터페이스와 혼동되어서는 안됩니다. 인터페이스는 객체가 할 수있는 일을 나타내는 계약이지만, 특성은 물체에 할 수있는 능력을 제공합니다.

특성은 데이터베이스 아키텍처를 구성하고 코드 복제를 피하는 데 특히 유용 할 수 있습니다. 예를 들어, 'create_at'및 'updated_at'필드가 필요한 기사 및 주석 엔티티를 만들 때 이러한 공통 속성은 반복을 피하기 위해 특성에 포함될 수 있습니다.
    . 특성은 더 가볍고 유연한 코드를 생산하기위한 훌륭한 도구이지만 과도하게 사용해서는 안됩니다. 때로는 고유 한 클래스 구현을 구성하는 것이 좋습니다. 응용 프로그램을 올바르게 설계하는 데 충분한 시간이 걸리는 것이 중요합니다.
  • PHP 5.4.0 이후 PHP는 "TRACITS"라는 코드를 재사용하는 예쁜 방법을 지원합니다. 이는 자신을 반복하지 않기 위해 다른 클래스에 포함시킬 수있는 일련의 방법입니다. 이전에 게시 된 itepoint 게시물에서 특성에 대한 자세한 내용을 읽을 수 있습니다.
  • 오늘, 나는 그들이 Symfony 환경에서 교리 orm과 함께 어떻게 사용할 수 있는지 보여 드리겠습니다.
  • 특성 기본
  • 우리가 볼 수 있듯이, 기본 메소드 SayHello ()는 A 및 B 클래스에서 사용 명령문으로 구현 된 특성 내부에서 선언됩니다. 쉽지? 이 예는 실제로 짧지 만 특성으로 작업 할 기본 지식을 제공해야합니다.
  • 특성에 관심이 있다면 공식 문서와 이전에 게시 된 itepoint 게시물을 여기, 여기 및 여기에서 읽어 개념을 완전히 파악하는 것이 좋습니다.
  • 많은 사람들이 특성과 인터페이스의 차이를 보지 않는다는 사실에 대해 경고 할 수 있습니다. 실용적인 설명은 다음과 같습니다
  • 인터페이스는“이 객체 가이 일을 할 수있다”는 계약이며, 특성은 물체에 일을 할 수있는 능력을 제공하는 것입니다.
.

보다 심층적 인 설명을 위해 필립 브라운 (Philip Brown) 의이 통찰력있는 게시물을 자유롭게 살펴보십시오. 데이터베이스 아키텍처를 구성 할 때 코드 복제에 직면하는 것은 드문 일이 아닙니다. 예를 들어, 일반적인 블로그 응용 프로그램을 개발해야한다고 가정 해 봅시다. 어느 시점에서, 우리는 기본 기사 엔티티와 댓글 엔티티를 만들 것입니다.

. 두 엔티티는 모두 생성 된 혜택을 얻을 수 있습니다. 그러나 특성을 파헤 치기 전에, 우리가 그들없이 교리로 그 실체를 어떻게 지을 수 있는지 봅시다. 교리 단체에서 특성을 사용합니다.1 단계 : 엔티티를 만듭니다 기사 엔티티

주석 엔티티

동일한 속성 $ createat 및 $ updatedat가 두 클래스에 모두 포함됩니다. 이것은 건조하지 않습니다. 특성 이이 코드를 청소하는 데 도움이 될까요?

2 단계 : 특성을 만듭니다
<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>
로그인 후 복사
다음은 초기 복제 코드를 이동 한 예쁜 특성 파일입니다. $ createdAt 및 $ updatedat와 모든 관련된 방법은 이제 엔티티와 분리됩니다. 결과적으로 다른 곳에서 사용하는 것이 훨씬 쉽습니다. 키워드 사용이 포함 된 소개 섹션을 기억하십시오. <h3> 3 단계 : 엔티티를 리팩터 </h3> 기사 엔티티 <pre class="brush:php;toolbar:false"><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>
로그인 후 복사

주석 엔티티

완료! 명령 줄을 사용해 봅시다. 먼저 데이터베이스에서 엔티티를 만들어 봅시다 :

<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>
로그인 후 복사
이 명령은 다음과 같습니다

이제이 클래스에서 새 개체를 만들려면 모두 공통 방법을 사용할 수 있음을 알게 될 것입니다.

분명히, 우리는 이제 데이터를 지속 할 준비가되었습니다.

더 나아가 현재, Symfony 구에서 많은 번들과 확장은 이러한 일을하는 방식을 고수하는 경향이 있습니다. Knplabs의 교리 적 비하비어 라이브러리는 엔티티와 리포지토리를위한 훌륭한 특성 모음을 제공합니다. 같은 마음의 상태에서, 나는 당신이 잘 알려진 교리 혁신 번들, 특히 타임 스탬블 동작 확장에 관한 모든 것을 심도있게 보는 것이 좋습니다.

.

최종 생각 특성은 흡수하기가 어렵지 않습니다. 그들은 더 가볍고 유연한 코드를 생산하는 훌륭한 방법입니다. 그들을 남용하지 않도록주의하십시오. 때로는 고유 한 클래스 구현을 구성하는 것이 좋습니다. 앱을 올바르게 디자인하기 위해 충분한 시간을 소비하는 것이 얼마나 중요한지 강조 할 수 없습니다. 그들이 당신을 도울 수 있다고 생각한다면 그들에게 가십시오. 당신의 것을 만들고, 테스트하고 당신이 그들을 어떻게 사용했는지 알려주세요!

교리 단체에서 특성을 사용하는 것에 대한 자주 묻는 질문 (FAQ) 교리 단체에서 특성을 사용하면 어떤 이점이 있습니까?
<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>
로그인 후 복사

교리 단체의 특성은 여러 상속을 지원하지 않는 PHP와 같은 언어로 코드를 재사용하는 방법을 제공합니다. 추가 기능을 제공하기 위해 다른 클래스에 삽입 할 수있는 재사용 가능한 코드 스 니펫을 만들 수 있습니다. 이로 인해 여러 클래스에서 코드를 복제하는 것을 피할 수 있으므로 클리너가 클리너, 유지 관리 가능한 코드로 이어질 수 있습니다. 특성은 또한 사용 된 클래스의 방법을 무시하는 데 사용될 수 있으며, 유연한 방식으로 동작을 수정하기위한 강력한 도구를 제공합니다. 교리 단체에서 특성을 사용하는 방법은 무엇입니까?

교리 실체에서 특성을 사용하려면 먼저 특성을 정의해야합니다. 이것은 특성 키워드를 사용하여 수행되며, 특성의 이름과 특성이 제공하는 메소드 및 속성을 포함하는 코드 블록이 이어집니다. 특성이 정의되면 클래스 정의 안에 사용 명령문을 추가 한 다음 특성 이름을 추가하여 클래스에서 사용할 수 있습니다. 이것은 수업에서 이용 가능한 특성의 모든 방법과 속성을 만들어 줄 것입니다.

단일 교리 실체에서 여러 특성을 사용할 수 있습니까?

예, 단일 교리에서 여러 특성을 사용할 수 있습니다. 실재. 이는 클래스 정의 내부에 여러 사용 문을 추가 한 다음 각 특성의 이름을 추가하여 수행됩니다. 모든 특성의 방법과 속성은 수업에서 사용할 수 있습니다. 다른 특성의 방법이나 속성 사이에 명명 충돌이있는 경우, 대신 대신 및 연산자를 사용하여이를 해결할 수 있습니다.

특성이 서비스를 주입했을 수 있습니까?

특성 자체는 서비스를 직접 주입 할 수 없습니다. , 그들은 클래스가 아니며 생성자 주입을 지원하지 않기 때문에. 그러나 특성을 사용하는 클래스에 서비스를 주입 할 수 있습니다. 특성의 방법은 수업을 통해 이러한 서비스에 액세스 할 수 있습니다.

교리 단체에서 특성을 재정의 할 수 있습니까?

예, 특성은 사용 된 클래스의 방법을 무시할 수 있습니다. 클래스의 메소드와 동일한 이름의 특성에서 메소드를 정의하여 수행됩니다. 클래스의 객체에서 메소드가 호출되면 클래스의 버전 대신 특성의 버전이 사용됩니다.

상속과 함께 특성을 사용할 수 있습니까? , 상속과 함께 특성을 사용할 수 있습니다. 수업은 부모 수업에서 상속받을 수 있으며 하나 이상의 특성을 사용할 수 있습니다. 부모 클래스와 특성의 방법과 속성은 모두 수업에서 사용할 수 있습니다. 부모 클래스와 특성의 방법이나 속성 사이에 명명 충돌이있는 경우 특성의 버전이 사용됩니다.

특성 사용에 대한 제한이나 단점이 있습니까? 특성은 코드 재사용 및 유연성을위한 강력한 도구를 제공하며 몇 가지 제한 사항과 잠재적 단점도 있습니다. 한 가지 제한은 특성을 스스로 인스턴스화 할 수 없다는 것입니다. 클래스 내에서만 사용할 수 있습니다. 또한 여러 특성이 동일한 이름의 메소드를 정의하는 경우 수동으로 해결 해야하는 이름 지정 충돌이있을 수 있습니다. 특성을 과도하게 사용하면 이해하고 유지하기 어려운 코드로 이어질 수 있으므로 신중하게 사용해야합니다.

특성을 사용하는 교리 실체를 어떻게 테스트합니까?

특성을 사용하는 교리 실체를 테스트하는 것은 정기적 인 교리 실체를 테스트하는 것과 유사합니다. 엔티티를 인스턴스화하고 방법을 호출하는 단위 테스트를 생성하여 예상대로 작동하는지 확인할 수 있습니다. 특성이 추가 방법을 제공하는 경우 동일한 방식으로 테스트 할 수 있습니다. 특성이 엔티티의 메소드를 재정의하는 경우 원래 버전의 메소드 버전 (특성을 사용하지 않는 엔티티에서 테스트 함)과 재정의 버전 (특성을 사용하는 엔터티에서 테스트 함)을 테스트해야합니다. .

교리 단체에서 Symfony와 함께 특성을 사용할 수 있습니까?

예, 교리 단체에서 Symfony와 함께 특성을 사용할 수 있습니다. Symfony의 교리 통합은 실체의 특성 사용을 지원합니다. 당신은 당신의 특성을 정의하고, 당신의 엔티티에서 그것들을 사용할 수 있으며, Symfony는 당신의 엔티티와 함께 ​​일할 때 그것을 인식하고 사용할 것입니다.

교리 단체의 특성에 대한 문제를 어떻게 디버그 하는가?

디버깅 문제 교리 단체에 특성이있는 것은 정기적 인 교리 단체와의 디버깅 문제와 유사합니다. XDEBUG 및 VAR_DUMP ()와 같은 도구를 사용하여 엔티티의 상태를 검사하고 어떤 방법과 속성이 있는지 확인할 수 있습니다. 메소드가 예상대로 작동하지 않으면 엔티티 자체, 특성 또는 부모 클래스에서 정의되어 있는지 확인하고 그에 따라 디버그 할 수 있습니다.

위 내용은 교리 단체에서 특성을 사용합니다의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿